1 this 关键字
1.1 this 访问本类属性
this代表当前对象的一个引用
所谓当前对象,指的是调用类中方法或属性的那个对象
this只能在方法内部使用,表示对“调用方法的那个对象”的引用
this.属性名,表示本对象自己的属性
对象的一个属性被方法或构造器的参数屏蔽(同名参数)
public class Person{
String name;
public Person(String name){
//用以区分对象中的属性名,参数名
this.name = name;
}
}
1.2 this 调用方法
this关键字调用类的重载构造函数
this关键字必须位于构造函数的第一行
public class Person{
String name;
int age;
public Person(int age){
this.age = age;
}
public Person(String name){
this(1);
this.name = name;
}
}
this.方法名:表示当前对象自己的方法
public class Student{
public void eat(){
System.out.println("吃饭");
}
public void talk(){
this.eat();
System.out.println("吃完饭再说话");
}
}
this 关键字使用注意
this不能用于静态方法和静态块
main方法也是静态的,所以this也不能用于main方法
2 static 关键字
2.1 static 静态变量
static变量也称作静态变量,也叫做类变量
静态变量被所有的对象所共享,在内存中只有一个副本
当且仅当在类初次加载时会被初始化
静态变量属于类
通过类名就可以直接调用静态变量
也可以通过对象名.静态变量名调用
static变量
public class Student{
private String name;
private static String schoolName;
private static int count;
public Student(String name){
this.name = name;
count++;
}
public void showStuInfo(){
System.out.println("学生的姓名是" + this.name + ",学校的名字是" + Student.schoolName);
}
public static void main(String[] args){
Student.schoolName = "实验中学";
Student s1 = new Student("张三");
Student s2 = new Student("李四");
Student s3 = new Student("王五");
s1.showStuInfo();
s2.showStuInfo();
s3.showStuInfo();
System.out.println("学生的数量是:" + Student.count);
System.out.println("学生的数量是:" + s1.count);
}
}
实例变量和静态变量区别
静态变量属于类,该类不生产对象,通过类名就可以调用静态变量
实例变量属于该类的对象,必须产生该类的对象,才能调用实例变量
静态变量随着类的加载,存在于方法区中
实例变量随着对象的建立,存在于堆内存中
静态变量在程序开始时创建,在程序结束时销毁
实例变量在对象创建时创建,在对象被销毁时销毁
2.2 静态方法
static修饰的方法,叫静态方法,也叫做类方法
静态方法中,不能直接访问非静态成员变量和非静态成员方法
静态方法中,不能使用 this 关键字
通过类名可以直接调用静态方法
也可以通过对象名.静态方法名调用
静态方法和静态方法访问
public class Student{
private String name;
private int age;
private int studentId;
private static String classRoom;
public static void showClassRoom(){
//静态方法中不能使用this关键字
System.out.println("教室3301");
}
public static void main(String[] args){
Student.showClassRoom();
}
}
2.3 静态块
静态代码块在类加载时执行,并且只执行一次
静态代码块在类中可以有多个
静态代码块中不能有this关键字
静态块可以有多个,按照顺序执行
public class Emp{
static{
System.out.println("欢迎");
}
static{
System.out.println("再次光临");
}
}
静态块、匿名构造块、构造函数
执行顺序
public class Son{
static{
System.out.println("静态块1");
}
private String name;
public Son(String name){
this.name = name;
System.out.println("构造方法");
}
{
System.out.println("匿名构造块");
}
static{
System.out.println("静态块3");
}
public static void main(String[] args){
Son s1 = new Son("张三");
Son s2 = new Son("李四");
Son s3 = new Son("王五");
}
}
输出如下:
静态块1
静态块3
匿名构造块
构造方法
匿名构造块
构造方法
匿名构造块
构造方法
执行的顺序为:静态块 --> 匿名块 --> 构造方法