聊聊Java中面向对象的this指针以及static修饰符

1、this指针

1.1、什么是this 指针

  • JAVAthis 是指代类 自身实例化的一个对象。
  • 可以理解为 对象本身的一个指针。更准确的说, this 代表当前对象的一个引用。

1.2、this的作用用法:

  • 普通的直接引用
    • 区分类成员属性和方法的形参
    • 调用当前对象的其他方法
    • 位置:在该类的任意位置都可以使用
  • 区分形参与成员名字重写, 用this来区分
  • 引用构造函数
    • 使用this来调用其他的构造方法
      • 当构造方法中需要使用其他构造方法,直接使用 this(..)
      • 且需要注意 java: 对this在构造方法中调用调用构造方法时 必须是构造器中的第一个语句
    • 位置必须是第一条语句
  • this 不能用于 static 方法。

package com.study.Java面向对象;

public class Teacher {

    String name;
    int age;

    /**
     * 无参构造方法
     */
    public Teacher() {
        System.out.println("无参构造");
        System.out.println(name);
        System.out.println(age);
    }


    public Teacher(String name){
        this.name =name;
    }
    /**
     * 有参构造方法
     */
    public Teacher(String name, int age) {
        // java: 对this的调用必须是构造器中的第一个语句
//        System.out.println("有参构造");
        this(name);
        this.age = age;
        System.out.println(this.name);
        System.out.println(this.age);

    }



    public static void main(String[] args) {
        System.out.println("---无参的情况---");
        Teacher teacher1 = new Teacher();
        System.out.println("----有参数的情况----");
        Teacher teacher2 = new Teacher("qzk", 28);
    }
}

2、static 关键字

1、static 声明的类属性

  • 在类中, static关键字 声明的成员变量为静态成员变量,或者叫做: 类属性 、类变量
  • 类变量 (类属性) 属于类, 被该类的所有实例共享,在类被载入时,显式的初始化。
  • 对该类的所有对象来说,static 成员变量 只有一份,被该类的所有变量共享。
  • 可以使用 "对象.类属性"来调用, 不过,一般使用 "类名.类属性"调用
  • static 类属性, 放置在 方法区中。
  • 注意:
    • 静态变量,即 类属性、类方法 , 在类被载入之前就被初始化了。
    • 成员变量,放在堆中, 而静态变量放在方法区中。
    • 定义静态变量时候, 必须在方法外,不能再成员方法内 ,也不能在静态方法内。
package com.study.Java面向对象;

/**
 *
 * static  修饰成员变量的时候, 表示 静态成员变量, 或者类成员变量。
 *  - 普通变量在使用的时候必须 必须对类进行实例化后生成对象调用
 *  - 类变量或静态变量可以使用 类名直接调用,也可以使用对象来调用
 *  - 在定义对象的时候, static 定义的成员变量在方法区中
 * @Author:qzk
 * @Date: 2021/11/9 7:41 下午
 */
public class StaticDemo {

    String name = "张三";
    static int age = 18;

    public static void main(String[] args) {
        StaticDemo staticDemo = new StaticDemo();
        System.out.println(staticDemo.name);
        //  这样其实也可以使用 静态变量, 也就是对象也可以使用 类的静态变量, 只是一般不这么写, 而是在在整个类中直接引用。
        System.out.println(staticDemo.age);
        System.out.println(age);  // 10
        System.out.println(StaticDemo.age); // 10
//        java: 无法从静态上下文中引用非静态 变量 name
//        System.out.println(StaticDemo.name);

        staticDemo.age = 20;
        System.out.println(StaticDemo.age); // 20
        System.out.println(staticDemo.age); //  20

        StaticDemo.age = 40;
        System.out.println(staticDemo.age);  // 40
        System.out.println(StaticDemo.age); // 40


        StaticDemo staticDemo1 = new StaticDemo();
        System.out.println(staticDemo1.age); // 40
        System.out.println(StaticDemo.age); // 40
    }

    /**
     * 下面这么写是报错的, 原因是 静态变量的声明不能在实例化的类中声明,下面的方法的调用是需要实例化对象, 实例化对象的方法中不能声明静态变量。
     * */
//    public void  test(){
//        static int a =10;
//    }
  
//    public static void  test(){
//        static int a =10;
//    }
        
}

2、static 声明的类方法

  • static 声明的静态方法, 不需要实例化对象, 就可直接调用。 类名.静态方法
  • 在调用的时候, 不会将对象的引用传递给他
    • 所以 static 方法中, 不可访问 非 static 成员
    • 静态方法 不可以以任何方法引用thissuper 关键字。
      • static 申明的 变量和方法在对象被创建之前就有了
      • 一般工具类中的方法定义时, 使用 static
package com.study.Java面向对象;

import java.util.Stack;

/**
 *
 * static  修饰成员变量的时候, 表示 静态成员变量, 或者类成员变量。
 *  - 普通变量在使用的时候必须 必须对类进行实例化后生成对象调用
 *  - 类变量或静态变量可以使用 类名直接调用,也可以使用对象来调用
 *  - 在定义对象的时候, static 定义的成员变量在方法区中
 * @Author:qzk
 * @Date: 2021/11/9 7:41 下午
 */
public class StaticDemo {

    String name = "张三";
    static int age = 18;

    public static void test1(){
        //  静态方法中不能直接调用 非静态方法
        // test2();
        // 静态方法中不能调用  静态变量
//        this.name = "李四";
        //  静态方法中可以调用静态变量
        System.out.println(StaticDemo.age);
        // 如果真的想用 非静态方法需要new一个对象出来再调用
        StaticDemo staticDemo = new StaticDemo();
        staticDemo.test2();
        System.out.println("static - test");
    }

    public void test2(){
        //  非静态方法中可以调用静态方法
//        test1();
        System.out.println("no - static -test");
    }


    public static void main(String[] args) {
        StaticDemo staticDemo = new StaticDemo();
        // 一般不这么写
//        staticDemo.test1();
        StaticDemo.test1();
    }

}

3、常见错误集锦

3.1、错误示例一: 在静态方法中使用类this

3.2、错误示例二: 在方法中不能声明静态变量

4、static 修饰 与 非 static 修饰的区别

原文地址:https://www.cnblogs.com/qianzhengkai/p/15530836.html