this、super 关键字

学习.net中我们使用过this关键字,但是

super:代表父类的存储空间标识(父类的引用)

this:代表当前对象的引用(谁调用就代表谁)
访问成员是谁? this.成员变量     本类的
super.成员变量     父类的
this.成员方法名()     本类的
super.成员方法名()     父类的
一、为什么使用this关键字?
this关键字 本类成员方法中,访问本类的成员变量
本类成员方法中,访问本类的另一成员方法
本类构造方法中,访问本类另一构造方法

      当方法中的局部变量和和类的成员变量重名的时候,根据“就近原则”,优先使用局部变量。如果此时要访问本类当中的成员变量,则需要this.成员变量名。   

demo类:sayHello()方法中有两个name ,根据就近原则,name为参数中的name, 结果:老王你好,我是老王

    public class demo {
        //局部变量name
        String name;
     
        //(String name 参数name为局部变量)
        public void sayHello(String name) {
            System.out.println(name + "你好,我是" + name);
        }
    }

 修改后的demo类,此时如果访问成员变量name,则需要用关键字this去标识,结果:老王你好,我是程序猿

    public class demo {
        //局部变量name
        String name;
     
        //(String name 参数name为局部变量)
        public void sayHello(String name) {
            System.out.println(name + "你好,我是" + this.name);
        }
    }

main方法:main方法通过demo类调用的sayHello()方法,所以demo类就是this。(通过谁调用的方法,谁就是this)

    public class demo1 {
        public static void main(String[] args){
           demo demo =new demo();
           demo.name="程序猿";//为成员变量赋值
           demo.sayHello("老王");//调用sayHello()方法,并传参“老王”
        }
    }

  注意:本类构造方法中,访问本类另一构造方法

             this() 调用必须是构造方法中的第一个语句,且是唯一的一个。

            super和this关键字都必须在构造方法的第一行,所以不能同时出现。

 
二、为什么是用super关键字?
super关键字 子类成员方法中访问父类成员变量
子类成员方法中访问父类成员方法
在子类构造方法中,访问父类的构造方法。

父类

    public class Father {
        int x=10;//父类程成员变量x
        
        //父类成员方法method()
        public void method(){
            System.out.println("父类的方法");
        }
    }

子类

    public class Son extends Father {
        int x =20;
        public Son(){
            super();//在子类构造方法中,访问父类的构造方法
        }
     
        public void method() {
            System.out.println("子类的成员变量"+x);
            System.out.println("父类的成员变量"+super.x);//子类成员方法中访问父类成员变量,结果为10
     
            System.out.println("子类的方法");
            super.method();//子类成员方法中访问父类成员方法,结果为”父类的方法“
        }
    }

main方法

 
三、this、super关键字图解

父类

    public class Father {
        int num=10;//父类程成员变量x
     
        //父类成员方法method()
        public void method(){
            System.out.println("父类的方法");
        }
    }

子类

    ublic class Son extends Father {
      int num=20;
     
        @Override
        public void method() {
            System.out.println("子类方法");
        }
     
        public void show(){
            int num=30;
            System.out.println(num);
            System.out.println(this.num);
            System.out.println(super.num);
        }
     
     
    }

main方法:main 方法创建子类对象的时候,先创建父类空间,在创建子类对象本身。

    public class main {
        public static void main(String[] args){
           Son son=new Son();
           son.show();
           son.method();
        }
    }

图解:

 
---------------------
作者:冯佳兴
来源:CSDN
原文:https://blog.csdn.net/fjxcsdn/article/details/90142524
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-05-14 20:52  天涯海角路  阅读(96)  评论(0)    收藏  举报