五、JAVA中类的探究-父类构造器
2015-06-09 18:02
316 查看
二、父类构造器
(1)隐式调用和显式调用
代码如下
class Lingle { { System.out.println("Lingle的非静态初始化块:"); } public Lingle() { System.out.println("Lingle的无参数构造器"); } public Lingle(String grandson) { // 使用this调用另一个重载的、无参数构造器! this(); System.out.println("Lingle带有grandson参数的构造器,grandson参数:" + grandson); } } class Manxc extends Lingle { { System.out.println("\nManxc的非静态初始化块:"); } public Manxc(String grandson) { super(grandson); System.out.println("Manxc带一个参数的构造器,grandson参数:" + grandson); } public Manxc(String grandson, int age) { // 使用this调用另一个重载的构造器 this(grandson); System.out.println("Manxc带两个参数的构造器,其age参数:" + age); } } class LiuChang extends Manxc { { System.out.println("\nLiuChang的非静态初始化块:"); } public LiuChang() { // 显示调用父类的两个参数的构造器 super("刘畅", 8); System.out.println("LiuChang无参数构造器"); } public LiuChang(double score) { this(); System.out.println("LiuChang的带score参数的构造器,score参数:" + score); } } public class StaticInitTest { public static void main(String[] args) { new LiuChang(59); } }
运行结果
Lingle的非静态初始化块:Lingle的无参数构造器
Lingle带有grandson参数的构造器,grandson参数:刘畅
Manxc的非静态初始化块:
Manxc带一个参数的构造器,grandson参数:刘畅
Manxc带两个参数的构造器,其age参数:8
LiuChang的非静态初始化块:
LiuChang无参数构造器
LiuChang的带score参数的构造器,score参数:59.0
学习心得
值得注意的是:super和this都是调用构造器的第一行代码 因此构造器中的super调用和this 调用最多只能使用其中之一 而且最多只能调用一次
(2)访问子类对象的实例变量
代码如下
class Base { private int i = 2; public Base() { this.display(); } public void display() { System.out.println(i); } } class Derived extends Base { private int i = 22; public Derived() { i = 222; } public void display() { System.out.println(i); } } public class StaticInitTest { public static void main(String[] args) { new Derived(); } }
运行结果
0学习心得
居然不是2或者22或者222!——————————
JAVA对象不是由构造器创建的 构造器只是对JAVA对象实例变量执行初始化
在执行构造器代码之前 该对象所占的内存已经被分配 这些内存中存的值都默认是空值(基本类型默认空值0 引用类型默认空值Null)
其实是执行Derived类构造器之前会先执行Base类 调用this.display()时要注意this代表什么
其实是Derived()构造器隐式调用了Base()构造器的代码 this代表的是Derived对象
用this.getclass()来看:
class Base { private int i = 2; public Base() { System.out.println(this.i); this.display(); System.out.println(this.getClass()); // this.sub(); } public void display() { System.out.println(i); } }
输出结果:
2
0
class Derived
果然this引用代表的是Derived对象
但是在Derived中增加sub() 执行this.sub()则不能通过编译
public void sub() { i++; }这是因为this的编译时类型是Base的缘故
相关文章推荐
- Java 字符串计算频率出现最高的字符
- Core Java 笔记(二)
- springmvc乱码问题
- 在Eclipse中导入Tiny工程,有下面的错误,是什么原因?
- Tiny对JDK有什么要求么?
- waiting for spring......
- Eclipse操作Hbase遇到的问题:getMaster attempt 。。。
- 图形化插件对Eclipse的版本要求
- ajaxfileupload.js在SpringMVC中使用笔记
- 【转载】Java 7之基础 - 强引用、弱引用、软引用、虚引用
- 下压堆栈的链表实现 java版本
- java 语法 java没学好,休想学好安卓!
- java用流读写文件
- Java foreach语句
- Java最佳实战
- Myeclipse常用快捷键
- spring 第一篇(1-3):鸟瞰spring蓝图
- java线程池ThreadPoolExecutor 如何与 AsyncTask() 组合使用
- java线程池ThreadPoolExecutor 如何与 AsyncTask() 组合使用
- java线程池ThreadPoolExecutor 如何与 AsyncTask() 组合使用