Java基礎| 類和物件

weixin_34236497發表於2018-07-26

目錄

12070003-89b674666bfe43d3.png
目錄

類和物件的概述

1.物件導向的基本概念

我們將類定義為一組具有共同屬性和行為的物件的模版。例如我們定義類Student,而描述Student的屬性有姓名、性別、年齡這些屬性,而Student的行為包括說話、寫字、考試。Student就相當於是學生這個群體的模板了。

物件

類只是定義屬性和行為的模板,但是僅僅有類還不夠,還必須要建立屬於類的物件。物件是類的例項,物件與類的關係就像變數和資料型別的關係一樣,簡單來說,物件是類的“取值”,能夠儲存類的一個例項。

例如上面的Student的例子中,我們建立一個叫做張三的Student物件,而張三就有了Student中定義的所有屬性了。

2.類的宣告

Java是一種純物件導向的語言,所以每個程式至少包含有一個類。所有的資料和操作都封裝在類中。類要先宣告,後使用。類的宣告形式如下:

[修飾符] class 類名 [extends 父類名] [implements 介面] {  //有些類沒有父類或介面時可以忽略不寫
  成員變數宣告;
  成員方法宣告;
}

將上面的Student舉例來說:

public class Student {  //類首
  String name;  //類的成員變數
  String sex;
  int age;

  void say(){};  //類的成員方法
  void write(){};
  void test(){};
}

3.物件的建立的使用

物件的建立

類在Java中就像int,char等資料型別一樣,是對事物的抽象。在程式中必須建立類的例項,即物件。物件的建立包括宣告和例項化兩項工作,可以通過一條語句來實現,建立格式是:
類名 物件名 = new 類名(參數列);
例如將上述的Student的物件zhangsan實現:

Student zhangsan = new Student();
物件的使用

當建立一個物件後,物件就有了這個類的所有的成員變數和方法,就可以引用這些變數,呼叫這些方法了。呼叫的方式和C語言一樣,採用的是圓點識別符號.,例如對zhangsan進行操作:

zhangsan.name = "張三";
zhangsan.sex = "男";
zhangsan.age = 18;
zhangsan.say();  //呼叫say()這個方法
zhangsan.write();
zhangsan.test();

4.構造方法和物件的初始化

在類中有一種特殊的成員方法,其方法名與類名相同,稱為構造方法。構造方法也稱為構造器,當使用new例項化一個物件時,系統將自動呼叫構造方法初始化該物件。構造方法有如下幾個特點:
(1)構造方法沒有返回值,前面不能有返回值型別,也不能有void
(2)程式中不能直接呼叫構造方法。只有在建立新的物件時系統自動呼叫。
(3)如果自己沒有宣告構造方法,則系統會自動為該類生成一個無引數型別的預設構造方法。例如在Student的類中,系統就自動宣告瞭構造方法Student(){};

public class Point{
    int x;
    int y;
    Point(int xx,int yy){
        x = xx;  //讓成員變數x=xx
        y = yy;  //成員變數y=yy
    }

    public static void main(String args[]){
        Point myPoint = new Point(2,3);  //呼叫建構函式
    }
}

在Java中,還可以允許一個類中擁有多個建構函式,當我們在建立物件時,系統會根據建立時的引數來自動選擇呼叫哪一個建構函式。

public class Point{
    int x;
    int y;
    Point(int xx,int yy){  //建構函式1
        x = xx;  //讓成員變數x=xx
        y = yy;  //成員變數y=yy
    }

    Point(){ };  //建構函式2

    public static void main(String args[]){
        Point myPoint1 = new Point(2,3);  //呼叫建構函式1
        Point myPoint1 = new Point(2,3);  //呼叫建構函式2
    }
}

5.物件銷燬

通過new運算子例項化物件時,系統為物件自動分配所需要的儲存空間,但是由於記憶體有限,無法存放無限多個物件,因此Java提供了資源回收機制。在Java中會自動銷燬無用的物件,所以一般使用者不需要專門設計釋放物件的方法。但是如果需要在某些情況下手動釋放物件,則可以在類中宣告void finalize();方法,然後使用物件來進行銷燬。

類的封裝

封裝性是物件導向的核心特徵之一,它提供了一種資訊隱藏技術。類的封裝包含兩層含義:將資料和對資料的操作組合起來構成類,讓類成為一個不可分割的獨立單位;類中既要提供與外部聯絡的介面,同時又要儘可能隱藏類的實現細節。封裝性為軟體提供了一種模組化的設計機制。

1.訪問許可權

按照類的封裝性原則,類的設計者既要提供類與外部的聯絡方式,又要儘可能的隱藏類的實現細節。具體的方法就是為類及其成員變數和成員方法分別設定合理的訪問許可權。在Java中,類有2種訪問許可權,類中的成員和方法有4種訪問許可權。

