面对对象this关键字

this这是一个引用的类型,this是java里的一个关键字,是一种引用类型,在堆(heap)当中,的每个java对象都有一个this指向自己。this代表着当前对象的引用,

他的作用是:

      1.区分成员变量。

      2.区分局部变量

      3.调用成员变量或者局部变量

      4.调用成员方法和构造方法

注意:

      这俩关键字都不可在static静态方法内标线

每一个行为发生的时候,肯定会有一个发生这个行为的主体。在编程语言里面每一个定义的方法里,都会有一个this关键字,这个this关键不是由在那儿定义来决定的,而是由谁来执行的决定的。这是判断this关键。

1、thia概述  

    比如说吃饭这个方法它是由上帝来定义的,世界上所有的人来执行。吃饭这个行为发生的时候,主体就是在吃饭的这个人,也就是要有人执行吃饭这个行为。 有时候我们需要在一个行为(方法)里,能明确知道这个行为是谁来执行的,确切的说就是我要知道谁在吃饭。

function eatSomthing() { this.eat }

在编程语言里面每一个定义的方法里,都会有一个this关键字,这个this关键不是由在那儿定义来决定的,而是由谁来执行的决定的。这是判断this关键。

2、this原理   

比如:这个人是张三,那么吃饭的主体就是“张三”,

张三.eat();//这个吃饭里的this就是张三这个对象。

也就是判断(.)前面的对象是谁,那这个this就是谁。 但有的方法是直接执行的,前面没有点,就更没有执行对象,那就this关键是谁呢

像alert方法,直接执行的,那alert方法里的this是谁呢?凡是可以像alert这样直接运行的方法,都是全局方法(全局方法叫函数),全局方法的执行,都是相当于前面省略掉window.,也就是说alert()相当于window.alert(),那这样直接运行的方法里的this关键字,肯定就是window了。

*注意:方法里的this表示的是那个对象,是由谁来执行决定的。和在那儿定义的没有关系。

补充:this表示的对象,是这个方法活动的"上下文"。所谓的"上下文",也就是表示当前的这些代码的活动范围,当前的活动(代码的执行)在那个对象上的发生的意思。

吃饭这个活动,是在张三这个对象上发生的,则张三是吃饭的下下文。在body里去查找的div元素,则body是这个查找活动的上下文。那这个this,就是这个方法运行活动的范围了。

方法里this当前这个方法运行的上下文,但上下文不仅限于是this(就是整体与个体的区别)。

 

this:this关键字只能用于方法的方法体内,表示对“调用方法的那个对象”的引用。当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this。因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。

 

super:super关键字和this作用类似,将被隐藏的父类的成员变量和成员方法变为可见,或者说用来引用被隐藏的父类的成员变量和成员方法。

 

1. superthis调用成员变量和方法

 

有时会遇到子类中的成员变量或方法与父类中的成员变量或方法同名。因为子类的成员变量或方法名优先级高,所以子类的同名成员变量或方法就隐藏了父类的成员变量或方法,如果想要使用父类中的成员变量或方法,就需要用到super。 

 

class Country {

       String name;

       voidvalue() {

              name = "China";

       }

}

 

class City extends Country {

       String name;

       void value() {

              name = "Hefei";

              super.value();

              //不调用此方法时,super.name返回的是父类的成员变量的值null

              System.out.println(name);

              System.out.println(super.name);

       }

       public static void main(String[] args) {

              City c=new City();

              c.value();

       }

}

 

结果为:Hefei

        China

 

为了在子类中引用父类中的成员变量name和方法value(),在代码中使用了super、super.name和super.value()。若不调用super.value(),super.name返回父类成员变量默认值null,调用此方法时,super.value()方法把成员变量name赋值为China,再利用super.name调用父类的成员变量的值。

 

另外,要注意的是super.name调用的是父类的成员变量的值。

 

class Country {

       String name="xianfan";

       String value(String name) {

              name = "China";

              return name;

       }

}

 

class City extends Country {

       String name;

       String value(String name) {

              name= "Hefei";

              super.value("失败");

              //不调用此方法时,super.name返回的是父类的成员变量的值null

              System.out.println(name);

              System.out.println(super.name);

              return name;

       }

 

       publicstatic void main(String[] args) {

              City c=new City();

              c.value("成功");

       }

}

    结果为:Hefei

            xianfan

 

此时,super.name返回的值是父类成员变量的值xianfan,而此时的super.value()方法是不起作用的。

 

2. superthis调用构造方法

 

class Person {

       publicstatic void prt(String s) {

              System.out.println(s);

       }

 

       Person() {

              prt("A Person.");

       }

 

       Person(String name) {

              prt("A person name is:" + name);

       }

}

 

public class Chinese extends Person {

       Chinese() {

              super();              //调用父类构造方法(1)

              prt("A chinese.");//(4)

       }

 

