• 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;
            }
        } 
  • 相关阅读:
    Javaの网络数据传输之Socket
    AndroidのActivity跳转数据通信和跳转动画
    Androidの系统服务之getSystemService
    AndroidのUI设计研究(一)——自定义ProgressBar
    AndroidのService与Activity的及时通信
    Javaの网络数据传输之Http消息格式
    AndroidのActivity之后台隐藏
    《大道至简》读后感
    第一周
    第四周
  • 原文地址:https://www.cnblogs.com/luts/p/5001169.html
Copyright © 2020-2023  润新知