1.final
- final可修饰所有除构造方法之外,表示最终含义不可再赋值修改。
- final修饰类不可被继承
public final class fu如此父类不可以被继承String类也是
- final修饰方法不可以重写
- final修饰变量叫常量终身只能赋值一次不可修改,固定不是默认值而是手动赋值
- 修饰引用数据类型其内存地址终身不变不能再被赋值地址也不能为null
- 修饰成员变量赋值有两种:一种创建时赋值,一种采用构造方法赋值仅可以出现一次等于号
- 必须在创建对象之前就final赋值完成set方法不可以赋值因为是在创建对象之后才赋值,成员变量在创建对象完成时就会有值因此可以在构造方法中赋值。
2.static
- 静态,可以用类名直接调用,和类对象无关
- 对象特有数据,让变量在方法和数据共享区(静态区)有一块地址存放
- static修饰之后就是公用,而不再是特有,父类static int a,子类继承之后修改a值,另一个子类在调用啊a值就是修改后的。
- javac编译之后的class文件,java 在运行的就是类名(main方法和类名挂钩),类进入方法区后另一块空间(静态区或者数据共享区)加载静态成员(跟随类名)
入口类(含main)进入方法区,
之后类名挂钩的静态方法main进入静态区,
之后别的类class文件进入方法区,
别的类所属静态成员进入静态区
之后main方法压栈运行,
静态成员已经有值但是还没创建类
- 静态生命周期早于非静态(静态跟随类而不是对象)
- 静态中不能调用非静态(静态在先,先不能调用后)
- 静态中不允许有this,super,因为这两个面向对象,静态跟随类而不是对象,先不能调用后
- 静态跟随类生命周期长有浪费内存嫌疑
- 应用场景:多个事物之间是否有共同特征,共性数据为静态变量(例如班级)
- 是否用静态方法要看有没有调用非静态成员(非静态生命周期在静态之后),没有非静态则方法用静态,是以方法中成员变量作参考
3.多态细节调用
- 编译是看等于号左边的父类,父类有则成功,无则失败
- 运行时候静态方法运行的是父类静态(静态跟随类,所以是类在调用方法),非静态方法运行子类
- 成员变量均是看父类有无
- 静态命名规则:全部大写,单词之间_隔开
4.匿名对象
匿名对象没有引用,仅能调用一次,可以作为参数,也可以作为返回值
5.内部类
- 一个类内部再定义一个类,可以在成员变量位置也可以在局部变量位置
- 内部类也是外部类成员,写在方法中的内部类调用本身的方法需要创建内部类对象
inner.text inn=new inner().new text();
外部类.内部类 对象名=new 外部类().new 内部类();
- 调用同名成员变量区分
public class inner {
int a = 1;
public class text {
int a = 2;
public void method() {
int a=3;
System.out.println(inner.this.a+" "+this.a+" "+a);
}
}
}
打印是1,2,3
- 内部类同样会单独编译一个class文件名有$符号
- 匿名内部类
定义实现类,重写方法,建立实现类对象一步完成,前提是继承或接口
new person() {
public void method() {
System.out.println("ppppp");
}
}.method;会打印ppp
new 类名(){
重写方法
}
6.包,可理解为文件夹
- 是对文件分类管理
- 取名通常采用公司网址反写:com.apple.demotext
- 类名全称会带着包名
7.default - 同一包下可以使用,同一包不同类间也可直接使用,别的包子类都不可使用父类成员
8.protected
在拥有default权限情况下,仅能在子类里面使用(不分是否同一个包)
9.局部代码块 - 限制作用域
- 在类中方法外的{}叫做构造代码块,会在构造方法之前执行,new几次就会执行几次
- 在构造代码块加static则是静态代码块static}{},在构造代码块之前执行,不论new创建对象几次,只会在第一次new对象时候执行。