Java 之 final,static 关键字及匿名对象
个人通俗理解:
1,final: 首先被 final 修饰的变量就自动变成的不能被修改的常量了. 被修饰的类会自动变成太监类, 只能有父类, 不能有子类; 被修饰的方法也不能被子类重写了; 被修饰的引用变量值也不能更改了地址值了; 但在修饰成员变量前必须赋值 (可以使用构造方法, 因为构造方法时初始化的, 最早执行的).
2,static: 可以理解为 static 是用于将对象或者方法中的相同的东西提取出来进行静态下, 在定义类的时候一并定义了, 需要注意的是: 它是属于类的, 不是某个对象的, 是早于对象存在的, 存在在静态区的 (不在堆栈中). 在一个类中, 静态方法只能访问静态方法, 但是可以被普通方法访问 (因为普通方法肯定在其后面进行创建的). 进行调用的时候因为其属于类, 所以最好用类名来调用.
3, 匿名对象:
顾名思义就是没有定义具体的对象 (变量名), 只是把地址值给某个变量, 算是一种节省代码.
(理解上也就这些了, 其他的基本上都是需要记忆的了)
一, final 关键字:
1, 概念:
final 的意思是最终, 不可变. 它是个修饰符, 用来修饰类, 类的成员及局部变量; 不能修饰构造方法.
2, 特点:
1,final 修饰符不可以被继承, 但是可以继承其他类;
2,final 修饰的方法不可以被子类重写, 但是父类中没有被 final 修饰的方法可以被子类重写, 并且可以加 final;
3,final 修饰的变量为常量, 这些变量只能赋值一次, 且终身不变;
4, 引用类型的变量值为对象地址值, 地址值不能更改, 但是地址内的对象属性值可以修改;
5, 修饰成员变量, 需要在创建对象前赋值, 否则报错.(当没有显式赋值时, 多个构造方法的均需要为其赋值.) 可以在创建对象时调用的构造方法中, 为变量 N 赋值.
二, static 关键字:
1, 概念:
static 是静态修饰符, 一般用来修饰类中的成员.
2, 特点:
1, 被 static 修饰的成员变量属于类, 不属于这个类的某个对象.(也就是说, 多个对象在访问或修改 static 修饰的成员变量时, 其中一个对象将 static 成员变量值进行了修改, 其他对象中的 static 成员变量值跟着改变, 即多个对象共享同一个 static 成员变量)
2, 被 static 修饰的成员可以并且建议通过类名直接访问.
访问静态成员的格式:
类名. 静态成员变量名
类名. 静态成员方法名 (参数)
3, 注意事项:
1, 静态内容是优先于对象存在, 只能访问静态, 不能使用 this/super(this 是本来对象, super 是父类对象). 静态修饰的内容存于静态区.
2, 同一个类中, 静态成员只能访问静态成员, 普通的可以访问静态的.
3,main 方法为静态方法仅仅为程序执行入口, 它不属于任何一个对象, 可以定义在任意类中.
4, 多态调用方法中, 编译看 = 左边, 父类有, 编译成功, 父类没有, 编译失败
运行, 静态方法, 运行父类中的静态方法,
运行, 非静态方法, 运行子类的重写方法
成员变量, 编译运行全是父类
4, 定义静态常量:
通常使用 public static final 修饰的变量来完成定义. 此时变量名用全部大写, 多个单词使用下划线连接.
public static final 数据类型 变量名 = 值;
当我们想使用类的静态成员时, 不需要创建对象, 直接使用类名来访问即可.
5, 注意事项:
接口中的每个成员变量都默认使用 public static final 修饰.
所有接口中的成员变量已是静态常量, 由于接口没有构造方法, 所以必须显示赋值. 可以直接用接口名访问.
三, 匿名对象:
1, 概念:
匿名对象是指创建对象时, 只有创建对象的语句, 却没有把对象地址值赋值给某个变量.
2, 特点:
1, 创建匿名对象直接使用, 没有变量名.
2, 匿名对象在没有指定其引用变量时, 只能使用一次.
3, 匿名对象可以作为方法接收的参数, 方法返回值使用.
来源: https://www.2cto.com/kf/201905/809340.html