继承、方法覆盖、父子类属性引用相关问题

来源:互联网 发布:数据机房综合布线 编辑:程序博客网 时间:2024/06/05 02:22

public class ExtendsDemo {
     public static void main(String[] args) {
          SubClass sub = new SubClass();
          System.out.println("\n=================================\n");
          SuperClass su = new SuperClass(99, 99);
     }
}

/**
* 静态代码块—>非静态代码块—>初始化成员变量—>[父类的构造方法]—>构造方法
* 子类在调用父类构造方法时,整个过程中的this(Class实例)都是指向子类(包括父类的成员变量中的this)
*
* @author XuJinnan
*
*/
class SuperClass{
     int a=1;
     int b=1;
     Foo foo = new Foo("SuperClass", this);
     public SuperClass(int a,int b){
          //this.b=b;
          this.test();
          //this.getClass()得到子类的Class实例,this.属性得到父类的属性
          System.out.println("SuperClass Constructor's object:"+this.getClass().getSimpleName()+"\tthis.b:"+this.b);
     }
     public void test(){
          System.out.println("SuperClass's test a:"+a+"\tSuperClass's test b:"+b);
     }
}
class SubClass extends SuperClass{
     int b=2;
     private Foo foo = new Foo("SubClass", this);
     public SubClass(){
          super(4,5);
     }
     public void test(){
          System.out.println("SubClass'test a:"+a+"\tSubClass'test b:"+b+"\t");
     }
}

class Foo{
     public Foo(String str, Object obj){
          System.out.println(str+"类的Foo成员变量:this为"+obj.getClass().getSimpleName());
     }
}

输出:
SuperClass类的Foo成员变量:this为SubClass
SubClass'test a:1  SubClass'test b:0  
SuperClass Constructor's object:SubClass   this.b:1
SubClass类的Foo成员变量:this为SubClass

=================================

SuperClass类的Foo成员变量:this为SuperClass
SuperClass's test a:1   SuperClass's test b:1
SuperClass Constructor's object:SuperClass this.b:1



实例2
public class Test {
     public static void main(String[] args) {
          Foos foo = new Bar();
          foo.addFive();
          System.out.println("foo Value: " + foo.a);
          Bar bar = (Bar)foo;
          System.out.println("bar Value: " + bar.a);
          /*
          * SubClass addFive() //调用的是子类的方法(父类方法被覆盖),子类的a属性值已变化
          * foo Value: 3 //父类引用类型的实例,无法引用到子类的同名属性
          * bar Value: 13 //强转后可以得到子类的属性引用,其值是一直存在于内存中的,就是说,堆中有两个a属性,一个是父类的,一个是子类的
          */

     }
}

class Foos {
     public int a;
     public Foos() {
          a = 3;
     }
     public void addFive() {
          a += 5;
          System.out.println("SuperClass addFive()");
     }
}

class Bar extends Foos {
     public int a;
     public Bar() {
          a = 8;
          System.out.println("SubClass addFive()");
     }
     public void addFive() {
          this.a += 5;
     }
}


0 0
原创粉丝点击