有以下代码:
User.java
:
public class User {
private String name;
private int age;
{
System.out.println("A");
}
static {
System.out.println("B");
}
User(){
System.out.println("C");
}
User(int age,String name){
this.age = age;
this.name = name;
System.out.println("D");
}
}
Student.java
:
public class Student extends User{
{
System.out.println("a");
}
static {
System.out.println("b");
}
Student(){
System.out.println("c");
}
Student(int age,String name){
super(age,name);
System.out.println("d");
}
}
问题1
执行 User user = new Student(12,”Tom”);
会输出什么?
答案:BbADad(父类中的静态代码、子类中的静态代码段、父类中的非静态代码、父类中的有参构造构造方法、子类中的非静态代码、子类中的有参构造方法)
问题2
如果Student.java
更改为如下(不使用super),会输出什么?
public class Student extends User{
private int age;
private String name;
{
System.out.println("a");
}
static {
System.out.println("b");
}
Student(){
System.out.println("c");
}
Student(int age,String name){ //自动调用父类的无参数构造器
this.age = age;
this.name = name;
System.out.println("d");
}
}
答案:BbACad(父类中的静态代码、子类中的静态代码段、父类中的非静态代码、父类中的无参构造方法、子类中的非静态代码、子类中的有参构造方法)
问题1和问题2在C和D上的区别原因是,使用super时,会调用父类的有参构造方法,而不使用super时,调用子类的构造方法则会自动调用父类的无参数构造方法。
问题3
如果运行以下代码,输出是什么?
Student student1 = new Student(13,"Tom");
Student student1 = new Student(12,"张三");
或者第二个对象使用多态的形式,输出是什么?
Student student = new Student(13,"Tom");
User user = new Student(12,"张三");
答案:BbADadADad(静态代码段只执行一次)
问题4
如果Student.java
更改为如下(添加了静态成员 count
):
public class Student extends User{
static int count = 0;
{
System.out.println("a");
}
static {
System.out.println("b");
}
Student(){
System.out.println("c");
}
Student(int age,String name){
super(age,name);
count ++;
System.out.println("d");
}
}
运行以下代码,count
两次输出的值分别是什么?
User user = new Student(12,"张三");
System.out.println(Student.count);
Student student = new Student(13,"Tom");
System.out.println(Student.count);
答案:1 2(虽然第一个对象没有使用多态的形式,第二个使用了多态的形式,两者的静态成员count
还是同一个)
如上内容部分根据实际运行结果总结,并不是客观的结果,如有错误,多谢指正。