面向对象之static与final关键字

      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

 

图解:

 

posted @ 2018-07-27 11:03  文昭  阅读(179)  评论(0编辑  收藏  举报