第一种类型:继承中与this 有关的问题;
父类原码如下:
public class Father {
private void testOne(){
System.out.println("这个方法是父类的 testOne 方法!");
}
public void test(){
System.out.println("this==="+this); //运行时的this
this.testOne();
}
}
子类原码如下:
public class Son extends Father {
public void testOne() {
System.out.println("这个儿子的 testOne 方法!");
}
public static void main(String[] args) {
Father father = new Son();
father.test(); //假设此为第一次运行
Son son=new Son();
son.test(); //假设此为第二次运行
}
}
1,请问第一次的运行结果与第二次的运行结果一样吗???
2,请问两次运行this分别指向什么类型???
3,请问运行结果是什么?
4,你能解释这种现象吗?
我的解答如下:
1,两次运行结果基本一样,除了两次为对象分配的哈希码不同除外;
2,两次运行过程中,this均是子类类型的引用;
3,运行结果如下:
this===com.jishi.shenzheng.Son@c17164
这个方法是父类的 testOne 方法!
this===com.jishi.shenzheng.Son@1fb8ee3
这个方法是父类的 testOne 方法!
4,我的解释是:
对于第一种情况,Father father=new Sun();对于引用f来说子类中的testOne()方法是不可见的,
因为子类继承父类时,并没有继承testOne()方法,因为testOne()方法是私有的。故对父类来说子类的
testOne()是子类新增的方法,进行向上转型之后,新增的方法和属性将是不可见的。而父类中的this自然是
只能调用自己的testOne()方法。(注:对于this指针<向上转型后>,它先是到子类中看此方法有未override版本,
没有再到父类中找,再没有就会报错.
对于第二种情况,Son son=new SonClass(); 大家是否觉得很其怪,为什么不是调用子类的testOne()方法,
而是调用了父类的.....这得从this 关键字说起,this 关建字只能在类的成员方法中使用,这也就是说其是与当
前这个类相关联的,而this又是一个引用,那么就很显然了,它只能是指向该类的引用,或其子类向上转型以后的引用.
也就是说在调用父类的test()方法时,this指针属于第二种情况,发生了向上转型,而上转型后,子类中的testOne()方法
就变得不可见了,分析过程同上例.
2,第二类,关于父类中私有域的继承问题;
父类代码如下:
public class Father {
private int a1 = 1;
protected int a2 = 2;
int getA1() {
return a1;
}
int getA2() {
return a2;
}
}
子类代码如下:
public class Son extends Father {
public void test() {
System.out.println(this.getA1());
System.out.println(this.a2);
System.out.println(this.getA2());
}
public static void main(String[] args) {
Son b = new Son();
b.test();
}
}
1,子类是否继承了父类的私有变量a1?
2,子类是否能访问到父类的私有变量a1?
3,a1是在什么时候初始化的?
4,运行结果是什么?
5,你能解释这种现象吗?
我的解答如一:
1,子类没有从父类继承私有变量a1,私有变量和方法是不可以被继承的;
2,不能直接访问,但可以间接访问;
3,子类初始化时,调用父调默认构造函数,并为其变量分配空时,初始化的。
4,运行结果如下:
1
2
2
5,我的理解如下:
由于son类继承father类,
他继承了father类的geta1()的方法,
但没有继承他的
private int a1 = 1;
a1这个属性之所以在son类中能用
System.out.println(this.geta1());取出来的值,是用了向上转型的原因,,
jvm先在son类里面找有没geta1()这个方法,发现没有的时候就转到了他的父类去了
这个时候的this指的是father类,,
用System.out.println(this.geta1());
打印出来了值,实际上是
father的geta1()取出来的
第三类问题,静态代码块,构造函数的调用顺序这块。
这是父类的代码:
public class Father {
static int sum=5;
static{
System.out.println("这是父类中的静态代码块!");
}
public Father(){
System.out.println("父类的构造函数被调用了!");
}
}
这是子类的代码:
public class Son extends Father {
static{
System.out.println("这是子类中的静态代码块!");
}
public Son(){
System.out.println("这是子类的构造函数");
}
public static void main(String[] args) {
Father.sum=5;
new Son();
}
}
1,Father.sum=5;这句话会引发输出吗?
2,静态代码块是什么时候被触发的?
3,构造函数的调用顺序?
4,静态代码块的调用顺序?
5,运行结果?
我的解答:
1,Father.sum=5;这句话会引发输出。因为它会导致你类被加载,些时静态代码块会被执行;
2,静态代码块是在类被加载时执行的,且仅执行一次;
3,当然是先调用父类的构造函数,再调用子类的构造函;
4,先调用父类的静态代码块,再调用子类的静态代码块;
5,运行结果如下:
这是父类中的静态代码块!
这是子类中的静态代码块!
父类的构造函数被调用了!
这是子类的构造函数
第四类,涉及组合类的相关问题,综合前面的一些东西,稍微多一点东西;
父类与子类的源代码与上相同!
祖母的源代码如下:
public class GrandMother {
public GrandMother(){
System.out.println("祖母的构造函数被调用了!");
}
}
母亲的源代码如下:
public class Mother extends GrandMother {
public Son son=new Son();
public Mother(){
System.out.println("母亲的构造函数被调用了!");
}
public static void main(String[] args){
new Mother();
}
}
1,是继承的类的构造优先还是组合的构造优先??
2,该程序的运行结果是什么?
我的解答:
1,是优先运行继承了,而后运行组合的,最后才是运行自己的构造函数;
2,运行结果如下:
祖母的构造函数被调用了!
这是父类中的静态代码块!
这是子类中的静态代码块!
父类的构造函数被调用了!
这是子类的构造函数
母亲的构造函数被调用了!
当然以上只是个人理解,概不负刑事责任,欢迎讨论!
分享到:
相关推荐
`表明变量声明时类型大小写不敏感,`int`为整型数据类型,用于存储整数值。 14. 控制台输入输出 `System.out.printf`用于格式化输出到控制台,它比`System.out.println`提供了更灵活的输出格式控制。 上述知识是...
南京理工大学计算机学院的复试上机编程题目是针对计算机科学与技术、软件工程等相关专业研究生入学考试的一个重要环节。这类题目通常旨在考核考生的基础编程能力、算法理解与应用、问题解决和逻辑思维等核心技能。...
内容概要:本文详细介绍了如何使用C#开发一个SMT贴片机的轨迹导入程序,该程序能够解析CAD设计的DXF文件并将其中的轨迹转换为适用于SMT设备的G代码。主要内容涵盖DXF文件的读取与解析、LWPOLYLINE的提取、坐标转换、G代码生成以及保存。此外,文中还探讨了一些实际应用中的注意事项,如坐标系转换、插补算法的选择和错误处理方法。通过具体的代码示例展示了如何利用netDxf库简化DXF文件的操作,并提供了路径优化和Z轴控制的具体实现。 适合人群:从事SMT行业或相关领域的工程师和技术人员,尤其是有一定C#编程基础并对数控编程感兴趣的开发者。 使用场景及目标:①将CAD设计的DXF文件高效转化为SMT设备所需的G代码;②确保生成的G代码能够在实际设备上正确执行,提高生产效率和准确性;③解决坐标系转换、插补算法选择等问题,增强程序的鲁棒性和实用性。 其他说明:建议在真实设备运行前先用CAM软件进行仿真测试,同时注意处理好文件读取和数值转换中的异常情况。
内容概要:本文详细介绍了基于西门子S7-1200 PLC的物流仓储自动化系统,涵盖了硬件架构、通信处理、运动控制算法、触摸屏交互等多个方面的内容。硬件上,采用S7-1217C处理器、G120变频器、ET200S远程站和激光测距传感器构建了一个精密的空间坐标定位体系。通信部分利用Profinet和RS485进行数据传输,并通过SCL和STL编写了多种实用的功能块,如急停处理、温漂补偿、路径优化等。运动控制方面,通过速度梯形图与S型曲线结合的方式实现高精度定位。触摸屏界面则通过WinCC Advanced实现报警记录和货位状态显示等功能。 适合人群:从事物流仓储自动化系统设计、开发和维护的技术人员,尤其是熟悉西门子PLC编程的工程师。 使用场景及目标:适用于需要高精度、高可靠性的物流仓储自动化项目的开发和调试。主要目标是提高系统的响应速度、定位精度和稳定性,确保设备能够长时间稳定运行。 其他说明:文中提供了大量实际代码片段和技术细节,帮助读者更好地理解和应用相关技术。此外,还分享了一些现场调试的经验和技巧,如温漂补偿、通信优化等。
新5
内容概要:本文详细介绍了如何利用MATLAB的Fuzzy工具箱实现驾驶员制动意图的识别。文中首先解释了模糊控制的基本概念及其在处理不确定性和模糊性方面的优势。随后,通过具体的MATLAB代码示例展示了如何构建模糊推理系统(FIS),包括定义输入输出变量、隶属函数以及规则库。此外,还讨论了实际应用中的优化措施,如调整隶属函数参数和引入多输入变量以提高系统的鲁棒性和准确性。最后,通过对比实验验证了模糊控制相比传统方法在响应时间和识别精度上的优越性。 适合人群:从事自动驾驶或智能辅助驾驶系统研究的技术人员,尤其是对模糊控制算法感兴趣的开发者。 使用场景及目标:适用于需要精确识别驾驶员制动意图的应用场合,如高级驾驶辅助系统(ADAS)、自动驾驶车辆的安全控制模块等。主要目标是提高系统的智能化水平,增强行车安全性。 其他说明:文中提供的代码片段和实验数据有助于读者深入理解模糊控制的工作机制,并为实际项目开发提供参考。同时,强调了参数调整的重要性,指出模糊控制并非万能解决方案,需结合具体应用场景进行优化。
内容概要:本文详细介绍了三菱PLC QD75模块FB功能块在伺服电机控制中的应用。首先阐述了选择FB功能块的原因,即编程方式清晰明了,便于维护和修改。接着展示了关键代码及其分析,包括输入输出变量、中间变量、初始化、运动参数设置、当前位置监控、目标位置判断以及错误处理等方面的内容。文中还提供了多个实用技巧,如速度切换判断、状态监控、错误处理、调试方法等。此外,文章强调了这套程序的适用范围和借鉴意义,尤其适合初学者作为模板进行项目级开发。 适合人群:具备一定PLC编程基础,尤其是三菱PLC初学者和项目级开发者。 使用场景及目标:①帮助读者理解三菱PLC QD75模块FB功能块的工作原理;②提供一个成熟的伺服电机控制程序模板,供读者在实际项目中参考和改进;③提高程序的可维护性和可靠性。 其他说明:文章不仅提供了详细的代码示例和注释,还分享了许多实际应用中的经验和技巧,有助于读者更好地理解和应用这些知识。
少儿编程scratch项目源代码文件案例素材-恶魔的冒险 Level Devil.zip
少儿编程scratch项目源代码文件案例素材-鬼影斩.zip
Node-Webkit Javascript (NW.js)
内容概要:本文详细介绍了基于UDS(Unified Diagnostic Services)协议的Bootloader的设计与实现,涵盖其多协议支持(XCP、CCP、UDS)、AUTOSAR兼容性、多版本选择(ILLD和MCAL)、广泛硬件平台支持(如TC系列芯片)以及CAN FD的支持。文中不仅提供了上位机和下位机的代码示例,还展示了具体的测试用例,确保Bootloader的功能正确性和稳定性。此外,文章探讨了Bootloader在汽车电子和工业控制系统中的应用场景,强调了其重要性和灵活性。 适合人群:从事汽车电子、嵌入式系统开发的技术人员,尤其是那些需要深入了解Bootloader工作机制和实现细节的人群。 使用场景及目标:适用于需要开发或维护汽车电子控制单元(ECU)的团队,旨在提高系统的可靠性和性能。目标包括但不限于:实现高效的数据传输、确保诊断服务的准确性、优化刷写速度、增强系统的安全性等。 其他说明:文章提供了丰富的代码示例和技术细节,帮助读者更好地理解和应用基于UDS的Bootloader。同时,针对不同硬件平台和应用场景,给出了具体的配置建议和注意事项。
esp32串口接收tcp发送代码
少儿编程scratch项目源代码文件案例素材-蝗虫群怪 Boss 战.zip
少儿编程scratch项目源代码文件案例素材-放射性南瓜田.zip
少儿编程scratch项目源代码文件案例素材-格林奇 Boss 大战.zip
文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!
内容概要:本文详细介绍了使用MATLAB进行QPSK调制信号通过AWGN信道的误符号率(SER)和误比特率(BER)性能分析的方法。主要内容包括参数设置、随机比特流生成、Gray编码映射、AWGN信道建模、噪声功率计算、解调过程以及误码率统计。文中还讨论了一些常见的实现陷阱和技术细节,如Gray编码的正确实现、噪声方差的计算方法、信噪比转换等。通过仿真与理论值对比,展示了QPSK调制在不同信噪比下的性能表现。 适合人群:通信工程专业学生、通信系统开发者、MATLAB爱好者。 使用场景及目标:适用于希望深入了解QPSK调制原理及其在AWGN信道下的性能分析的研究人员和工程师。通过动手实践,可以掌握QPSK调制的基本原理、MATLAB编程技巧以及通信系统的性能评估方法。 其他说明:文中提供了详细的MATLAB代码片段,帮助读者更好地理解和实现QPSK调制的性能分析。此外,还提到了一些优化建议,如增加仿真次数以提高低信噪比区域的精度。
内容概要:本文详细介绍了六轴EtherCAT总线伺服涂布收卷机程序的实现过程。该系统通过六个伺服电机、变频器和编码器的配合,实现了动态测量频率、转速计算、频率换算与速度同步以及通讯控制等功能。文中提供了具体的代码示例,如Python、C/C++和ST语言代码片段,用于解释如何进行频率测量、转速换算、变频器频率设置和EtherCAT通讯控制。此外,还讨论了实际应用中的常见问题及其解决方案,如通讯延迟处理、异常处理和参数配置等。 适合人群:从事工业自动化控制领域的工程师和技术人员,尤其是对EtherCAT总线技术和伺服控制系统有一定了解的人群。 使用场景及目标:适用于需要高精度同步控制的工业应用场景,如涂布工艺和收卷环节。目标是帮助读者理解和实现六轴EtherCAT总线伺服涂布收卷机系统的协同工作,提高生产效率和稳定性。 其他说明:文章不仅提供了详细的代码实现,还分享了许多实际调试经验和技巧,有助于读者更好地应对实际工程中的挑战。
内容概要:本文详细介绍了如何利用COMSOL软件中的水平集方法进行激光打孔的模拟。首先,构建了几何模型并设置了材料参数,包括温度依赖的导热系数、密度和比热容等。接着,定义了高斯分布的激光热源,并引入了水平集方程来追踪熔池界面的变化。文中强调了网格划分、时间步长设置以及多物理场耦合的重要性,特别是在处理等离子体屏蔽效应时。最后,讨论了后处理步骤,如导出切割线数据、验证网格独立性和与实验数据对比等。 适合人群:从事精密加工领域的研究人员和技术人员,尤其是那些熟悉COMSOL软件并对激光打孔感兴趣的用户。 使用场景及目标:适用于希望深入了解激光打孔过程中涉及的各种物理现象的研究人员,帮助他们优化工艺参数,提高加工精度。同时,也为教学提供了一个很好的案例,使学生能够掌握复杂的多物理场耦合仿真技术。 其他说明:文中提供了大量具体的MATLAB代码片段,便于读者理解和实践。此外,作者还分享了一些实用的小技巧,如如何避免数值震荡、选择合适的初始参数等。
APK包名类名查看工具