java继承实例详解。如何通过实例来了解java的继承关系?java基础知识讲解。
public class Class1 {
public void fun1(){
System.out.println(“111111111111111111111111″);
}
}
public class Class2 extends Class1{
public static void main(String[] args) {
Class2 obj1 = new Class2();
obj1.fun1();
Class1 obj2 = new Class2();
obj2.fun1();
Class1 obj3 = new Class1();
obj3.fun1();
}
public void fun1(){
System.out.println(“222222222222222222222222222″);
}
}
输出的结果:
222222222222222222222222222
222222222222222222222222222
111111111111111111111111
由此说明,只要子类覆盖了父类的方法,如果初始化子类对象,会调用覆盖后的方法。例如obj1和obj2,都是子类的对象。
而obj3是父类的对象,跟子类没有关系,所以调用的是覆盖前的方法。
public class Class1 {
public void fun1(){
System.out.println(“111111111111111111111111″);
}
}
public class Class2 extends Class1{
public static void main(String[] args) {
Class2 obj1 = new Class2();
obj1.fun1();
}
static class A extends Class1{
public void fun1(){
System.out.println(“222222222222222222222222222″);
}
}
}
显然,这儿的A类跟Class2类是毫无关系的,在A里面覆盖了父类方法,跟Class2没有关系。所以虽然声明了一个Class2的对象,调用的仍然是覆盖前的方法。
若改成了这样:
public class Class2 extends Class1{
public static void main(String[] args) {
A a = new A();
a.fun1();
}
static class A extends Class1{
public void fun1(){
System.out.println(“222222222222222222222222222″);
}
}
}
此时才会调用覆盖后的方法,因为我们声明了一个A类的对象,A类里面覆盖了fun1()
public class Class2 extends Class1{
public Class2(Class1 c1){
c1.fun1();
}
public static void main(String[] args) {
Class2 obj1 = new Class2(new Class1(){
public void fun1(){
System.out.println(“222222222222222222222222222″);
}
});
obj1.fun1();
}
}
输出:
222222222222222222222222222
111111111111111111111111
因为,new Class2的时候需要一个Class1的对象,这个对象是一个被覆盖了fun1()的类初始化产生的,所以在Class2的构造函数里面,这个对象会调用覆盖后的方法。而这个覆盖后的方法仅仅属于new Class1()这个对象,不属于Class2这个类,所以,用new Class2声明的对象不会调用覆盖后的方法。