1. super关键字表示的是子类调用父类的中指定的操作。例如:调用属性,方法,构造等. 因为在子类实例化的时候会默认调用父类的无参构方法,如果现在希望调用友残构造,则必须在子类中明确的声明。
举例:
public class ExtDemo05 {
public static void main(String[] args){
Son2 son2 = new Son2();
son2.fun();
}
}
class Father2{
public String info = "父类Nishuibaichuan";
int age;
public Father2(){
System.out.println("父类hello,java!") ;
}
public Father2(int age){
System.out.println("小明今年:" + age ) ;
}
}
class Son2 extends Father2{
public String info = "子类Hello";
void fun(){
System.out.println("调用 的属性为:" + info) ;
System.out.println("调用 的属性为:" + super.info) ;
}
public Son2(){
super(18);
System.out.println("子类nishuibaichuan ,java!") ;
}
}
小明今年:18
子类nishuibaichuan ,java!
调用 的属性为:子类Hello
调用 的属性为:父类Nishuibaichuan
2. 比较二者区别(以下内容都是在继承的条件下成立)
(1)属性访问:
this 访问本类中的属性,如果本类中没有找到此属性,则从父类中继续查找。
super 访问父类中的属性。
(2)方法访问:
this 访问本类中的方法,如果在本类中没有此方法,则在父类中继续查找。
super 直接访问父类中的方法。
(3)调用构造方法:
this 调用本类中的构造方法,必须放在构造方法首行,他是根据不同参数个数,调用对应本类的不同参数个数的构造方法。
(4) 特殊:
this 表示当前对象
super无此概念
注:对于this 和super本身都可以调用构造方法,而且调用的时候都必须放在构造方法的首行,所以这两个关键字肯定不能同时出现!
(5)重点!
public class Abstract1 {
public static void main(String[] args){
S s = new S("nishuibaichuan",21);
}
}
class Q{
public Q(){
System.out.println("我是父类中无参构造方法!");
}
public Q(int age){
System.out.println("我是父类中有一个参构造方法!今年:" + age);
}
}
class S extends Q {
public S(){
System.out.println("我是子类无参构造方法!");
}
public S(int age){
System.out.println("我是子类有一个参构造方法!今年:" + age);
}
public S(String name,int age){
this(21);
System.out.println("我是子类有一个参构造方法!今年:" + age + ",叫:" + name);
}
}
运行结果:
我是父类中无参构造方法!
我是子类有一个参构造方法!今年:21
我是子类有一个参构造方法!今年:21,叫:nishuibaichuan
由以上运行结果可知:无论在main()中子类实例化过程中,它括号中的参数有几个(S s = new S("nishuibaichuan",21);),他都会调用父类中的无参构造方法!!!!