当前位置: 移动技术网 > IT编程>开发语言>Java > Java super关键字

Java super关键字

2019年07月16日  | 移动技术网IT编程  | 我要评论
Java super关键字代表当前对象的直接父类的默认引用。 super关键字就类似于 C#中的base关键字。参见地址 super的注意事项: 1、super必须出现在子类中(子类的方法和构造方法中),而不是其他位置 2、super用于访问父类的成员,例如父类的属性、方法、构造方法 3、访问权限的 ...
java super关键字代表当前对象的直接父类的默认引用。
super关键字就类似于 c#中的base关键字。
 
 
super的注意事项:
1、super必须出现在子类中(子类的方法和构造方法中),而不是其他位置
2、super用于访问父类的成员,例如父类的属性、方法、构造方法
3、访问权限的限制,例如无法通过super访问父类的private成员。
 
super的使用场景
1、子类中使用了方法重写,但是又想调用父类的被重写了的方法,就要使用super关键字
2、super在子类构造函数中显示调动父类的无参构造或者其他有参构造(如果不显示写super,那么初始化子类实例时会默认调用父类的无参构造,如果此时父类没有无参构造,编译器会报错)
 
super使用方法:
1、访问父类的属性或者对象,进行修改赋值操作 =》 super.变量/对象名;
2、直接访问并调用父类的方法 =》super.方法名();
3、显式调用父类的构造方法,不管无参还是有参 =》 super() 无参例子 super(name)有参例子,如果子类不想调父类的无参构造,那么就必须要在子类的构造方法中显式的使用super调用父类的有参构造!!!
 
 父类:
public class a {

    public int age=11;
    public a()
    {
        system.out.println("build a(无参构造)");
    }
      public a(string name)
      {
          system.out.println(name + "build a(有参构造)");
      }
      public  void hello()
      {
          system.out.println("hello,我是a方法里的hello方法");
      }
}

子类

public class b extends a {
    public b()
    {
        system.out.println("build b(无参构造)");
    }
    public b(string name)
    {
        system.out.println(name+"build b(有参构造)");
    }
    
    public void hello()
    {
        system.out.println("父类的age值是:"+super.age); //输出父类的成员变量
        super.hello();//显式调用父类的方法
        system.out.println("hello,我是b方法里的hello方法");
    }

}
public class c extends a{
  public int age=99;
  public c() {
      system.out.println("build c(无参构造)");
  }
  public c(string name) {
      super(name);//显式调用父类的有参构造,如果不写这句的话,默认调用父类无参构造,也就是等同于super();
      system.out.println(name+"build c(有参构造)");
  }
  public  void hello()
  {
      system.out.println("hello,我是c方法里的hello方法");
  }
}

测试:

public class test {

    public static void main(string[] args) {
        // todo auto-generated method stub
       
        //子类实例化无参
        //子类无参实例化,首先会默认调用父类的无参构造,再调用子类的无参构造
        //b b1=new b(); //输出:【build a(无参构造)   build b(无参构造)】
        
        //子类实例化有参,子类有参构造显式调用父类的无参构造(如果不显式,默认还是调父类的无参构造)
        //b b2=new b("猪");//输出: 【build a(无参构造) 猪build b(有参构造)】
        
        //子类实例化有参,子类显式的调用父类的有参构造
        //c c1=new c("驴");//输出:【驴build a(有参构造) 驴build c(有参构造)】
        
        //子类实例化,调用父类的方法
        /*
        b b3=new b();
        b3.hello(); 
        //*/
        /* 输出:
         * build a(无参构造)
build b(无参构造)
父类的age值是:11
hello,我是a方法里的hello方法
hello,我是b方法里的hello方法
         */
        
        //子类和父类有公共的成员变量
        /*
        c c2=new c("虎");
        system.out.println("年龄: "+c2.age);//输出 99
        a a1=new c("虎");
        system.out.println("年龄: "+a1.age);//输出 11
        //*/
        
        //实例化子类,转为父类对象,输出的成员变量是父类的值,调用的方法是字类重写的方法
        a a2=new c();
        system.out.println("年龄: "+a2.age);//输出 11
        a2.hello();//如果c有重写方法,就显示c内的方法,如果没重写,就显示a的方法
        
    }

}

 

 

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网