继承的出现提高了代码的复用性,并方便开发。但随之也有问题,有些类在描述完之后,不想被继承,或者有些类中的部分方法功能是固定的,不想让子类重写。
可是当子类继承了这些特殊类之后,就可以对其中的方法重写,那怎么解决呢?要解决上述这些问题,需要一个关键字final,final的意思为最终,不可变。Final是个修饰符,它可以用来修饰类,类的成员,以及局部变量。
二、final 的特点
final修类类不可以被继承,但是可以继承其他类
final public class A {
public void show(){
System.out.println("A类show");
}
public static void main(String[] args) {
new A();
}
}
public class B extends A{
}//编译时会报错
final 修饰的方法不可以被覆盖
public class A {
final public void show(){
System.out.println("A类show");
}
public static void main(String[] args) {
new A();
}
}
public class B extends A{
public void show(){
System.out.println("Bshow");
}
}//编译报错
final 修饰的变量称之为常量,这些变量只能赋值一次
public class A {
final int a=10;
a=12;//编译时报错
final public void show(){
System.out.println("A类show");
}
public static void main(String[] args) {
new A();
}
}
final修饰引用类型的变量为对象地址值,地址值不能更改,但是地址内的对象属性值可以修改的。修饰成员变量,需要在创建对像前赋值
public class A {
public int a=10;
public static void main(String[] args) {
final A test = new A();
test = new A();//报错,引用变量地址值不能更改
test.a=8;//值能更改
}
}
当在定义类的时候,类中都会有相应的属性和方法。而属性和方法都是通过创建本类对象调用的。当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余。可是不创建对象,方法有调用不了,这时就会想那么我们能不能不创建对象,就可以调用方法呢?用static修饰的方法可以直接通过类调用,不用创建对象。
四、static的特点
被static 修饰的成员变量属于类,不属于这个类的某个对象(也就是说,多个对象在访问或修改static的成员变量时,其中一个对将static 成员变量进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享一个static成员变量)
public class A {
public static String aa;
public static void show(){
System.out.println("你好");
}
public static void main(String[] args) {
A.show();//static修饰的方法通过类名直接调用,结果为你好。
}
}
public class A {
public static String aa;
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
A.aa="hello";//被static修饰的成员变量可以通过类名直接调用,并建议如此
System.out.println(a1.aa);
System.out.println(a2.aa);
}
}
例子中通过类直接给aa 静态变量赋值,当有对象调用aa 变量是值都为hello,用对象a1或a2为aa 赋值结果也同样是一样的,因为他们共享一个成员变量。
Static注意事项
静态内容优先于对象存在,只能访问静态,不能使用this/super,静态修饰的内容存于静态区。
静态有很多好处,但同时也有弊端,静态的生命周期较长。因为静态随着类的加载而加载,随着类的消失而消失。(浪费内存)
static 修饰到底什么时候使用,应用场景根据具体事物,具体分析问题,定义事物的时候,多个事物之间是否有共性的数据,请你将共性的数据定义为静态的成员变量