`

this and super

JVM 
阅读更多

"this"

1、可以表示在构造器中引用满足指定参数类型的其他构造器只能引用一个构造方法且必须位于开始!

this(a,b)表示调用另外一个构造函数。这里面的this就是一个特殊语法,不是变量,没有什么类型。

2、可以在一个类的非static成员内部使用,表示当前这个对象

此时,this就是一个final的普通变量,它有静态类型,就是这个类本身;它有动态类型,就是当前这个对象的类型可以对它调用成员 函数,把它传递给别的函数,等等。只要一个C类型的final变量可以出现的地方,它就可以出现。

3、表示用类的成员变量,而非函数参数,注意在函数参数和成员变量同名是进行区分!

例子

class A   {   
    int i=10; 
    private int a,b;
    public String color="绿"; //全局变量
    public A(){
     this(11);
   }
    public A(int a){
  this.a=a+1;
  System.out.println("a:"+a);
  System.out.println("this.a:"+this.a);
   }
        public void method(){   
   String color="红"; //局部变量
   i=15;  //改变全局变量i的值
   System.out.println("当前对象this调用i:"+this.i);
   System.out.println("new 一个新的对象调用i:"+new A().i); 
   System.out.println("用关键字this调用全局变量color:"+this.color);
   System.out.println("直接使用局部变量i:"+color);
       }   
    public static void main(String[] args){
     new A().method();
   }
}  

 

结果:

4为什么静态的方法中不能使用this关键字static方法的内部不能调用非静态方法

this关键字指“当前对象实例”,然而main方法是静态的,它是程序的入口,在程序编译的时候,它会自动地被JVM加载到内存中。

注意,在这个时侯,程序还没有实例化对象,所以,自然不能在main方法里使用非静态的this了。

注:如果你传递一个对象的引用到静态方法里(静态方法可以创建其自身对象),然后通过这个引用(和this效果相同),你就可以调用非静态方法和访问非静态数据成员了。

例子:

NoStatic 方法public class NoStatic {

     public void outPut(){

        System.out.println("非静态输出");

     }

}
这个是主类,test方法是static静态方法,调用了outPut的非静态的方法。
传递一个对象的引用,这里将NoStatic 的引用作为参数传递到test

public class Static {   

    public static void main(String[] args) {   

        NoStatic ns =new NoStatic();   

        Static.test(ns);   

    }         

    public static void test(NoStatic ns){   

        ns.outPut();  //静态方法里调用了非静态(特例) 

    }   

}  

 

 

"super"
1
super();表示调用父类的构造方法,只是调用方法,不构造对象。是一个特殊语法,不是变量,没有什么类型

2super.fun();表示调用父类的某方法,在继承的时候这个方法是肯定被继承下来的。

如果fun()这个方法在子类没有重写,那么super.fun();实际上跟直接调用fun();是一样的。如果被重写了,那么super.fun();就是重写前的,fun();就是重写后的。也可以在一个类的非static成员内部使用。比如super.method()

3super的另外一个作用是调用父类的protected函数。只有通过"super",我们才能操作父类的protected成员。
4,java
里在了类中用super调用父类构造函数时,为什么调用语句必须是子类的第一条语句啊?

如果想用super继承父类构造的方法但是没有放在第一行的话 ,那么在super之前的语句肯定是为了满足想要完成某些行为的语句但是又用了super继承父类的构造方法那么以前所做的修改就都回到以前了 ,也就是说又成了父类的构造方法了,比如 :class Father { public Father() {String int age=0;} } class Son extends Father { public Son() {String ; super();} } //这样子的话就会把Son里面的name又变成了null 没有达到想要的效果

 附:子类继承父类的所有成员变量和成员方法,但不继承父类的构造方法。

父类的缺省构造函数在子类初始化时会被自动调用来完成相应的父类对象初始化,在子类的构造方法中,可使用super(参数列表)调用父类的构造方法。

 

0
9
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics