java继承实例详解



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声明的对象不会调用覆盖后的方法。