好久好久的,没有发表blog,之前都一直是开快车,脑子里的知识一个劲的刷新,虽然装了很多,但依然感到大脑轻飘飘的。难得有个机会停下了,深刻的理解java基础,尝试着探究最简单的问题的深层机制,发现收获还颇多。不多说,来技术总结了。
再探继承:
//父类构造器的隐式调用
class grandFather {
public grandFather(){
System.out.println("这是祖父类");
}
}
class father extends grandFather {
public father(){
System.out.println("这是父类!");
}
}
class child extends father {
public child(){
System.out.println("这是子类");
}
public static void main(String [] args){
new child();
}
}
运行结果:
这是祖父类
这是父类!
这是子类
说明:
只要在程序创建java对象,系统总是先调用最顶层父类的初始化操作,包括初始化块和构造器,然后依次向下调用所有父类的初始化操作,最终执行本类的初始化操作返回本类的实例。(至于为什么要保留隐式调用功能,至今我也没弄明白,也许是没用到这个功能,但是“存在的东西总有它的理由”,求高手解答了)
再看一例:
package cn.Sep.day24.InheritanceTest;
//内存中子类的实例
class Base{
int count = 2;
}
class Mid extends Base{
int count = 20;
}
public class subClass extends Mid {
int count = 200;
public static void main(String[] args) {
subClass s = new subClass();
Mid s2m = s;
Base s2b = s;
System.out.println(s.count);
System.out.println(s2m.count);
System.out.println(s2b.count);
}
}
//这里有个问题,s,s2m,s2b三个变量不是指向同一个变量吗?为什么输出的数值不同呢
//总结:当发生继承时,子类即使定义了与父类里同型同名的变量,但是父类里的该变量不是被覆盖,而是被隐藏了
//当发生转型时,会根据声明的类型调用父类的变量(这个与方法的重写不同)
来一极端例:
package cn.Sep.day24.InheritanceTest;
//父类的内存控制
class BaseClass {
int count = 2;
public void display() {
System.out.println(this.count);
}
}
class DerivedClass extends BaseClass {
int count = 20;
@Override
public void display() {
System.out.println(this.count);
}
}
public class FildAndMethodTest {
public static void main(String[] args) {
BaseClass b = new BaseClass();
System.out.println(b.count);
b.display();
DerivedClass d = new DerivedClass();
System.out.println(d.count);
d.display();
BaseClass bd = new DerivedClass();
System.out.println(bd.count);
bd.display();
BaseClass d2b = d;
System.out.println(d2b.count);
}
}
//输出顺序分别为:2,2,20,20,2,20,2(不信自己可以运行看看)
// 总结:如果在子类重写了父类的方法,就意味着子类里定义的方法彻底覆盖了父类的同名方法,系统将不可能把父类里的
// 方法转移到子类中。对于实例变量则不存在这样的现象,即使子类中定义了与父类完全同名的实例变量,这个实例变量依
// 然不可能覆盖父类中定义的事例变量
又来一极端例:
package cn.Sep.day24.InheritanceTest;
class Fruit {
String color = "蓝色";
public Fruit getThis() {
return this;
}
public void info() {
System.out.println("Fruit方法");
}
}
public class Apple extends Fruit {
@Override
public void info() {
System.out.println("Apple方法");
}
public void AccessSuperInfo() {
super.info();
}
public Fruit getSuper() {
return super.getThis();
}
String color = "红色";
public static void main(String[] args) {
Apple a = new Apple();
Fruit f = a.getSuper();
System.out.println("a和f所引用的对象是否相同" + (a == f));
System.out.println("访问a所引用的对象的color实例变量" + a.color);
System.out.println("访问f所引用的对象的color实例变量" + f.color);
a.info();
f.info();
a.AccessSuperInfo();
}
}
//运行结果:
//a和f所引用的对象是否相同true
//访问a所引用的对象的color实例变量红色
//访问f所引用的对象的color实例变量蓝色
//Apple方法
//Apple方法
//Fruit方法
//解析:从运行结果可以看出,Apple对象的getSuper()方法所返回的实际是该Apple对象本身(此时super.getThis()方法
//中的this指Apple对象),只是他的声明类型是Fruit
//因此通过f变量访问color实例变量时,该实例变量的值由Fruit类决定;但通过f变量调用info()方法时,该方法的行为
//由f变量实际所引用的java对象决定,因此程序输出"Apple方法"。
//总结:至此,对父、子对象在内存中存储有了准确的结论:当程序创建一个子类对象时,系统不仅会为该类中定义的实例变量分配内存
//也会为其父类中定义的所有实例变量分配内存,即使子类定义了与父类中同名实例变量。也就是说,当系统创建一个java对象的
//时候,如果该java类有两个父类(一个直接父类A,一个间接父类B),假设A类中定义了2个实例变量,B类中定义了3个实例变量,
//当前类中定义了2个实例变量,那这个java对象将会保存2+3+2个实例变量
//如果在子类里定义了与父类中已有的同名变量,那么子类中定义的变量会隐藏父类定义的变量。注意不是完全覆盖,因此系统为
//创建子类对象事,依然会为父类中定义的、被隐藏的变量分配内存空间。
到此,初探“继承”已经结束了,在这之中,收获的不只是技术,更重要的是懂得一种方法,有时候,学一样东西,切不可浮于表面,学习到的知识不可模模糊糊的,只知道怎么用是不够的,当自己知道了其中的实现的机制后,不仅知识更扎实,对于创新是很有用的,而且该知识点也会用得更灵活,不至于到后来出了错依然不知所以然,悲哉!不知所云……
分享到:
相关推荐
其计算的极端气候指数共有27 种,包括16 个极端温度指数和11 个极端降水指数,这27 个极端气候指数都是世界气象组织气候委员会推荐使用的核心极端气候指数。根据内蒙的实际情况和研究的需要,选择10 个极端气温指数...
南洋理工大学黄教授的极端学习机的代码 在java上实现的
本文中简要介绍任何语言设计者在类型模型中必须考虑的一些决策...本文将展示一些不同极端的例子——Objective Caml中的静态类型和Ruby中的动态类型。还将谈到Java语言的类型限制,以及如何突破Java类型的限制快速编程。
极端气候软件用户手册,英文全解,安装步骤,操作使用步骤,以及注意事项
我们研究了在低能量和低温下极端和近端黑洞的行为,发现可以从近视AdS 2区域理解它。 我们的分析包括带电物质,而且还超出了S波近似。 我们发现低能量下的超前行为是由与时间重新参数化相关的模式和由规范场产生的...
极端天气安全设施检查记录表--消防设施.pdf
简述WAF+STRUTS结合的例子:WEB层用STRUTS,EJB层用WAF:??JSP(TagLib)——>ActionForm——>Action ——> Event——>EJBAction——>EJB ——>DAO——>Database JSP(TagLib) (forward) <——Action <——Event...
我们表明,从普朗克鳞片到大约109 g的质量范围较广的原始(近乎)极端黑洞在宇宙学上是稳定的,并为暗物质提供了可行的解释,因为它具有暗电磁力和暗电子。 Hawking辐射和Schwinger放电过程分别被近端电子和暗电子的...
基于ECMWF的极端预报指数(EFI),定义了观测的“观察” EFI(OEFI)并对其进行了校准。 然后设计EFI当量百分位数(EFIEP)和EFI当量分位数(EFIEQ)来定量预测日极端降水量。 该公式表明,EFIEP不仅与EFI相关,而且...
针对极端偏好成员在应急决策中存在较大影响力的问题,构建了个体极端偏好影响力模型,结合风险偏好矢量的方向性和距离性提出了一种新的决策成员风险偏好相似度模型,并...
我们获得了耦合到Maxwell场... 非常明显的是,我们能够获得所有这些解的面积和Wald熵的封闭形式精确表达式,并使用此结果,在此理论中分析极端背孔的相空间。 据我们所知,这是首次精确计算出高阶引力中旋转黑洞的熵。
包括Rx5day、CDD、R95
本文来自新的云探测指数(CDI),可用于预测极端天气事件,例如大雨或极端降雨。 CDI使用云形成的两个关键要素(关键湿度和关键水蒸气)进行检索。 通过使用位于印度西部孟买的无线电探空仪站点(VABB)的CDI确定云...
巴鲁夫杰出的性能表现_极端环境下的工业用传感器pdf,
java xml代码 dom4j是一个Java的XML API,类似于jdom,用来...dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。
什么是极端编程? 极端编程(eXtreme Programming)是一种开发纪律,以简单性、交流、反馈和勇气为基本宗旨。
极端天气施工方案及保证措施.pdf
极端报复社会犯罪研究.docx
使用应用于极角克尔(Kerr)极的黑折有效理论,我们为渐近平坦时空中具有单个和多个不连续视界的新的平稳极黑点解的存在提供了证据。 这些包括在五个时空维度上的极端双旋黑环,黑色土星,双环和双环,以及在尺寸上...
中国山西省持续高温,大雨或突然的寒潮等极端天气事件给人们的生产和生活带来了巨大的损失和灾难。 研究极端天气事件的时空分布特征和环流背景场具有重要的现实意义。 我们从1981年至2010年从中国山西省的109个气象...