14.现在有如下一段程序:
class super {
String name ;
public super(String name) {
this.name = name ;
}
public void fun1() {
System.out.println("this is class super !"+name);
}
}
class sub extends super {
public void fun1() {
System.out.println("this is class sub !"+name);
}
}
class Test {
public static void main(String args[]) {
super s = new sub();
}
}
运行上面的程序可能会出现的结果?
A. this is class super !
B. this is class sub !
C. 编译时出错
D. 运行时出错
java基础面试题-中级20题答案解析版
正确答案是:C
super关键字表示对某个类的父类的引用。一般而言,super有两种通用形式:第一种用来访问被子类的成员隐藏的父类成员;第二种则是可以调用父类的构造函数。接下来说一下两种使用形式的方法和规则。
java中类命名规范要求不能使用关键字。
假如类名不是关键字,此代码会正常执行吗?
答案是:仍然编译报错。如图:
package com.songxinfeng;
class super1 {
String name ;
//写了有参构造,java则不会隐式生成无参构造
public super1(String name) {
this.name = name ;
}
public void fun1() {
System.out.println("this is class super !"+name);
}
}
//因为此类,没有写构造方法,java会隐式自动生成一个无参构造,无惨构造中会调用父类无参构造,而父类没有无参构造
class sub extends super1 {
public void fun1() {
System.out.println("this is class sub !"+name);
}
}
class Test {
public static void main(String args[]) {
super1 s = new sub();
}
}
加上一个有参构造,main中new时,报错,将new时,添加参数。即可。
package com.songxinfeng;
class super1 {
String name ;
//写了有参构造,java则不会隐式生成无参构造
public super1(String name) {
this.name = name ;
}
public void fun1() {
System.out.println("this is class super !"+name);
}
}
//因为此类,没有写构造方法,java会隐式自动生成一个无参构造,无惨构造中会调用父类无参构造,而父类没有无参构造
class sub extends super1 {
public sub(String name) {//添加有参构造
super(name);
}
public void fun1() {
System.out.println("this is class sub !"+name);
}
}
class Test {
//因为写了有参构造,java则不会隐式生成无参构造,new时候调用失败
public static void main(String args[]) {
super1 s = new sub();
super1 s1 = new sub(""); //添加参数则不报错
}
}