java中的对象

1. 对象

  对象(object):代表现实世界中可以明确标识的一个实体。例如:一个学生、一张桌子等。每个对象都有自己独特的标识、状态和行为。

    • 1)  对象的状态是指那些具有它们当前值的数据域。java使用变量定义数据域。
    • 2)  一个对象的行为是由方法定义的。调用对象的方法就是要对象完成一个动作。

2.使用构造方法构造对象

  构造方法是一种特殊的方法,具有以下三个特性:

    • 1) -- 构造方法必须与所在类名字相同。
    • 2) -- 构造方法没有返回值,甚至也没有void。
    • 3) -- 构造方法在创建一个对象使用new操作符时调用的。用于初始化对象。
new ClassName (arguments); 
new 类名 (参数);
    • 4) -- 构造方法可以重载。

   通常情况下,一个类会提供一个没有参数的构造方法,即无参构造函数。如果类中没有定义构造方法,则系统会提供一个默认的方法体为空的无参构造方法,即默认构造方法。(default constructor)。

一个类的例子:

public class TV {
    int channel = 1;
    int volumeLevel = 1;
    boolean on = false;


    //默认无参构造函数
    public TV(){}

    //带参数的构造函数
    public TV(int newChannel, int newVolumeLevel, boolean newOn){
        this.channel = newChannel;
        this.volumeLevel = newVolumeLevel;
        this.on = newOn;
    }

    //方法
    public void turnOn(){
        on = true;
    }

    public void turnOff(){
        on = false;
    }

    public void setChannel(int newChannel){
        if (on && newChannel >= 1 && newChannel <= 120)
            channel = newChannel;
    }

    public void setVolume(int newVolumLevel){
        if (on && newVolumLevel >= 1 && newVolumLevel <= 7)
            volumeLevel = newVolumLevel;
    }

    public void channelUp(){
        if (on && channel < 120)
            channel++;
    }

    public void channelDown(){
        if (on && channel > 1)
            channel--;
    }

    public void volumeUp(){
        if (on && volumeLevel < 7)
            volumeLevel++;
    }

    public void volumeDown(){
        if (on && volumeLevel > 1)
            volumeLevel--;
    }
}

调用实例:

Now the TV's channel is 10 , and volum level is: 3
Now the TV's channel is 30 , and volum level is: 4

 3. 通过引用变量访问对象

3.1. 引用变量和引用类型

  对象是通过引用变量来访问的,该变量包含对对象的引用,使用如下语句声明引用变量:

ClassName objectRefVar;   类名    对象引用变量

Circle myCircle = new Circle();//创建一个对象,并将其引用赋值给变量myCircle

ClassName objectRefVar = new ClassName(); 类名 对象引用变量 = new 类名(); //声明对象引用变量,创建对象以及将对象的引用赋值给这个变量的语句

  在java中,数组被看成是对象。数组是用new操作符创建的。一个数组变量实际上就是一个包含数组引用的变量。

 

3.2. 访问对象的数据和方法

  创建一个对象后,其数据和方法可以使用圆点(.)运算符来访问和调用。该运算符.也称为对象成员运算符:

objectRefVar.dataField;  //引用对象的数据域
objectRefVar.method;  //(参数)调用对象的方法

myCircle.radius //引用myCircle的半径
    • 1)  引用变量与基本类型变量的区别:基本类型变量——对应内存所存储的是基本类型变量的值;引用变量——对应内存所存储的值是一个引用,是对象存储的地址。
    • 2)  将一个变量赋值给另一个变量时,另一个变量就被赋予同样的值。对基本数据类型来说,就是将变量的数值赋予另一个变量。对引用来说则是将一个变量的引用赋给另一个变量,两个变量同时指向同一个对象。

  

  java中的垃圾回收:如果原来两个引用变量c1, c2分别指向不同的对象,但是后来由于引用赋值,c1与 c2都指向c1所指的对象,那么c2之前引用的对象就是无用的了,称为了垃圾(garbage)。垃圾会占用内存空间。Java运行系统会检测垃圾并自动回收它所占用的空间,这个过程称为垃圾回收(garbage collection)。

  --如果你认为不再需要某个对象,可以显示地给该对象的引用赋null值。

4. 静态变量、常量和方法

    • 1)如果想让一个类的所有实例共享数据,就将其声明为静态变量,也称为类变量。静态变量将变量存储在一个公共的内存空间。 Java支持静态变量和静态方法,无须创建类的实例就可以调用静态方法。
    • 2)要声明一个静态变量或者定义一个静态方法,就要在这个变量或方法的声明中加上static。
    • 3)类中的常量是被该类的所有对象所共享的。因此常量应该声明为:final  static。 例如Math类中的PI常量: final static double PI = 3.14159265358979323846
    • 4)使用  “类名.方法名” 的方式来调用静态方法,使用 “类名.静态变量”的方法来调用静态变量。
    • 5)如果一个变量或者方法不依赖于具体类的实例对象,那么应该将其设计为静态变量、静态方法。

