妈呀,原来感觉自己挺垃圾的,一着手写点东西才发现,以前高估了自己,噗~~~~~抽一口老烟冷静一下.
package com.cityhero.Test;
// 封装:把类中的数据私有化,提供公共的get/set方法,统一管理
// 继承:子类和父类之间是is a的时候,用继承,子类可以使用父类已存在的特性,根据需要,也可以扩展新的功能.
// 多态:父类引用指向子类对象,造成父类引用的多种形态.①对象类型始终不变②在编译时,调用父类可继承的方法,运行时,
// 子类的方法优先被执行,如果没有覆盖,则执行从父类继承到的方法.
// 覆盖:子类把从父类继承到的方法进行重新实现 语法要求:
// ①方法名,返回值类型,参数列表必须相同 ②访问修饰符可同或者更宽③子类不能比父类抛出更多的异常
//嗯~ 那么我们假定,不,就看做吧
//new 一个Super对象jvm会给它分1M的空间去存储这个对象的数据
//new 一个Sub对象jvm会给它分0.5M的空间去存储这个对象的数据
//现在开始看看这个让人好奇的鬼过程究竟是怎样嘞. 去找咱们的程序入口main方法(ps:如果jdk9没有这么一句话会不会不习惯呢~~~)
class Super {
public String name = "Super.name";
}
class Sub extends Super {
public String age = "Sub.age";
}
public class TestClass {
@SuppressWarnings("unused")//哈,这里是我们的main啦~~
public static void main(String[] args) {
Super sup = new Super();//new一个父类对象,虚拟机给我们分1M空间存储这个实例对象
Sub sub = new Sub();//因为new 子类对象时,会隐式的调用super()方法去构造一个父类对象,sub会包含父类的初始化数据,所以,这里会给我们分1.5M空间
Sub sub1 = (Sub)sup;//这里呢,把1M转换成1.5,而1M没有sub的0.5M数据,jvm自然不允许啦,就会报类型转换异常
Super sup1 = sub;//sup1指向那1.5M的数据区,但是呢,父类的规范里面只有1M的数据,自然我们就只能用1M的数据,而用不了子类特有的0.5啦~~
Sub sub2 = (Sub)sup1;//虽然我们的sub2是有Super对象sup1转换来的,但是sup1实际指向的是1.5M,现在我们的sub2指向的也是这1.5M,都是Sub类,这1.5M都能正常用了~~
}
}
//ps:这个形象的比喻是从其他地方看到的,但是最后一点,原文说的sub2是由Super转换而来只能用1M,其实都能用啦~