final关键字和static关键字
final关键字
final:在翻译过来的意思就是最后的,最终的,不可改变的意思。在Java中同样也是这个意思。那到底什么时候可以用到final来修饰呢?都知道,继承的应用提高了代码的复用性,通过继承,子类可以对父类的方法进行重写,那如果有些父类中的方法是固定的,不想让子类进行重写,要解决这个问题就要用到final关键字,final关键字可以用来修饰类,类的成员,以及局部变量。
1、修饰类:final修饰的类是最终类,不能有子类,不能被继承,但是可以继承其他类,使用的方式不变,可以创建对象,调用方法。
2、修饰方法:final修饰的方法不能被子类重写。
3、修饰变量:修饰变量的时候也分几种情况
a、修饰局部变量:修饰的变量称为常量,只能被赋值一次,赋值后终生不变。所以final一般做固定值的修饰。
b、修饰引用变量:变量保存的是内存的地址,被final修饰后就不能再重新创建。(因为如果再次用new进行创建就会再次产生新的地址),但是地址内的对象属性值可以修改。
成员变量的两种赋值方式:一种是定义时直接赋值,另一种是通过构造方法赋值(注意:不能用set方法进行赋值)。但是一般都是直接赋值,不通过构造方法赋值。
c、修饰成员变量:修饰成员变量,固定住的不是内存中的默认值,固定住的是手动赋给成员变量的值。如:final int a=1;
1 package com.oracle.demo01; 2 /*final修饰类:(太监类) 3 被final修饰的类不能被继承,但可以继承别的类 4 final修饰成员方法: 5 1.该方法可以被子类继承,但不能被重写 6 2.从父类那里继承继承来的方法,重写后可以加final关键字 7 final修饰变量(基本类型还是引用数据类型): 8 一次赋值 终身不变 9 final修饰成员变量: 10 1.成员变量的初始值不能为系统赋的默认值(需要手动赋初始值) 11 2.可以通过构造方法赋值 12 3.一次赋值终身不变*/ 13 public class Test { 14 public static void main(String[] args) { 15 Zi zi=new Zi(); 16 zi.method1(); 17 zi.method2(); 18 final int a=1; 19 final Fu fu=new Fu(); 20 //System.out.println(a); 21 } 22 }
static关键字
定义类的时候,类中都会有相应的属性和方法,然而对这些方法的使用,都是通过创建本类的对象进行调用的,当调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余,但是不创建这个对象,方法又调用不了,那这种情况如何解决呢?这是我们就要用到static关键字了。Static是静态修饰符,一般用来修饰类中的成员。
static的特点:
1、被static修饰的成员变量属于类,不属于这个类的某个对象。也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量。
代码演示:
1 class Demo { 2 3 public static int num = 100; 4 5 } 6 7 8 9 class Test { 10 11 public static void main(String[] args) { 12 13 Demo d1 = new Demo(); 14 15 Demo d2 = new Demo(); 16 17 d1.num = 200; 18 19 System.out.println(d1.num); //结果为200 20 21 System.out.println(d2.num); //结果为200 22 23 } 24 25 }
2、被static修饰的成员可以并且建议通过类名直接访问。
类名.静态成员变量名
类名.静态成员方法名(参数)
对象名.静态成员变量名 ------不建议使用该方式,会出现警告
对象名.静态成员方法名(参数) ------不建议使用该方式,会出现警告
对象名.静态成员方法名(参数) ------不建议使用该方式,会出现警告
Static注意事项:
1、静态内容是优先于对象存在,只能访问静态,不能使用this/super。静态修饰的内容存于静态区。
2、同一个类中,静态成员只能访问静态成员,不能直接调用非静态的。如果想要使用,要先创建对象。原因:生命周期不同,静态优于非静态存在于内存中,静态存在时,非静态还不存在。
代码
1 class Demo { 2 3 //成员变量 4 5 public int num = 100; 6 7 //静态成员变量 8 9 public static int count = 200; 10 11 //静态方法 12 13 public static void method(){ 14 15 //System.out.println(num); 静态方法中,只能访问静态成员变量或静态成员方法 16 17 System.out.println(count); 18 19 } 20 21 }
使用场景:
成员变量使用static 根据具体的事物,具体分析问题,定义事物的时候,,将共性的数据定义为静态的成员变量。
方法跟着变量走,如果方法中没有调用非静态成员变量,需要加静态。
静态调用:
多态调用:编译都看父类,如果有,编译成功,否则编译失败。运行时:静态方法运行父类中的静态方法,,非静态方法:运行子类中重写的方法。成员变量:运行编译都看父类。注意:静态方法与对象没有关系。
定义静态常量:
开发中,我们想在类中定义一个静态常量,通常使用public static final修饰的变量来完成定义。此时变量名用全部大写,多个单词使用下划线连接。
定义格式:
public static final 数据类型 变量名 = 值;
如:
class Company { public static final String COMPANY_NAME = "卢肖正"; public static void method(){ System.out.println("一个静态方法"); } }
当我们要使用静态类时,不需要创建对象,直接使用类名来访问即可:
1 System.out.println(Company.COMPANY_NAME); //打印姓名 2 3 Company.method(); // 调用一个静态方法
注意:
接口中的每个成员变量都默认使用public static final修饰。
所有接口中的成员变量已是静态常量,由于接口没有构造方法,所以必须显示赋值。可以直接用接口名访问。
如:
interface Inter { public static final int COUNT = 100; } // 访问接口中的静态变量 Inter.COUNT
图解:
原文地址:https://www.cnblogs.com/2734156755z/p/9376181.html