第一种类型:继承中与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,运行结果如下:
祖母的构造函数被调用了!
这是父类中的静态代码块!
这是子类中的静态代码块!
父类的构造函数被调用了!
这是子类的构造函数
母亲的构造函数被调用了!
当然以上只是个人理解,概不负刑事责任,欢迎讨论!
分享到:
相关推荐
本上机实践将深入探讨这两个主题,基于"java2实用教程第三版"的内容,旨在提高你对Java类层次结构和多态性的理解。 **一、继承** 1. **继承的概念**:继承是面向对象设计中的一个关键特性,允许一个类(子类)继承...
Java面向对象编程(Java OOP)是Java编程的核心概念,它允许我们以真实世界中的实体——如对象——的方式来思考和构建软件。在这个“s2 JavaOOP上机作业全部代码”压缩包中,包含了学生在学习Java OOP时可能遇到的...
【Java上机试验题目】是针对Java初学者和进阶者设计的一系列实践操作任务,旨在帮助学习者熟练掌握Java编程的各项核心技能。这些实验涵盖了从基础到高级的各种主题,包括: 1. **实验一:熟悉Java程序开发环境** - ...
本资料集合包含了一系列的Java上机案例和题目,旨在帮助开发者加深对Java语言的理解,增强实际编程能力。 1. **面向对象编程基础** - 类与对象:理解类是Java中的基本构造块,如何定义属性(成员变量)和方法...
【Java课程上机代码】是针对Java编程语言的实践学习资料,主要包含了学生在课程学习过程中进行上机操作的代码示例。这份资料的核心目的是帮助学习者加深对Java语言的理解,提升编程技能,并通过实际操作来巩固理论...
在本资源中,"使用Java理解程序逻辑上机参考代码"是一个全面的教程,涵盖了Java编程语言的基础到进阶概念,旨在帮助学习者通过实践来深入理解程序逻辑。这个资料包含全17章的上机练习代码,是学习Java编程的理想资源...
4. **环境理解**:上机实践能让学生更深入地了解计算机软件运行环境以及操作系统与编程语言支持系统之间的关系。 接下来是具体的上机实验要求: 1. **充分准备**:在上机前,学生应对实验内容进行深入分析,列出...
Java是一种广泛使用的面向对象的...通过"java2 使用教程(第三版) 实验指导 上机实践4"的学习,你应该能够熟练掌握这些概念,并能在实际项目中灵活运用。在Demo04文件中,你将有机会亲自动手实践,进一步巩固理论知识。
这道Java面试题是一个上机考核题目,意味着应聘者需要实际编写代码并运行以展示自己的技能。在提供的压缩包中,包含了可能的题目描述图像"20130110_073659.jpg"以及一个名为"test1"的文件,这个文件很可能是面试题目...
【Java面向对象之继承练习...通过上述练习,可以深入理解Java中的继承机制,如何定义类和方法,以及如何通过继承扩展功能。同时,练习涵盖了构造方法、属性和方法的重写、多态以及类之间的关系等核心面向对象编程概念。
Java实验上机指导是针对Java编程的学习者设计的一系列实践环节,旨在帮助他们深入理解和掌握Java编程的关键概念和技术。这些实验覆盖了从基础到高级的多个主题,包括Java编程环境的配置、语言基础、面向对象编程、...
Java上机指导教材是针对初学者的一份入门级学习材料,旨在帮助读者通过实践操作掌握Java编程基础。书中涵盖的内容主要包括JDK...通过这些实验,读者不仅能理论联系实际,还能在实践中不断巩固和深化对Java编程的理解。
每个平台都有对应版本的JVM,因此同一Java程序在安装了相应JVM的不同平台上都能运行。 2. JDK的安装和配置主要包括以下几个步骤: - 下载JDK安装包,例如j2sdk1.5.0。 - 运行.exe安装文件,选择默认路径并完成...
9. 内存管理:Java的垃圾回收机制是自动进行的,但理解内存分配和垃圾回收原理有助于写出更高效的代码。 10. Java标准库:如Math类、String类、Date类等常用类的使用,考生应熟悉它们提供的方法。 在实际考试中,...
- 通过的标准包括:有正确命名的源程序文件,程序可编译运行,界面符合试题要求,运行结果正确。 - 不通过的情况:缺少源程序文件,编译错误,无法运行,或运行结果不符合要求。 9. **试题样例**: - 创建一个4...
为了使选泽《Java语言程序设计(第3版)》或《Java语言实用教程(第2版)》作为教材的读者能更快、更方便、更准确地学习Java语言,作者特别编写了这本《Java语言程序设计题解与上机指导》,作为这两本教材的配套参考书...
Java编程是计算机科学领域的重要部分,尤其是在高等教育中,如北京大学这样的顶级学府,Java上机考试是衡量学生编程技能和理解力的关键环节。这个压缩包文件"北大java上机历年考题"包含了北京大学历年Java上机考试的...
通过上机练习,你可以尝试创建一个简单的文件服务器,或者实现一个多线程下载任务,从而理解这些高级主题。 总的来说,这个"Java基本上机练习题"包为初学者提供了一个全面的学习路径,覆盖了Java编程的基础到进阶...
学习如何正确地抛出和捕获异常,以及如何使用finally块确保资源的释放,是自考Java上机中的常见题目。 4. **I/O操作**:Java的I/O流体系提供了一种读写数据的方法,包括文件操作、字符流和字节流。学生需要掌握File...