5.5 非访问控制符

类定义时除了可以使用public,private,protected和默认来设置类成员变量,成员方法的访问权限外, 还可以使用static,final,abstract 等说明成员变量或方法的特性。

5.5.1static

被static修饰的类成员变量或成员方法分别为类变量(或静态变量)和类方法(或静态方法)。相应地,没有被static修饰的类成员变量 或 成员方法 称为实例变量 或 实例方法。

1类变量

实例变量依附于对象,在使用new关键字创建对象时,java运行系统会为每一个对象分配一个内存空间,不同实例变量占用不同的内存区域。
类变量依附于类(而非对象),对于类变量来说,java 系统为类变量分配公共的存储空间,该类的每个实例对象共享同一类变量的存储空间。

因此,每个对象对 类变量的修改 都会影响其他实例对象。

类变量可以通过类名 直接访问,也可以通过 实例对象 访问,都是对同一内存单元的操作。例如,System类中in, out 都是类变量,因此经常直接通过System类访问in和out对象,即通过System.in 和 System.out完成输入环绕输出。
【例5-19】static修饰类变量示例。

Ex5_19_Static.java

package com.ch5;

public class Ex5_19_Static {

    public static void main(String[] args) {
        System.out.println("目前出生人数:" +  Person.totalNum);
        Person wang = new Person("Wang");
        Person liu = new Person("Liu");
        Person zhao = new Person("Zhao");
        System.out.println("目前出生人数:" +  Person.totalNum);
        System.out.println("目前出生人数:" +  wang.totalNum);

    }

}

class Person{

    static long totalNum = 10000;
    int age;
    String name;
    String id;

    public Person(String name){
        System.out.println("public Person(String name) 构造方法执行前。。。。。。"+  Person.totalNum);
        totalNum++;
        this.name = name;
        age = 1;
        System.out.println("public Person(String name) 构造方法执行完毕。。。。。。"+  Person.totalNum);
    }

    public Person(){
        System.out.println("无参构造方法执行完毕。。。。。。");
    }

}

运行结果:
这里写图片描述
例5-19中,Person类中的人口总数 totalNum 被声明为类变量,所有Person的实例对象都共享变量 totalNum 所指的内存区域。因此每创建一个Person 的实例对象(如 : wang, liu , zhao 等)时,调用Person类的构造方法,使类变量totalNum 加 1 。因此, totalNum 可以激励所产生的实例对象的个数。使用时,可以通过类名直接访问该变量(如:Person.totalNum),也可以通过对象访问类变量(如:wang. totalNum),但是后一种方法 不建议使用。

综上所述,类变量的使用具有如下特点:
(1)类变量可以通过类名直接访问,而不需要创建对象。
(2) 任何一个对象对类变量的修改,都是在同一内存单元上完成的,因此,每个对象对类变量的修改都会影响其他对象。

2.类方法

声明为static 的方法称为 类方法 。(或静态方法),与此相对,没有static修饰的成员方法实例方法。类方法的本质是 该方法属于整个类,而不属于某个实例,可以不创建实例,直接通过类名调用。

类方法的使用具有如下特点。
(1)类方法可以通过 类 直接调用,而不需要创建实例对象。例如:JAVA Application 的入口main() 方法就被声明为 static 类方法,不需要创建任何实例对象 即可调用。
(2)类方法属于整个类,被调用时肯还没有创建任何对象实例,因此,类方法内只能访问类变量,而不能直接访问实例变量 和 实例方法。
(3)类方法中不能使用this 关键字,因为静态方法不属于任何一个实例。
【例5-20】static 修饰类方法实例。

package com.ch5;
public class Ex5_20_Static {
    public static void main(String[] args) {
        System.out.println(staticTestFunction.addUP(10,5));
        // 正确      类方法可以被类直接调用
        // System.out.println(""staticTestFunction.sub());
        // 上一句错误,实例方法不能被类直接调用
        staticTestFunction  test = new staticTestFunction();
        System.out.println(test.sub());
    }
}

class staticTestFunction {
    int x = 10,y = 6;
    static int z = 9;

    public static int addUP(int a,int b){// 被声明为类方法
        return a+b+z;   // 类方法中能使用 类变量z
    }

    public static int addUP(){// 被声明为类方法
        // return x + y;   // 类方法中 不能使用 实例变量
        return 0;
    }

    public int sub(){
        return x - y;
    }
}

运行结果:
这里写图片描述

JAVA API 中定义了许多类方法,Double.parseDouble()等方法均可以直接调用可名使用。

5.5.2 final

final可以用来修饰类,类的成员方法 和成员变量,被fianl修饰的类,成员变量,成员方法,均不允许继承或覆盖

1.final 修饰 类 (最终类)

如果一个类被final 修饰符修饰和限定,声明这个类为最终类,他不可能有子类,有子类就一位意味着 可以定义新成员。JAVA API中 有不少类定义为final类,这些类通常有固定作用,用来完成某种标准功能的类,如Math类,String类,Integer类等。
容易理解,abstract 和final 修饰符不能同时修饰一个类,但是可以与各自与其他修饰符合用。当多个修饰符修饰类时,这些修饰符之间以空格分开,修饰符之间的先后排列次序对类的性质没有影响。

final类中的使用成员变量和方法都被默认为:final的。

2.final 修饰 类成员变量 (常量)

用final修饰的类成员变量 为 常量 ,不允许修改
同样,fianl修饰符之间的先后排列次序对成员变量的性质没有任何影响。

3.final 修饰 类成员方法 (最终方法)

用final修饰的成员方法 是功能和内部语句不能被更改的最终方法,即不能被当前类的子类重新定义的方法。它固定了这个方法所对应的具体操作,防止子类对父类关键方法的错误定义,保证了程序的安全性和正确性。

5.5.2 其他修饰符

除了 static,final,abstract之外,JAVA还通过了volatile,native,synchronized 等其他修饰符。

1.volatile (易失变量)

用volatile修饰的成员变量称为易失变量,通常这个变量同时被几个线程控制和修改,也就是说,这个成员变量不仅被当前程序所掌握,在运行过程中可能存在其他位置的程序操作来影响和改变该变量的值。

2.native (特殊方法)

用native修饰的方法是一种特殊方法,一般用来声明其他语言编写的方法并具体实现该方法。由于native的方法是用其他语言在外部编写的,因此,所有的native方法都没有方法体,而使用一个“;”代替。

3.synchronized (用于多线程程序的协调与同步)

synchronized 主要用于多线程程序的协调与同步。如果一个方法被synchronized 关键字修饰,意味着 不管哪一个方法运行到这个方法时,都要检查 有没有其他线程正在用这个方法,若有,则要等正在使用synchronized 方法的线程运行完这个方法后,再运行此线程;如果没有,则直接运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值