关键字
1.this
this表示本类的一个对象,谁调用就是指向谁
this使用场景:
(1)this.属性;在类的方法中操作属性(main方法和static修饰的方法除外)
如果方法没有局部变量名字与属性名一样,this.属性中的this就可以省略。
(2)与上同理this.方法也可以省略this。
(3)构造方法与方法的调用情况又不相同:
new 构造方法() 调用有参构造方法创建一个新的对象
this()只是调用构造方法,不会新建对象
public class Student{
String name;
int age;
//有参构造方法
public student(String name,int age){
this.name = name;
this.age = age;
}
public Student(){
new Student("张三",19);//下面的对象调用了无参构造方法,然后无参构造自己new了一个有参构造,但是没有人接收。也不会被zs接收,因为这个是新的对象,但是用this情况就不一样了。
}
}
public class StudentTest{
public static void main(String[] args){
//创建一个student对象
Student zs = new Student();
System.out.println(zs.name);//null
System.out.println(zs.age);//0
}
}
this()调用构造方法的限制条件
1)必须在构造方法中使用,在别的地方使用会编译报错
2)必须位于被调用的构造函数第一行要不然也会编译报错
Static 静态
static修饰的含义
static修饰的东西,会被该类的所有对象共用;
非static修饰的,那它就独立于每个对象
1.修饰属性
这个属性不在是我们之前的属性,之前的属性都是成员属性,实例属性(即每一个成员都会有自己的属性)被static修饰的属性那成为类属性 静态属性 常量。(即这个类所创建的所有对象会共用一个属性)
public class Demo{
int a;//成员属性
static int b;//类属性
public static void main(String[] args){
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.a = 10;
d1.b = 10;//给对象d1的a,b变量分别赋值10,b为类变量,现在所有对象的b都为10
System.out.println(d1.b==d2.b);//因为是类变量,所以就算d2没有赋值也会输出true
d2.a = 20;
d2.b = 20;//给对象d2的a,b变量分别赋值20,因为b为类变量所以会覆盖d1.b的值
System.out.println("d1.a="+d1.a+",d1.b="+d1.b);
System.out.println("d2.a="+d2.a+",d2.b="+d2.b);
//最后输出d1.a = 10,d1.b = 20;
//d2.a = 20,d2.b = 20;
}
}
对于static修饰的属性或者方法,可以使用对象名.名字的方法调用,也可以使用类名.名字的方式调用,更推荐后者,因为后者的代码可读性高,能让人知道这个是类属性或者类变量。
类属性与实例属性的区别
类属性是该类所有对象共享,共享属性在每个对象都是独立的
调用类属性,不需要创建对象来调用,而实例属性则需要创建对象
类属性可以使用类名.来调用,还可以使用对象名.而实例属性只能使用后者
类属性的使用场景:该类的某个属性被所有的对象共享,使用类属性,其他情况一般不使用。
2.修饰方法
被修饰的称为静态方法
没有被修饰的称为非静态方法或者普通方法
静态方法被调用可以直接通过类名.来调用。使用静态方法不需要创建对象
静态方法使用注意事项
不要滥用静态方法,静态资源不会马上释放,而是等到整个程序停止进程才会释放
使用场景:一般是在工具类中使用jdk中Arrays(数组工具类),他的方法都是static
非静态方法内部使用静态的资源也可以使用非静态资源,但静态方法只能使用静态资源
类加载的过程
先加载静态资源,然后在加载非静态资源
Demo.java 编译(javac)—>Demo.class 类加载器(classloader)—>内存
在内存中,先加载静态资源,然后在加载非静态资源
3.静态代码块
//静态代码块
public class A{
static{//静态代码块
//逻辑代码
}
}
执行的时机,当这个类被加载到内存的时候,就执行 每个类的class文件只执行一次
使用场景:项目启动的时间,需要进行一些初始化操作,一般把这种初始化操作加入到静态代码块中
ps:一个类可以有多个静态代码块,多个静态代码块执行顺序是从上到下,只执行一次;
同理静态代码块也只能使用静态资源;