this与super的区别

来源:互联网 发布:h3c交换机查看mac地址 编辑:程序博客网 时间:2024/05/22 02:12

介绍: this:当前对象

                super:直接父类对象

                this():当前类的无参构造方法,也可以指定有参的如:this(a)

                super():直接父类的无参构造方法,也可以指定有参的如:super(a)

注意:1,当在方法内调用一个变量b,编译器会向上遍历,直到找到最近的一个引用变量为止:b—>this.b—>super.b,如果未找到,编译器将显式提                   示错误信息;

           2,当变量b的定义只发生在父类时,此时  b=this.b=super.b;

           3,当局部变量b覆盖成员变量b时,使用this.b调用成员变量,此时的成员变量包括子类新增和继承的变量,不包含隐藏变量;

           4,当子类成员变量b覆盖父类成员变量b时,使用super.b调用这个被隐藏的成员变量;

           5,当子类重写了父类方法method(),可以使用super.method()来调用父类被隐藏的方法;

           6,super()与this()具备硬性使用条件,否则编译无法通过——Constructor call must be the first statement in a constructor.即

                   二者出现的位置必须是构造方法的第一行

           7,super()与this()并不像super.b与this.b一样可以向下替代,因为子类并不能继承父类的构造方法,仅仅是包含了父类的有参或无参构造器                      (默认无参);

           8,Implicit[不言明的,隐式的] super constructor Subject() is undefined. Must explicitly[明确地] invoke another constructor,这句话表明:

                  子类的构造方法中必须调用父类的构造方法,如果没有显式写出super(),则默认调用父类的无参构造方法。但此时如果父类写了有参的构                   造方法,编译器就不会再为父类默认创建无参构造方法,此时super()没有被定义,则必须在子类的构造方法中写明super(参数)或者在父类                   中显式写出父类的无参构造方法;

实例:

父类

[java] view plain copy
  1. public class Subject{    
  2.     public String a="我是父类全局变量a";  
  3.       
  4.     public String b="我是父类全局变量b";  
  5.       
  6.     public void operation(){  
  7.         System.out.println("我是父类方法");  
  8.     };   
  9.     public void operation1(){  
  10.         System.out.println("我是父类方法");  
  11.     };   
  12. }    
子类

[java] view plain copy
  1. public class MySubject extends Subject {    
  2.     public String b="我是子类全局变量b";  
  3.     @Override    
  4.     public void operation() {    
  5.         System.out.println(a);  
  6.         System.out.println(this.a);  
  7.         System.out.println(super.a);  
  8.     }    
  9.     @Override    
  10.     public void operation1() {    
  11.         String b="我是局部变量b";  
  12.         System.out.println(b);  
  13.         System.out.println(this.b);  
  14.         System.out.println(super.b);  
  15.     }    
  16.       
  17.     public static void main(String[] args) {  
  18.         Subject sub=new MySubject();  
  19.         sub.operation();    
  20.         sub.operation1();    
  21.           
  22.     }    
  23. }    
运行结果

[java] view plain copy
  1. 我是父类全局变量a  
  2. 我是父类全局变量a  
  3. 我是父类全局变量a  
  4. 我是局部变量b  
  5. 我是子类全局变量b  
  6. 我是父类全局变量b