zoukankan      html  css  js  c++  java
  • java 理解实例和类成员(翻译自Java Tutorials)

     原文出自 http://www.cnblogs.com/ggjucheng/archive/2012/11/30/2796085.html

    这个章节,我们主要介绍static关键字创建类的字段和实例,而不是讲类的实例。

    类变量

    从类的蓝图中创建一个对象,每个对象都有自己的变量的唯一拷贝。例如Bicycle类,实例变量是cadence, gear, speed。每个Bicycle对象的每个变量都有自己的值,存储在不同的内存位置。

    有时,你希望所有对象共享变量。这通过static修饰符可以做到。使用static关键字修饰的字段,称之为静态字段或者类变量。这些变量是通过类关联的,而不是任何对象。类的每个实例都共享每个类变量,每个类变量都存储在固定位置。每个对象都可以修改类变量的值,但是类变量在没有创建类实例的情况下,也可以操纵。

    例子,加入你要创建Bicycle类,并赋值一个序列号,第一对象从1开始,每个对象实例的ID都是唯一的,同时,你需要一个变量追踪,至今有多少个Bicycle类已经创建了,你才能知道下一个创建的对象要赋值什么ID,而这个变量不与其他独立的对象有关联,但是它与整个类有关系。所以,我们需要一个类变量,numberOfBicycles,如下:

    public class Bicycle{
            
        private int cadence;
        private int gear;
        private int speed;
            
        // add an instance variable for
        // the object ID
        private int id;
        
        // add a class variable for the
        // number of Bicycle objects instantiated
        private static int numberOfBicycles = 0;
            ...
    }

    类变量可以通过类名引用,例如:

    Bicycle.numberOfBicycles

    这种使用方式清晰说明它是类变量。

    注意:你也可以通过一个对象实例引用static字段,例如

    myBike.numberOfBicycles

    but this is discouraged because it does not make it clear that they are class variables.

    这种使用方式不不推荐的,因为它不能清晰说明它是一个类变量。

    我们可以在Bicycle构造方法中,设置id实例变量,自增numberOfBicycles类变量:

    public class Bicycle{
            
        private int cadence;
        private int gear;
        private int speed;
        private int id;
        private static int numberOfBicycles = 0;
            
        public Bicycle(int startCadence, int startSpeed, int startGear){
            gear = startGear;
            cadence = startCadence;
            speed = startSpeed;
    
            // increment number of Bicycles
            // and assign ID number
            id = ++numberOfBicycles;
        }
    
        // new method to return the ID instance variable
        public int getID() {
            return id;
        }
            ...
    }

    类方法

    java程序语言,支持静态方法,就像支持静态变量一样。静态方法,它在声明中有static修饰符,应该使用类名调用,不需要创建任何类的实例,例如

    ClassName.methodName(args)

    注意:你可以通过对象引用静态方法,例如

    instanceName.methodName(args)

    但是这种方法不推荐,因为它不能清晰表达它是一个类方法。

    一个常见用途是使用static方法访问static字段,例如,我们可以在Bicycle类中添加一个static方法访问static字段numberOfBicycles。

    public static int getNumberOfBicycles() {
        return numberOfBicycles;
    }

    不是实例和类的变量和方法的组合都是合法的:

    • 实例方法可以直接访问实例变量和实例方法
    • 实例方法可以直接访问类变量和类方法
    • 类方法可以直接访问类变量和类方法
    • 类方法不能直接访问实例变量和实例方法—必须通过对象的引用访问。同样,类方法不能使用this关键字,因为当前没有任何实例引用。

    常量

    static修饰符和final修饰符组合,可以用于声明常量。final关键字指示字段的值不能被初始化。

    例如,以下的变量声明声明一个常量,名字为PI,其值是一个近似的pi(其直径的圆的周长的比率)

    static final double PI = 3.141592653589793;
    

    使用这种方法声明常量,常量不能重新赋值,如果程序试图这么做,编译器会报错。按照惯例,长岭的名字是使用大写字母拼写,如果名字包含多个单词,单词与单词之间通过下划线(_)做分割。

    注意:如果一个原生类型或者是一个string声明为常量,它的值可以在编译期获取,编译器会在代码中,使用这个常量的做一个替换。这种称之为编译时常量。如果常量在外面的类改变了值(例如,如果立法PI实际为3.975),你需要重新编译引用到这个常量的任何类。

    Bicycle类

    Bicycle使用了这个章节全部的修饰符,代码如下:

    public class Bicycle{
            
        private int cadence;
        private int gear;
        private int speed;
            
        private int id;
        
        private static int numberOfBicycles = 0;
    
            
        public Bicycle(int startCadence,
                       int startSpeed,
                       int startGear){
            gear = startGear;
            cadence = startCadence;
            speed = startSpeed;
    
            id = ++numberOfBicycles;
        }
    
        public int getID() {
            return id;
        }
    
        public static int getNumberOfBicycles() {
            return numberOfBicycles;
        }
    
        public int getCadence(){
            return cadence;
        }
            
        public void setCadence(int newValue){
            cadence = newValue;
        }
            
        public int getGear(){
        return gear;
        }
            
        public void setGear(int newValue){
            gear = newValue;
        }
            
        public int getSpeed(){
            return speed;
        }
            
        public void applyBrake(int decrement){
            speed -= decrement;
        }
            
        public void speedUp(int increment){
            speed += increment;
        }
    }


  • 相关阅读:
    走进小楼满院星空
    极致美
    关于文件夹的所有文件名称修改以及输出
    Math类的常用方法
    Automation Framework Design 自动化框架设计思想
    选择适合入门的自动化测试框架TestNG 基于Java语言的入门选择之一
    MAC系统如果碰到报错信息:sudo:command not found
    UI自动化测试框架Gauge 碰到无法识别Undefined Steps 红色波纹标记
    如何搭建测试平台体系
    Selenium自动化测试框架Ride使用XLRD对于Excel测试数据的管理和操作
  • 原文地址:https://www.cnblogs.com/ggjucheng/p/2796085.html
Copyright © 2011-2022 走看看