this和super的认识

this

this的概念:this指代当前对象,持有当前对象的地址

this不能写在静态的方法中 :

  • 无法从静态上下文中引用非静态 变量this

因为static修饰的内容会被jvm优先加载,如果this在静态区域,就会被先加载,根据this的概念,没有对象的this也就不成立

class Test2{
    public static void main(String[] args){
        System.out.println("hello");
        //新建对象
        Student2 stu1=new Student2();
        stu1.eat();//this被调用得到地址1
        Student2 stu2=new Student2();
        stu2.eat();//this被调用得到地址2
    }
}

class Student2{
    //查看this的值(this的值就是当前对象的内存地址)
    void eat(){
        System.out.println("this所在的函数this"+this);
    }
}

作用

  • 解决局部变量和成员变量的二义性(注意 set/get方法 构造方法)
  • this作为参数传递,this作为返回值
  • 在本类之间 ,构造方法之间的相互调用 this()调用无参数的构造方法,this(...)可以添加参数,表示调用有参数的构造方法
class Example{
    String name;
    int age;
    Example(String name,int age){
        this(name);//this()调用
        this.age;
    }
    Example(String name){
        this.name=name;
    }
}

class Test7{
    public static void main(String[] args){
        System.out.println("hello");
        Example exam=new Example("花花",18);
        System.out.println(exam.name);
        System.out.println(exam.age);
    }
}

注意

  • 对this的调用必须是构造器中第一个语句

super

概念

在子类中持有父类的对象

作用

  • super访问父类的成员,都必须是在有访问权限的条件之下
    • super访问父类对象中的字段 及 普通方法
    • 在子类的构造方法体第一句访问父类的构造方法
class Test{//super使用
    public static void main(String[] args){
        System.out.println("hello");
        Student stu=new Student("admin","12345");
        System.out.println(stu.getUsername());
        System.out.println(stu.getPassword());
    }
}

class User{
    //私有化属性
    private String username;
    private String password;
    public void setUsername(String username){
        this.username=username;
    }
    //提供公有的访问方法
    public String getUsername(){
        return username;
    }
    public void setPassword(String password){
        this.password=password;
    }
    public String getPassword(){
        return password;
    }
    //方法三
    public User(String username,String Password){
        this.username=username;
        this.password=password;
    }
}
class Student extends User{
    //方法一因为字段被私有化,无法直接访问
    /*Student(String username,String password){
        super.username=username;
        super.password=password;
    }*/
    //方法二因为属性私有,所以调用公有的方法
    /*Student(String username,String password){
        super.setUsername(username);
        super.setPassword(password);
    }*/
    //方法三调用父类的构造方法
    Student(String username,String password){
        super(username,password);
    }
}

特殊用法

在子类的构造方法第一句,

  1. 如果没有显示的写出对于父类构造方法的调用,那么会隐式的调用父类的无参数的构造方法!

  2. 如果有显示的写出对于父类构造方法的调用,那么会隐式的调用父类的无参数的构造方法,就不存在了

  • 子类的构造方法中一定会调用到父类的构造方法

你可能感兴趣的:(this和super的认识)