java学习日记
课前小练习
1.以下代码运行输出的是:
A.输出:Person
B.没有输出
C.编译出错
D.运行出错
public class Person{
private String name = "Person";
int age=0;
}
public class Child extends Person{
public String grade;
public static void main(String[] args){
Person p = new Child();
System.out.println(p.name);
}
}
答案是 C 编译出错
原因:看源代码 由于Child继承了其父类Person类 所以可以用父类的引用指向创建的Child子类对象 程序要输出p的name 编译出错 虽然子类继承了父类的方法和变量 但是因为在其父类中name变量被private修饰 我们知道 被private修饰的变量或者方法只能在同一包的同一个类中访问 所以要在这个类中访问父类的私有方法 会出现编译错误
小知识:那么一般被private修饰的变量或者方法 我们如何在其他类中访问呢? 我们可以在被private修饰的类中定义其getset方法 这样我们就可以在其他类中通过方法调用这个变量或者改变这个变量的内容了
2.A 派生出子类 B , B 派生出子类 C ,并且在 java 源代码有如下声明:
- A a0=new A();
- A a1=new B();
- A a2=new C();
问以下哪个说法是正确的?()
A.只有第一行能通过编译
B.第1、2行能通过编译,但第3行编译出错
C.第1、2、3行能通过编译,但第2、3行运行时出错
D.第1行,第2行和第3行的声明都是正确的
答案选D
题目中我们可以看出 A是B的父类 B是C的父类
A a0=new A(); 肯定没问题
A a1=new B(); A是B的父类 此时发生了向上转型 也没问题
A a2=new C(); 此时A虽然不是C的直接父类 但是C依然间接继承了A的内容的此时可以发生向上转型的 所以也没问题 所以爷爷可以创建指向孙子类的对象的引用
3.以下代码输出的结果是什么:
A.Base
B.BaseBase
C.编译失败
D.代码运行但没有输出
E.运行时抛出异常
class Base {
Base() {
System.out.print("Base");
}
}
public class Alpha extends Base {
public static void main( String[] args ) {
new Alpha();//1
//调用父类无参的构造方法
new Base();//2
}
}
答案为B:BaseBase
我们来看Alpha子类继承了父类Base 在实例化子类对象的时候 会先调用父类的构造方法 以此来对父类进行初始化 虽然我们看不到 但编译器会默认在子类中有这么一个方法 Alpha(){ super(); } 调用父类的无参构造方法 即输出Base
当new一个父类对象的时候 又会调用自身的无参构造方法 输出Base 最终输出结果为BaseBase
4.以下程序输出的结果为:
A.BD
B.DB
C.C
D.编译错误
class Base{
public Base(String s){
System.out.print("B");
}
}
public class Derived extends Base{
public Derived (String s) {
System.out.print("D");
}
public static void main(String[] args){
new Derived("C");
}
}
选D 编译错误
子类要继承父类需要先对继承过来的父类对象进行初始化 编译器默认会有无参的构造方法super(); 但是对于有参的构造方法 需要自己写来调用
所以在public Derived (String s) {
super(s);//添加这么一句调用父类的有参的构造方法对父类成员进行初始化
System.out.print(“D”);
}
小知识:关于子类继承父类 有这么几种情况
1.父类中有无参构造方法 实例化时子类中无需刻意写super(); 编译器会默认给 写不写都会调用父类无参构造方法进行父类成员初始化
2.父类中有有参构造方法 没有无参构造方法 子类中调用有参构造方法后 不提供super(参数);时 会出现编译错误
3 无参构造方法默认会给的 给了有参构造方法 就不给提供了 必须手动写 super也一样 不给就默认super(); 自己写了super(参数);时 就不给你提供了
调用无参构造时 必须手动添加super();
5.以下程序 输出的结果是
A.ZYXX
B.ZYXY
C.YXYZ
D.XYZX
class X{
Y y=new Y();//1
public X(){
//2
System.out.print("X");
}
}
class Y{
public Y(){
//3
System.out.print("Y");
}
}
public class Z extends X{
Y y=new Y();//4
public Z(){
//5
System.out.print("Z");
}
public static void main(String