欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

封装、继承、多态

程序员文章站 2024-03-16 23:18:04
...

封装

Bean 对象的权限控制,对数据的设置和获取进行有效控制。

继承

一个对象获取父对象的所有属性和行为。

  • 为什么在Java中不支持多重继承?

    为了降低复杂性并简化语言,Java中不支持多重继承。想象一个:A,B和C是三个类。 C类继承A和B类。 如果A和B类有相同的方法,并且从子类对象调用它,A或B类的调用方法会有歧义。

    因为编译时错误比运行时错误好,如果继承2个类,java会在编译时报告错误。 所以无论子类中是否有相同的方法,都会有报告编译时错误。

多态

运行时多态性

运行时多态性或动态方法分派是一个过程,它对重写方法的调用在运行时体现。
在此过程中,通过超类的引用变量调用重写的方法。 要调用的方法基于引用的对象。

方法重写
有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写(覆盖)。

  • example:
    Bike和Splendar。 Splendar类 extends Bike类 并覆盖其 run() 方法。通过父类(Bike)的引用变量调用run方法。 因为它引用子类对象,并且子类方法覆盖父类方法,子类方法在运行时被调用。

    因为方法调用是由JVM不是编译器决定的,所以它被称为运行时多态性。

  • 数据成员
    运行时多态性不能由数据成员实现
    父子两个类都有一个数据成员:speedlimit,通过引用子类对象的父类的引用变量来访问数据成员。 由于我们访问的数据成员没有被重写,因此它将访问父类的数据成员。

class Bike {
    int speedlimit = 90;
}

class Honda3 extends Bike {
    int speedlimit = 150;

    public static void main(String args[]){  
        Bike obj=new Honda3();  
        System.out.println(obj.speedlimit);//90 
    }
}
  • 可以覆盖静态方法吗?
    答: 这是不可以的,静态方法不能被覆盖。可以通过运行时多态来证明不能覆盖,在稍后章节中将学习它。

  • 为什么不能覆盖静态方法?
    答: 因为静态方法是绑定类,而实例方法绑定对象。 静态属于类区域,实例属于堆区域。

  • 可以重写java main方法吗?
    答: 这是不可以的,因为main是一个静态方法。

编译时多态性

方法重载
如果一个类中有多个具有相同名称但参数不同的方法,则称为方法重载。

// 参数数量不同
int add(intint);
int add(intintint);

// 或者
// 参数类型不同
int add(intint);
int add(doubledouble);

注意:在java中,只通过更改方法的返回类型来实现方法重载是不可以的。

  • 为什么方法重载不能通过更改方法的返回类型?
    编译时错误优于运行时错误。

  • 可以重载java main()方法吗?
    这是完全可以的。 可以通过方法重载在类中有任意数量的main方法。 但是JVM调用main()方法,它只接收字符串数组作为参数。

class TestOverloading4{  
    public static void main(String[] args){System.out.println("main with String[]");}  
    public static void main(String args){System.out.println("main with String");}  
    public static void main(){System.out.println("main without args");}  
}

// main with String[]

方法重载和方法重写区别

封装、继承、多态

Reference

http://www.yiibai.com/java/encapsulation.html
http://www.yiibai.com/java/inheritance-in-java.html
http://www.yiibai.com/java/runtime-polymorphism-in-java.html
http://www.yiibai.com/java/method-overriding-in-java.html
http://www.yiibai.com/java/method-overloading-in-java.html
http://www.yiibai.com/java/method-overloading-vs-method-overriding-in-java.html