       Chinese(String name) {

              super(name);      //调用父类具有相同形参的构造方法(2)

              prt("his name is:" + name);

       }

 

       Chinese(String name, int age) {

              this(name);          //调用当前类具有相同形参的构造方法(3)

              prt("his age is:" + age);

       }

 

       publicstatic void main(String[] args) {

              Chinese cn = new Chinese();

              cn = new Chinese("kevin");

              cn = new Chinese("kevin", 22);

       }

}

 

结果为:A Person.

        A chinese.

        A person name is:kevin

        his name is:kevin

        Aperson name is:kevin

        his name is:kevin

        his age is:22

 

在这段程序中,this和super不再是像以前那样用“.”连接一个方法或成员,而是直接在其后跟上适当的参数,因此它的意义也就有了变化。super后加参数的是用来调用父类中具有相同形式参数的构造方法,如(1)和(2)处。this后加参数则调用的是当前类具有相同形式参数的构造方法,如(3)处。当然,在Chinese的各个重载构造方法中,this和super的一般用法仍可使用,比如(4)处,你可以将它替换为“this.prt”(因为它继承了父类中的那个方法)或者是“super.prt”(因为它是父类中的方法且可被子类访问),它照样可以正确运行。但这样似乎就有点画蛇添足的味道了。

 

3.  子类的构造方法如果要引用super的话,必须把super放在方法的首行。

 

class Base {

       Base() {

              System.out.println("Base");

       }

}

 

public class Checket extends Base {

       Checket() {

              super();  //调用父类的构造方法,一定要放在方法的首个语句

              System.out.println("Checket");

       }

       publicstatic void main(String argv[]) {

              Checket c = new Checket();

       }

}

 

如果想用super调用父类构造的方法,但是没有放在第一行的话,那么在super之前的语句,肯定是为了满足自己想要完成某些行为的语句,但是又用super调用父类的构造方法,那么以前所做的修改就都回到以前了,就是说又成了父类的构造方法了。

 

总结:

 

1)super(参数):调用父类中的某一个构造方法,应该为构造方法中的第一条语句。

2)this(参数):调用本类中另一种形式的构造方法,应该为构造方法中的第一条语句。

 

3)super:引用当前对象的直接父类中的成员,用来访问直接父类中被隐藏的成员变量或方法。父类与子类中有相同成员时使用,如:super.变量名或super.成员方法名(实参)。

 

4)this:代表当前对象名,在程序中易产生二义性之处,应使用this来指明当前对象。如果方法的形参与类中的成员变量同名,这时需用this来指明成员变量名。

 

5)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造方法,那么在编译的时候就会报错。

 

6)this()和super()不能同时出现在一个构造方法里面,因为this必然会调用其它构造方法,其它构造方法必然也会有super语句的存在,在同一个构造方法里面有相同的语句就失去了语句的意义,编译也不会通过。

 

7)this和super都指的是对象,所以均不可以在static方法中使用。

super概述

 

super 关键字与 this 类似,this 用来表示当前类的实例,super 用来表示父类。 

super 可以用在子类中,通过点号(.)来获取父类的成员变量和方法。 

super 也可以用在子类的子类中,Java 能自动向上层类追溯。 

父类行为被调用,就好象该行为是本类的行为一样,而且调用行为不必发生在父类中,它能自动向上层类追溯。

 

super 关键字的功能: 

调用父类中声明为 private 的变量。 

点取已经覆盖了的方法。 

作为方法名表示父类构造方法。

 

调用隐藏变量和被覆盖的方法

  

 

 

运行结果: 

Animals can move 
Dogs can walk and run 
Please remember: Animals are human’s good friends

 

move() 方法也可以定义在某些祖先类中,比如父类的父类,Java 具有追溯性,会一直向上找,直到找到该方法为止。

 

通过 super 调用父类的隐藏变量,必须要在父类中声明 getter 方法,因为声明为 private 的数据成员对子类是不可见的。

 

学习java给大家推荐一个学习交流群,里面有大量的学习资料,首先是二二零,中间是一四二,最后是九零六

 

调用父类的构造方法 

在许多情况下,使用默认构造方法来对父类对象进行初始化。当然也可以使用 super 来显示调用父类的构造方法。 

 

 

运行结果: 我是一只可爱的小狗,我的名字叫花花,我3岁了 

注意:无论是 super() 还是 this(),都必须放在构造方法的第一行。 

值得注意的是:在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。 
不能在构造方法以外的任何方法内调用构造方法。 

在一个构造方法内只能调用一个构造方法。 

如果编写一个构造方法,既没有调用 super() 也没有调用 this(),编译器会自动插入一个调用到父类构造方法中,而且不带参数。 

最后注意 super 与 this 的区别:super 不是一个对象的引用,不能将 super 赋值给另一个对象变量,它只是一个指示编译器调用父类方法的特殊关键字。

posted @ 2020-01-02 09:38  晚灯  阅读(262)  评论(0编辑  收藏  举报