一、static
static关键字的作用可以用一句话描述,即:方便在没有创建对象的情况下进行调用,包括变量和方法。
1、如果在声明变量的时候使用了static关键字,那么这个变量被称为静态变量。静态变量只在类加载的时候获取一次内存空间,这使得静态变量很节省内存空间。
package com.example.rookie.staticdemo;
/**
* @author
* @date 2021/9/7 10:58
*/
public class Student {
//姓名
private String name;
//年龄
private int age;
//学校名称
//private String school = "理工大学";
private static String school = "理工大学";
}
假设理工大学录取一万名新生,那么在创建一万个Student对象的时候,所有字段(name、age、school)都会获取到一块内存,学生的姓名和年纪不尽相同,但都属于理工大学,如果每创建一个对象,school这个字段都要占用一块内存的话就很浪费,因此最好将schoo字段设置为static,这样就只占用一块内存,而不是一万块。
2、成员变量、静态变量
package com.example.rookie.staticdemo;
/**
* @author
* @date 2021/9/7 11:10
*/
public class Counter {
private int count = 0;
public Counter() {
count++;
System.out.println(count);
}
public static void main(String[] args) {
Counter c1 = new Counter();
Counter c2 = new Counter();
Counter c3 = new Counter();
}
}
我们创建一个成员变量count,并在构造函数中让它自增,因为成员变量会在创建对象的时候获取内存,因此每一个对象都会有一个count的副本, count值不会随着对象的增多而递增。
输出结果:
package com.example.rookie.staticdemo;
/**
* @author
* @date 2021/9/7 11:15
*/
public class StaticCounter {
private static int count = 0;
public StaticCounter() {
count++;
System.out.println(count);
}
public static void main(String[] args) {
StaticCounter s1 = new StaticCounter();
StaticCounter s2 = new StaticCounter();
StaticCounter s3 = new StaticCounter();
}
}
由于静态变量只会获取一次内存空间,所以任何对象对它的修改都会得到保留,所以每创建一个对象,count的值就会加1.
三、this、super
package com.example.rookie.staticdemo;
/**
* @author
* @date 2021/9/7 16:27
*/
public class ThisMethod {
void out() {
System.out.println("Hello Word!");
}
ThisMethod getResult() {
return this;
}
public static void main(String[] args) {
ThisMethod tm = new ThisMethod();
tm.getResult().out();
}
}
输出结果为:
getResult()方法返回了this关键字,指向的是new ThisMethod()这个对象,所以可以紧接着调用out()方法,达到了链式调用的目的,也是this关键字非常经典的一种用法。
需要注意的是:this关键字作为方法的返回值的时候,方法的返回类型为类的类型。
四、final
被final修饰的变量无法重新赋值,换句话说,final变量一旦初始化,就无法更改。
被final修饰的方法无法被重写。
被final修饰的类无法被继承,假如这个类的一些方法存在一些问题的话,我们就无法通过重写的方式去修复它。
final修饰的成员变量必须有一个默认值,否则编译器会提醒没有初始化。
final和static一起修饰的成员变量叫做常量,常量名必须大写。
private static final String NAME = "TEST";
五、instanceof
判断对象是否符合指定的类型,结果要么为true,要么为false。
通常我们是这样使用操作符的:
package com.example.rookie.demo;
/**
* @author
* @date 2021/9/8 9:20
*/
public class InstanceofDemo {
public static void main(String[] args) {
Object obj = "sdada";
//先判断类型
if (obj instanceof String) {
//然后强制转换
String s = (String) obj;
//然后才能使用
}
}
}