成員訪問許可權

(1)public
被public修飾的成員變數和方法可以在所有的類中訪問。即所有的類都可以呼叫被public修飾的成員變數的方法。
(2)protected
被protected修飾的成員變數和方法可以在宣告它們的類中訪問,在該類中的子類中訪問,也可以與該類位於同一個包中的類訪問,但不能在位於其他的包中的類訪問。
(3)預設
預設指的是不使用許可權修飾符,被預設修飾的類的成員變數和方法可以在宣告它們的類中訪問,也可以與該類位於同一個包中的類訪問,但不能在位於其他的包中的類訪問,也不能被自己的子類訪問。
(4)private
被private修飾成員變數和方法只能在自己的類中訪問,其他的任何類都不能訪問。

類訪問許可權

宣告一個類可以使用public和預設兩種。需要注意的是雖然一個Java源程式檔案中可以包含多個類,但是隻能有一個類使用public修飾符,並且該類的名字與源程式檔案的名字相同。

2.類成員

Java中的類中可以包含兩種成員:例項成員和類成員

例項成員是屬於物件的,例項成員包括例項成員變數和例項成員方法。只有建立了物件之後,才能通過物件訪問例項成員變數、呼叫例項成員方法。前面所建立的都是例項成員。

類成員是屬於類的,類成員是需要用static修飾的,類成員也稱為靜態成員。類成員包括類成員變數和方法。通過類名可以直接訪問類成員變數、呼叫類成員方法。即使沒有建立物件,也可以引用類成員

類成員變數

類成員變數和例項變數的區別如下:
(1)在類中宣告成員變數時,沒有使用static修飾的變數為例項成員變數,使用static修飾的為類成員變數。

public class Student {  
  String name;  //例項成員變數
  String sex;  //例項成員變數
  int age;  //例項成員變數
  static int count = 0;  //類成員變數

  void say(){};  
  void write(){};
  void test(){};
}

(2)系統只為類成員變數分配一個儲存單元,所有的物件共享一個類成員變數。當某個物件修改了類成員變數的值後,所有物件都將使用的是修改後的值。

(3)例項成員變數屬於物件,只能通過物件引用;類成員變數屬於類,既可以通過類名訪問,也可以通過物件名訪問。

public class Student {  
    String name;
    String sex;
    int age;
    static int count = 0;

    void say(){};
    void write(){};
    void test(){}

    public static void main(String args[]){
        Student student1 = new Student();
        System.out.println(student1.count);  //輸出為0
        System.out.println(Student.count);  //輸出為0
    }
}
類成員方法

類成員方法與例項成員方法的區別如下:
(1)在類中宣告成員方法時,沒有使用static修飾的變數為例項成員變數,使用static修飾的為類成員方法。

public class Student {  
  String name;  
  String sex;  
  int age; 
  static int count = 0;  

  void say(){};  
  void write(){};
  void test(){};
  static void play(){};
}

(2)類成員方法中除了使用本方法中宣告的區域性變數外,只可以訪問類成員變數,不能訪問例項成員變數。

(3)類成員方法只能呼叫類成員方法,不能夠呼叫例項成員方法。但是例項成員方法既可以呼叫類成員方法,也可以呼叫例項成員方法。

double perimeter(double x,double y){
    return 2*(x+y);
}

static double area(double x,double y){
    return x*y;
}

void print1(){
    System.out.println(perimeter(2.2,4.6));  //可以通過編譯
    System.out.println(area(1.1,5.2));
}

static void print2(){
    System.out.println(perimeter(2.2,4.6));  //無法通過編譯
    System.out.println(area(1.1,5.2));
}

(4)類成員方法既可以通過例項物件訪問,也可以通過類訪問。

public class Student {  
  String name;  
  String sex;  
  int age; 
  static int count = 0;  

  void say(){};  
  void write(){};
  void test(){};
  static void play(){};

   public static void main(String args[]){
        Student student1 = new Student();
        student1.play();
        Student.play();
    }
}
數學函式類方法

Java類庫中的Math類提供了很多常用的數學運算的方法,這些方法都是static方法,通過類名Math()來呼叫。Math()類的常用方法包括:
sin(double x);
cos(double x);
log(double x);
exp(double x); //返回e^x
abs(double x); //返回x的絕對值
max(double x,double y); //返回x與y中的較大值
sqrt(double x);
pow(double x,double y); //返回y^x

public class MaxNumber{
    public static void main(String args[]){
        int x = 25;
        int y = 36;
        System.out.println("較大值是:"+Math.max(x,y));  //輸出的是36
    }
}

相關文章