文章目录
JavaSE-面向对象编程-笔试题
请问构造器能否被重写?为什么?
不能;因为构造方法名需要与类名相同,重写是指子类对从父类继承而来的方法的扩展重写,而继承关系中父类和子类类名是不同的,因此构造器没法被子类重写
Overload和Override的区别是什么?参数列表相同但返回值类型不同能重载吗?
Overload:重载;参数列表不同,方法名相同,与返回值类型无关(不一定同一个类,父子类之间也能形成重载)
Override:重写;子类出于需要对从父类继承来的父类的方法进行扩展重写
使用final关键字修饰一个引用变量时,请问是引用不能变还是引用的对象不能变?
引用不能变。引用指向引用对象的过程是在栈区中声明一个引用(变量),创建对象时是在堆区中存放创建出来的对象,引用指向对象便是将对象在堆区中的地址放在该引用中。因此我们用final修饰引用就是限定该引用内存放的地址不能发生改变,而堆区中的对象值是能改变的(比如值从30变为80)
简述复制引用和复制对象的区别
复制引用是在栈区中再复制一个新引用,这个引用内放和原引用一样的地址(和原引用指向一样的堆区对象),一旦原对象中值发生改变,两个引用对应的对象值也就发生了改变。
复制对象是在堆区中新创一个空间,该空间放与原来的对象一样的对象,用一个引用指向该对象,创建后该对象和原对象就不再有任何关系了。
阅读程序并分析执行结果是什么?
1、main()方法中使用多态——父类引用指向子类对象。该过程会在栈区中创建一个父类引用,而在堆区中创建一个父类对象和子类对象(先创建父类对象再创建子类对象,可理解为父类对象包含在子类对象中)
2、先创建父类对象,因此要先调用父类构造方法,父类构造方法中调用callName()方法,由于是先创建父类对象,此时父类构造方法中原本是应该调用父类的callName()方法,但是由于父类的callName()方法被子类重写了,所以此时调用的应该是子类重写后的callName()方法,而子类的callName()方法中输出的baseName成员变量根据就近原则应该输出的是子类的成员变量,此时子类对象还没创建,因此此时输出的baseName值为null
3、若在多态后使用引用调用callName()方法,即b.callName(),此时子类对象已经创建,因此此时输出的是子类成员变量callName()