this

this:
    1 this是一个关键字,是一个引用,保存内存地址指向本身。
    2 this可以使用在实例方法中,也可以使用在构造方法中。
    3 this出现在实例方法中其实代表的是当前对象。
    4 this不能使用在静态方法中。
    5 this. 大部分情况下可以省略,但是用来区分局部变量和实例变量的时候不能省略。
    6 this() 这种语法只能出现在构造方法第一行,表示当前构造方法调用本类其他的构造方法,目的是代码复用。
 
 
 
java中的三大变量
 
案例1:
/*
    this:
        1 this是一个关键字,全部小写。
        2 this是什么,在内存方面是怎样的。
            一个对象一个this。
            this是一个变量,是一个引用。this保存当前对象的内存地址,执行自身。
            this存储在堆内存当中对象的内部。
        3 this只能使用在市里方法中。谁调用这个实例方法,this就是谁。
            所以this代表的是:当前对象。
            
        4 this. 大部分情况下是可以省略的
        
        5 为什么this. 不能使用在静态方法中?
            this代表当前对象,静态方法中不存在当前对象。
*/
public class ThisTest01{
    public static void main(String[] args){
        Customer c1 = new Customer("zhangsan");
        c1.shopping();
        Customer c2 = new Customer("lisi");
        c2.shopping();
        
        // Customer.doSome();
    }
}

// 顾客类
class Customer{
    // 属性
    // 实例变量
    String name;
    
    // 构造方法
    public Customer(){
    
    }
    
    public Customer(String s){
        name = s;
    }
    
    // 顾客购物的方法
    // 实例方法
    public void shopping(){
        // 这里的this是谁?this是当前对象。
        // c1调用shopping(),this是c1
        // c2调用shopping(),this是c2
        // this. 是可以省略的
        // this. 省略的话,还是默认访问“当前对象”的name
        System.out.println(this.name + "正在购物");
    }
    
    // 静态对象
    public static void doSome(){
        // this 代表的是当前对象,而静态方法的调用不需要对象。矛盾了。
        //System.out.println(this);// java:55: 错误: 无法从静态上下文中引用非静态 变量 this
    }
}

class Student{
    // 实例变量,怎么访问? 必须先new对象,通过"引用." 来访问。
    String name = "zhangsan";
    
    // 静态方法
    public static void m1(){
        // this代表的是当前对象。
        //System.out.println(name);    
        
        // this.代表的是当前对象。
        //System.out.println(thsi.name);
        
        // name是当前对象的名字。
        //System.out.println(name);
        
        // 除非你这样
        Student s = new Student();
        System.out.println(s.name);
    }
    
    // 为什么set和get方法是实例方法?
    public void setName(String s){
        name = s;
    }
    
    public String getName(){
        return name;
    }
    
    // 又回到上午的问题了?什么时候定义为实例方法,什么时候定义为静态方法?
    // 如果方法中直接访问了实例变量,该方法必须是实例方法。
}

 

习题1:

public class DateTest01{
    private String nian;
    
    private String yue;
    
    private String ri;
    
    // 无参构造方法
    public DateTest01(){
    
    }
    
    // 有参构造方法
    public DateTest01(String year,String mouth,String day){
        nian = year;
        yue = mouth;
        ri = day;
    }
    
    //实例方法
    public void setNian(String i){
        nian = i;
    }
    
    public String getNian(){
        return nian;
    }
    
    public void setYue(String i){
        yue = i;
    }
    
    public String getYue(){
        return yue;
    }
    
    public void setRi(String i){
        ri = i;
    }
    
    public String getRi(){
        return ri;
    }
    
    // 实例方法
    public void getYearMonthDay(){
        System.out.println("当前年是:" + this.nian);
        System.out.println("当前月是:" + this.yue);
        System.out.println("当前日是:" + this.ri);
    }
    
    //静态方法
    public static void main(String[] args){
        
        // 创建实例对象
        DateTest01 dt = new DateTest01();
        dt.setNian("2020");
        dt.setYue("06");
        dt.setRi("02");
        // 调用实例方法
        dt.getYearMonthDay();
        
        DateTest01 dt2 = new DateTest01();
        dt2.setNian("2020");
        dt2.getYearMonthDay();
    }
}

 

案例2:

/*
    1 this可以使用在实例方法中,不能使用在静态方法中。
    2 this关键字大部分情况下可以省略,什么时候不能省略呢?
        在实例方法中,或者构造方法中,为了区分局部变量和实例变量,这种情况下:this. 是不能省略的。
*/
public class ThisTest03{
    public static void main(String[] args){
        Student s = new Student();
        s.setNo(1111);
        s.setName("张三");
        
        System.out.println(s.getNo());
        System.out.println(s.getName());
        
        Student s2 = new Student(2222,"李四");
        
        System.out.println(s2.getNo());
        System.out.println(s2.getName());
        
    }
}

class Student{
    //学号
    private int no;
    //姓名
    private String name;
    
    // 实例方法 get set方法
    public int getNo(){
        return no;
        // return this.no;
    }
    
    /*public void setNo(int i){
        no = i;
    }*/
    
    /*public void setNo(int no){// java就近原则  他只会找最近的那一个进行赋值,所以他把自己给了自己
        no = no;// 这两个变量都是局部变量no,和实例变量no没关系
    }*/
    
    public void setNo(int no){
        this.no = no;
    }
    
    /*public String getName(){
        return name;
    }*/
    
    // 原来的样子
    public String getName(){//getName实际上获取的是“当前对象”的名字
        return this.name;
    }
    
    public void setName(String name){
        this.name = name;
    }
    
    //无参构造方法
    public Student(){
    
    }
    
    // 有参构造方法
    public Student(int no,String name){
        this.no = no;
        this.name = name;
    }
}
posted @ 2020-06-06 00:07  xlwu丶lz  阅读(337)  评论(0编辑  收藏  举报