1:static理解
在调用一个类的时候首先会先加载这个类中的static修饰的成员,调用这个类的时候在jvm中的方法去会开辟一个空间,这个空间分为静态区和非静态区,静态成员放在静态区,静态区的成员是公共的,别的也可以访问,当静态区的值被其他修改了以后别的在调用就是被修改后的,因为他是公共的。静态的可以被直接 类名.方法名调用,例如:Arrays.sort就是类名加方法名。
这是一个static修饰变量的内存的图解。
static修饰的静态方法:
调用被静态修饰方法时候在其它类中调用可以直接被调用,例如如下代码:
public class TestMain{
public static void eat(){
//TODO
}
}
class Test{
TestMain.eat();
}
如果没有静态修饰就需要new一个对象再调用,有静态修饰的可以直接调用,静态方法不是实例,不能使用this关键字。静态方法只能操作静态方法不能操作非静态的,而非静态的成员方法既可以访问静态的也可以访问非静态的。
2:final关键字
最终的意思,其实就是这个意思,被final修饰的变量就不能再改变了
可以修饰的:
修饰类:被final修饰类不能被继承,变成了一个太监类
修饰方法:被final修饰的方法子类可以使用但是子类就不能重写了
修饰变量:被fianl修饰的变量只能被复制一次不能改变他的值,但是如果一个对象被final修饰了,那么他的地址值不能改变,但是却可以改变这个对象的值。
发现他和abstract其实是死敌,abstract是必须被重写,而final是不能修改不能重写
非静态代码块和静态代码块
非静态代码块
就是直接一个{ 。。。 },可以给常量初始化,第一次赋值,和if一样出了这个大括号的值就不行了
在构造代码块中其实会先调用一个父类的无参构造,会先执行super(),只不过看不到;
他会在每一个构造方法执行之前执行这个代码块,又因为new对象其实是在调用有惨或者无参的构造方法,所以在new对象的时候会提前去调用这个代码块,如果有父类那么就会先去执行父类的无参构造然后再赋值在回来。因为构造方法默认有个一个super();
有一个隐式三步:
- super( );
- 给非静态成员变量赋值
- 执行构造代码块(一般都是2-3,因为直接先构造代码块后给成员变量赋值,调用之前还没有定义变量,会报错,除非用this.去调用
静态代码块就是 static{。。。。};是在类被调用以后执行静态代码块
接口:
接口的格式:权限修饰符interface 名称(){}
类里面成员:常量,抽象方法 jdk1.8之前是只有这两个,1.8开始就有静态方法和默认方法,默认方法就是可以写方法体不用必须被重写
常量格式:其实在写的时候可以例如:int A = 10; 其实他是public static final int A= 10;这个是默认加了final修饰符,他是不可变的,所以他是一个常量
抽象方法格式:平常写的话就是: 返回值类型 方法名();实际上默认的是public abstract 返回值类型 方法名();如果接口被实现了,那么方法必须被重写,除非是1.8开始新增的默认方法;
枚举:枚举是一个类:枚举的格式:权限修饰符 enum 枚举名称{。。。}
它的好处是可以给里面写一些值,随时哦用随时区,而且也可以定义一个这个枚举类型的数据,只能写这个枚举里面的值,其实里面的值是一个对象而且是final修饰的,所以不能更改