深切懂得子类和父类之间关系
添加时间:2013-6-11 点击量:
Java进修的第二篇总结!——子类和父类 深切解析,大师多多支撑!
从内存角度去解析代码,可以从本质上懂得一门说话!
子类从父类持续分成两种:
1.办法的持续:
办法的持续,父类直接把本身的办法转移到子类中去,当然前提是父类的办法润饰符的接见局限是子类可以接见的局限,然则若是子类已经重写了父类的办法,这时辰这个办法就不克不及重父类转移到子类中。
2.成员变量的持续 :
成员变量就会有点奇妙了,它不会从父类转移到子类,而是保存在父类中,这就会呈现,子类和父类可能同时拥有两个雷同名字的变量。
下面用一段代码来申明这种相对斗劲错杂的关系:
package com.text;
public class Test {
public static void main(String[] args) {
Father a = new Father();
Chilren b = new Chilren();
Father c = new Chilren();
a.getAge();
System.out.println(a.age);
b.getAge();
System.out.println(b.age);
c.getAge();
System.out.println(c.age);
}
}
class Father {
int age = 40;
public void getAge() {
System.out.println(age);
}
}
class Chilren extends Father {
int age = 18;
public void getAge() {
System.out.println(age);
}
}
输出
40
40
18
18
18
40
前四个成果可以懂得,然则最后两个成果有人可能会问为什么成果会不一样,这段代码就表现了,成员变量持续和办法持续的差别。
可以得出结论:
Father c = new Chilren();
在以上父类引用指向子类对象景象下,接见变量看的是引用类型,所以c.age是父类的成员变量,而c.getAge()接见到的是子类Chilren的办法,所以在这个办法顶用到的age变量是Chilren的变量
反正一句话,接见变量看声明,接见办法看实际对象类型(new出来的类型)
接下来对代码做项目组批改
public static void main(String[] args) {
Chilren b = new Chilren();
Father c = b
System.out.println(b.age);
System.out.println(c.age);
}
输出
18
40
b 和c 两个引用都是指向内存中同一个对象,然则打印出来的成果倒是不合,这就说了然,内存中保存了两个 age的值,一个是18 一个是40 。
这里就会产生一些疑问,在内存中他们是怎么存储的?这时辰会想到有个super关键字,经由过程super. 可以接见到父类的变量和办法,这里有人会说:“super.代表的就是一个父类对象,因为他指向父类” 之前我也是这么想,然则看过一些书后知道其实不是如许
其实super.不是“器材”,说道super.天然会想到this.,有人把他们归为同类,其实他们大大不合
this:是一个真真实实对象,代表的就是当前对象,可以用 return this; 去返回一个对象。
super:不克不及一个对象,不是指向父类对象的意思,super只是润饰了他后边的内容,告诉JVM,后面这项目组内容不是当前对象所属类的内容罢了,若用return super,JVM是不容许的,是一种错误的语法。
public static void main(String[] args) {
Chilren b = new Chilren();
Father c = b
System.out.println(b.age);
System.out.println(c.age);
}
输出
18
40
回归到上方这段代码,这里并不是说内存中有两个对象 b 和 c ,内存中其实就只有一个 b对象 ,只是c 不仅有本身的实例 变量,同时也存在父类所定义的全部实例变量。
所以可以得出结论:在实例化一个子类的同时,体系会给子类所有实例变量分派内存,也会给他的父类的实例变量分派内存,及时父子类中存在重名的实例变量,也会两个都分派内存的,这个时辰子类只是隐蔽了父类的这个变量,但还是会给它分派内存,然后可以用super来接见属于父类的变量。
我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
Java进修的第二篇总结!——子类和父类 深切解析,大师多多支撑!
从内存角度去解析代码,可以从本质上懂得一门说话!
子类从父类持续分成两种:
1.办法的持续:
办法的持续,父类直接把本身的办法转移到子类中去,当然前提是父类的办法润饰符的接见局限是子类可以接见的局限,然则若是子类已经重写了父类的办法,这时辰这个办法就不克不及重父类转移到子类中。
2.成员变量的持续 :
成员变量就会有点奇妙了,它不会从父类转移到子类,而是保存在父类中,这就会呈现,子类和父类可能同时拥有两个雷同名字的变量。
下面用一段代码来申明这种相对斗劲错杂的关系:
package com.text;
public class Test {
public static void main(String[] args) {
Father a = new Father();
Chilren b = new Chilren();
Father c = new Chilren();
a.getAge();
System.out.println(a.age);
b.getAge();
System.out.println(b.age);
c.getAge();
System.out.println(c.age);
}
}
class Father {
int age = 40;
public void getAge() {
System.out.println(age);
}
}
class Chilren extends Father {
int age = 18;
public void getAge() {
System.out.println(age);
}
}
输出
40
40
18
18
18
40
前四个成果可以懂得,然则最后两个成果有人可能会问为什么成果会不一样,这段代码就表现了,成员变量持续和办法持续的差别。
可以得出结论:
Father c = new Chilren();
在以上父类引用指向子类对象景象下,接见变量看的是引用类型,所以c.age是父类的成员变量,而c.getAge()接见到的是子类Chilren的办法,所以在这个办法顶用到的age变量是Chilren的变量
反正一句话,接见变量看声明,接见办法看实际对象类型(new出来的类型)
接下来对代码做项目组批改
public static void main(String[] args) {
Chilren b = new Chilren();
Father c = b
System.out.println(b.age);
System.out.println(c.age);
}
输出
18
40
b 和c 两个引用都是指向内存中同一个对象,然则打印出来的成果倒是不合,这就说了然,内存中保存了两个 age的值,一个是18 一个是40 。
这里就会产生一些疑问,在内存中他们是怎么存储的?这时辰会想到有个super关键字,经由过程super. 可以接见到父类的变量和办法,这里有人会说:“super.代表的就是一个父类对象,因为他指向父类” 之前我也是这么想,然则看过一些书后知道其实不是如许
其实super.不是“器材”,说道super.天然会想到this.,有人把他们归为同类,其实他们大大不合
this:是一个真真实实对象,代表的就是当前对象,可以用 return this; 去返回一个对象。
super:不克不及一个对象,不是指向父类对象的意思,super只是润饰了他后边的内容,告诉JVM,后面这项目组内容不是当前对象所属类的内容罢了,若用return super,JVM是不容许的,是一种错误的语法。
public static void main(String[] args) {
Chilren b = new Chilren();
Father c = b
System.out.println(b.age);
System.out.println(c.age);
}
输出
18
40
回归到上方这段代码,这里并不是说内存中有两个对象 b 和 c ,内存中其实就只有一个 b对象 ,只是c 不仅有本身的实例 变量,同时也存在父类所定义的全部实例变量。
所以可以得出结论:在实例化一个子类的同时,体系会给子类所有实例变量分派内存,也会给他的父类的实例变量分派内存,及时父子类中存在重名的实例变量,也会两个都分派内存的,这个时辰子类只是隐蔽了父类的这个变量,但还是会给它分派内存,然后可以用super来接见属于父类的变量。
我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》