封装
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(int,int);
int add(int,int,int);
// 或者
// 参数类型不同
int add(int,int);
int add(double, double);
注意:在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