聊聊Java中面向对象的this指针以及static修饰符
1、this指针
1.1、什么是this
指针
- 在
JAVA
中this
是指代类 自身实例化的一个对象。 - 可以理解为 对象本身的一个指针。更准确的说,
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
成员 - 静态方法 不可以以任何方法引用
this
和super
关键字。
-
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
修饰的区别