Circle类:

package demo;

public class Circle {
    double radius;    //圆的半径
    static int numberOfObjects = 0; //创建实例对象的个数
    
    Circle(){
        radius = 1.0;
        numberOfObjects++;
    }
    
    Circle(double newRadius){
        radius  = newRadius;
        numberOfObjects++;
    }
    
    static int getNumberOfObjects(){
        return numberOfObjects;
    }
    
    double getArea(){
        return radius * radius * Math.PI;
    }
    
}

测试类:

package demo;

public class TestCircle {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("创建对象前:");
        System.out.println("实例的个数为:" + Circle.numberOfObjects);
        
        Circle c1 = new Circle(); //创建c1
        System.out.println("创建c1后,c1的半径为:" + c1.radius + ", c1的面积为: "+ c1.getArea());
        System.out.println("实例的个数为:"+ c1.numberOfObjects);
        
        Circle c2 = new Circle(2.5);
        System.out.println("创建c2后,c2的半径为:" + c2.radius + ", c2的面积为: "+ c2.getArea());
        System.out.println("实例的个数为:"+ c2.numberOfObjects);
        
        
    }

}

输出:

创建对象前:
实例的个数为:0
创建c1后,c1的半径为:1.0, c1的面积为: 3.141592653589793
实例的个数为:1
创建c2后,c2的半径为:2.5, c2的面积为: 19.634954084936208
实例的个数为:2

5. 可见性修饰符(public、private、protected)

    • 1)、如果在类、方法、数据域前使用public修饰符,表示它们可以被任何其他的类访问。
    • 2)、如果没有使用可见性修饰符,那么默认为类、方法、数据域可以被同一个包中的任何一个类访问。————称为包私有或包内访问
    • 3)、private修饰符限定方法和数据域只能在它自己的类中被访问。
    • 4)、如果一个类没有被定义为公共的,那么其只能在同一个包内被访问。
    • 5)、修饰符private只能应用在类的成员上。修饰符public可以作用在类或类的成员上。
    • 6)、在局部变量上使用修饰符public和private都会导致编译错误。
    • 7)、大多数情况下,构造方法是公共的。但是如果想要阻止用户创建类的实例,就该使用私有的构造方法。例如Math类的所有数据域和方法都是静态的,没必要创建Math的实例。其构造         方法: private Math(){}
    • 8)、protected关键字现在父类的数据域和方法只能有其子类访问。
    • 9)、private、protected只能用于类的成员,public既可以用于类成员,也可以用于类。
修饰符 在同一个类内可访问 在子类可访问 在同一包内可访问 在不同包可访问
public
protected -
default - -
private - - -

      

6. 数据域封装

  为了防止对数据域的直接修改,使用private修饰符将数据域声明为私有的,称为数据域的封装

  为了修改和访问私有数据域,定义get和set方法:get(读取器)返回数据域的值,set(设置器)给数据域设置新值。

get方法的签名:
public returnType getPropertyName()

如果返回值是boolean类型:
public boolean isPropertyName()


set方法的签名:
public void setPropertyName( dataType propertyValue )

7. 对象数组

Circle [] circleArray = new Cricle [10] ; //创建10个circle对象数组

初始化circleArray数组:

for( int i = 0; i < 10; i++){
     circleArray[i] = new Circle();      
}

终极类--final修饰符

   · 1. 使用final关键字表示一个类是终极的,是不能作为父类进行扩展的。Math类就是一个终极类。

  public final class C {}

  · 2. 使用关键字修饰一个方法,表示其不能被子类覆盖,是终极的

public class Test{
     public final void test(){
     //方法体  
}  
}

不可变对象和类

  不可变对象对应的是不可变类。一个类是不可变的,必须满足:

  · 所有数据都是私有的。

  · 没有修改器方法

  · 没有访问器方法,因为访问器会返回一个指向可变数据域的引用。

this引用

  关键字this指向调用对象本身的引用名。

public class Circle {
        double radius;
        public Circle(double radius){
            this.radius = radius;   //显示调用this来引用被创建对象的数据域radius
        }
        
        public Circle(){
            this(1.0); //使用this调用另一个构造方法
        }
        
        public double getArea(){
            return this.radius * this.radius * Math.PI;
        }
    } 
原文地址:https://www.cnblogs.com/luts/p/5001169.html