子类父类方法与属性的调用(3)

来源:互联网 发布:mac版微信备份在哪里 编辑:程序博客网 时间:2024/04/28 04:26

 package com.me;

public class Books {
String name="super name";
static String age="super age";
public Books(){
 System.out.println("super 构造方法");
 System.out.println(this.name);
 System.out.println(name);
 System.out.println(age);
 System.out.println("^^^^^^^^^^^^^^^^^^^^^^^");
(1) this.show1();
 
}
public void show1(){
 System.out.println("super common show1"); 
 System.out.println(this.name);
 System.out.println(name);
 System.out.println(this.age);
 System.out.println(age);
}

}

package com.me;

public class Book extends Books {
 String name="sub name";
 static String age="sub age";
(3) public Book(){
  System.out.println("sub 构造方法");
  System.out.println(this.name);
  System.out.println(name);
  System.out.println(age);
  System.out.println("book构造方法内@@@@@@@@@@@");
(2)  this.show1();
  
 }
 public void show1(){
  System.out.println("sub common show1");
  System.out.println(this.name);
  System.out.println(name);
  System.out.println(this.age);
  System.out.println(age);
 }
 public static void main(String args[]){
  System.out.println("bs构造方法:");
  Books bs=new Book();
  System.out.println("bs构造方法结束");
  System.out.println();
  System.out.println("b的构造方法");
  Book b=new Book();
  System.out.println("b的构造方法结束");
  
  
 }
}

结果:
bs构造方法:
super 构造方法
super name
super name
super age
^^^^^^^^^^^^^^^^^^^^^^^
sub common show1
null
null
sub age
sub age
sub 构造方法
sub name
sub name
sub age
book构造方法内@@@@@@@@@@@
sub common show1
sub name
sub name
sub age
sub age
bs构造方法结束

b的构造方法
super 构造方法
super name
super name
super age
^^^^^^^^^^^^^^^^^^^^^^^
sub common show1
(4) null
(5) null
sub age
sub age
sub 构造方法
sub name
sub name
sub age
book构造方法内@@@@@@@@@@@
sub common show1
sub name
sub name
sub age
sub age
b的构造方法结束


总结:
Books bs=new Book();
当执行到父类的构造方法(1)处时调用子类的show1;
show1方法里name打印的是null,此时还未执行子类的
构造方法,子类中的成员变量name还未初始化因此
此时打印的是null,但类变量age可以正确打印sub age,
当执行完show1后再去初始化子类此时执行(2)时可正
确打印name,age

Book b=new Book();
和上面的分析差不多,但是我们现在要思考的是我们在同一个类
中先定义了一个bs(Books bs=new Book();)对象,初始化过程中
name变量应该已经初始化了,但是(4)(5)处打印的还是null,这是
为什么呢?我认为子类中的name是局部变量,当创建b的时候重新
进行还是先从父类再到子类,子类调用show1时子类还未初始化变量
name没有赋值,b的创建和bs的创建完全独立,每新建一个对象局部
变量都会重新初始化,重新分配内存空间因此为null

原创粉丝点击