Java系列2:類和對象

1、面向?qū)ο?/h4>
面向?qū)ο?/div>
OOP

面向?qū)ο蟮膬?yōu)點(diǎn):

(1)便于程序模擬現(xiàn)實(shí)世界中的實(shí)體
用“類”表示實(shí)體的特征和行為

(2)隱藏細(xì)節(jié)
對象的行為和屬性被封裝在類中,外界通過調(diào)用類的方法來獲得,不需關(guān)注內(nèi)部細(xì)節(jié)如何實(shí)現(xiàn)

(3)可重用
可以通過類的模板,創(chuàng)建多個(gè)類的對象

2、對象

(1)特征:

屬性:attribute / field / property

屬性是對象具有的各種特征。
每個(gè)對象的每個(gè)屬性都擁有特定值。

方法 / 行為:method

方法是對象執(zhí)行的操作。

(2)使用對象的步驟:

使用new創(chuàng)建一個(gè)對象:
School center = new School();

使用對象:
center.schoolName = “qinghua";        對象名.屬性
center. toInter ();      對象名.方法名()

(3)對象在內(nèi)存中的存放形式

對象在內(nèi)存中的存放形式

3、類

類是具有相同屬性和方法的對象的集合。

所有Java程序都以類class為組織單元。

定義一個(gè)類的步驟:

  1. 定義類名
  2. 編寫類的屬性
  3. 編寫類的方法

4、類和對象的區(qū)別

類是抽象的概念,僅僅是模板,比如說:“人”。
對象是一個(gè)你能夠看得到、摸得著的具體實(shí)體,比如:“張三”。

5、抽象

把相同的或相似的對象歸為一類的這個(gè)過程就是抽象,所以,抽象就是分析問題的方法。

抽象的過程其實(shí)就是面向?qū)ο缶幊痰暮诵乃枷胫弧?/p>

6、成員運(yùn)算符:.

在Java中,只有先實(shí)例化類的對象,才可以訪問到類中的成員(屬性和方法)。

使用成員運(yùn)算符(.)來訪問成員屬性或成員方法;

一般語法是:
對象名.成員名

std.age = 18;   //為成員屬性賦值
std.dining();  //調(diào)用成員方法

7、構(gòu)造器 / 構(gòu)造方法:constructor

在上例中,只能逐個(gè)地為數(shù)據(jù)成員賦值,如果想在對象實(shí)例化的同時(shí)就初始化成員屬性,就使用到了構(gòu)造方法。正是由于在實(shí)例化對象的同時(shí)會自動調(diào)用構(gòu)造方法,所以構(gòu)造方法一般用來給數(shù)據(jù)成員分配資源或初始化數(shù)據(jù)成員。

作用:對象實(shí)例化。

構(gòu)造方法是特殊的成員方法,它與類同名,在對象實(shí)例化時(shí)由虛擬機(jī)自動調(diào)用。因?yàn)槭怯商摂M機(jī)來調(diào)用構(gòu)造方法,所以構(gòu)造方法一般應(yīng)定義成public。

只有調(diào)用構(gòu)造方法,才能在內(nèi)存中開辟空間,才允許存放類中屬性和方法的數(shù)據(jù)。

構(gòu)造方法的一般形式:

訪問權(quán)限 類名(形參列表) {
    方法體
}

請注意:

  • 構(gòu)造方法沒有返回值類型,也不能有返回值。
  • 構(gòu)造方法一般定義成public
  • 每個(gè)對象在生成時(shí)都必須執(zhí)行構(gòu)造方法,而且只能執(zhí)行一次。
  • 如果構(gòu)造方法調(diào)用失敗,那么對象也無法創(chuàng)建。
  • 不可以顯式地直接調(diào)用構(gòu)造方法。
  • 在沒有定義構(gòu)造方法的情況下,類會自動產(chǎn)生一個(gè)無參數(shù)的默認(rèn)構(gòu)造方法,這個(gè)默認(rèn)的構(gòu)造方法什么都不做。
    一旦顯式地定義了構(gòu)造方法,默認(rèn)構(gòu)造方法自動消失。
修改后的Student類

例:

Person.java:

public class Person {
    String name;
    // 無參構(gòu)造器
    public Person() {
        System.out.println("又一個(gè)人誕生了!");
    }

    // 含參構(gòu)造器
    public Person(String name) {
        this.name = name;
        System.out.println
        ("一個(gè)人誕生了,他的名字是:"+this.name);
    }
}

TestConstructor.java:

public class TestConstructor {
    public static void main(String[] args) {
        // 通過Person類的含參構(gòu)造器實(shí)例化一個(gè)對象person
        Person person = new Person("張三");
        person.name="李四";
        System.out.println("名字:"+person.name);
    
        // 通過Person類的無參構(gòu)造器實(shí)例化一個(gè)對象p1
        Person p1 = new Person();
        p1.name="王五";
        System.out.println("人名字:"+p1.name);
    }

}

8、this關(guān)鍵字

既然所有的對象都共用相同的成員方法,那么在不同的對象都調(diào)用同一方法時(shí),它是怎么確定要使用哪個(gè)對象的數(shù)據(jù)成員呢?

每個(gè)成員方法都有一個(gè)隱含的this引用,它總是指向調(diào)用它的對象;

關(guān)鍵字this給出用于調(diào)用成員方法的對象的地址;

每當(dāng)調(diào)用成員方法時(shí),編譯器會向this分配調(diào)用該方法的對象的地址;
可以像使用任何引用那樣使用this。

/*this示例,代碼片段*/
public class Student  //定義學(xué)生類
{
  private String mName;  //姓名
  private int mAge;      //年齡

  public Student(String name, int age)
  {
    //隱式調(diào)用,等同于this.mName = name;
    mName = name;
    //顯式調(diào)用,等同于mAge = age;
    this.mAge = age;
  }
  ……
}

注意:在static作用域內(nèi),絕對不可以使用this關(guān)鍵字!??!
(因?yàn)閠his是指向本類的一個(gè)實(shí)例,而static只有一個(gè)實(shí)例)

9、面向?qū)ο蟮?大基本特征:

(1)封裝

java系列4:封裝encapsulation

(2)繼承

java系列5:繼承(inheritance)

(3)多態(tài)

java系列6:多態(tài)(Polymorphism)

3大基本特征

10、堆區(qū)、棧區(qū)、方法區(qū)

Java的內(nèi)存分為3個(gè)區(qū):堆(heap)、棧(stack)、方法區(qū)(method)。

堆區(qū):

  1. 存儲的全部是對象,每個(gè)對象都包含一個(gè)與之對應(yīng)的class的信息。(class的目的是得到操作指令)。

  2. JVM只有一個(gè)堆區(qū)被所有線程共享,堆中不存放基本類型和對象引用,只存放對象本身。

棧區(qū):

  1. 每個(gè)線程包含一個(gè)棧區(qū),棧中只保存基本數(shù)據(jù)類型的對象和自定義對象的引用(不是對象),對象都存放在堆區(qū)中。

  2. 每個(gè)棧中的數(shù)據(jù)(原始類型和對象引用)都是私有的,其他棧不能訪問。

  3. 棧分為3個(gè)部分:基本類型變量區(qū)、執(zhí)行環(huán)境上下文、操作指令區(qū)(存放操作指令)。

方法區(qū):

String say(String name){return "abc"}
// name、"abc"等都存放在方法區(qū)

11、靜態(tài)成員

(1)變量

Java中的變量可分為成員變量和局部變量。
兩種變量的作用域和加載時(shí)間均不一樣。

(2)靜態(tài)成員變量

在成員變量前加static關(guān)鍵字,可以將其聲明為靜態(tài)成員變量;

如果類中成員變量被定義為靜態(tài),那么不論有多少個(gè)對象,靜態(tài)成員變量只有一份內(nèi)存拷貝,即所有對象共享該成員變量;
在沒有實(shí)例化對象時(shí),可以通過類名訪問靜態(tài)成員變量;也可以通過對象訪問靜態(tài)成員變量,但不論使用的是哪個(gè)對象,訪問到的都是同一個(gè)變量。

靜態(tài)成員變量的作用域只在類內(nèi)部,但其生命周期卻貫穿整個(gè)程序。和程序同生命周期。

靜態(tài)成員變量在聲明時(shí)最好初始化,如果不進(jìn)行初始化,系統(tǒng)會默認(rèn)初始化為0。

package test;

class Dog{
  public static int count = 0;  //靜態(tài)成員變量
  
  public Dog() {     //構(gòu)造方法
    count++;
  }
}

public class Test{
  public static void main(String[] args){
    System.out.println("當(dāng)前狗的數(shù)量是:" + Dog.count);
    Dog d1 = new Dog();
    Dog d2 = new Dog();
    System.out.println("當(dāng)前狗的數(shù)量是:" + Dog.count);
  }
}

(3)靜態(tài)成員方法

在成員方法前加static關(guān)鍵字,可以將其聲明為靜態(tài)成員方法;
靜態(tài)成員方法只能對類的靜態(tài)成員變量(靜態(tài)屬性和靜態(tài)方法)進(jìn)行操作,不能操作非靜態(tài)成員變量。(因?yàn)閟tatic屬性和方法是在編譯(javac)時(shí)開辟的內(nèi)存空間,而普通變量和方法是在運(yùn)行(java)時(shí)才產(chǎn)生)
靜態(tài)成員方法沒有this引用;
在沒有實(shí)例化對象時(shí),可以通過類名訪問靜態(tài)成員方法。

靜態(tài)方法不能直接操作非靜態(tài)的屬性和方法
加上static后,就可以操作了
package test;

class Dog {
  private static int count = 0;  //靜態(tài)成員變量

  public Dog() {
    count++;
  }

  //顯示數(shù)量的方法,靜態(tài)成員方法
  public static void displayCount() {
    System.out.println("當(dāng)前狗的數(shù)量是:" + count);
  }
}

public class Test {
  public static void main(String[] args) {
    //沒有實(shí)例化對象之前,直接通過類名調(diào)用靜態(tài)成員方法
    Dog.displayCount();
    Dog d1 = new Dog();
    Dog d2 = new Dog();
    Dog.displayCount();
  }
}

12、包

有時(shí)候,類和類的名稱可能發(fā)生沖突;Java提供了把類名空間劃分為更容易管理的塊的機(jī)制,這就是包;包允許將類組合成較小的單元,類似于文件夾。

  • 有助于避免命名沖突,分屬不同包的類即便名稱相同也不會引起誤會。
  • 能在包與包之間對于類的訪問權(quán)限提供更有力的約束。

(1)缺省包

如果省略了package語句,類將保存在一個(gè)缺省的沒有名稱的包中;
盡管缺省包很方便,但對于大型的程序,它是不恰當(dāng)?shù)模?br> 請盡量為自己編寫的類定義具體的包。

(2)使用package關(guān)鍵字打包

可以使用package關(guān)鍵字將源文件中的類打入某個(gè)包中,語法是:

package 包名;

該語句必須是整個(gè)源文件的第一條語句。

package mypkg;      //將本源文件中的所有類打到mypkg包中

class Student {      //定義學(xué)生類
    ……
}

(3)使用import關(guān)鍵字導(dǎo)入包

如要使用到某個(gè)包中的類,就需要使用import關(guān)鍵字將包或類顯式地包括到程序中。有如下兩種情況:

/*導(dǎo)入java包下的io子包中的所有類*/
import java.io.*;

/*導(dǎo)入mypkg包下的Student類,但并不導(dǎo)入該包中的其它類*/
import mypkg.Student;
……

一個(gè)程序中允許有多條import語句,導(dǎo)入多個(gè)包或多個(gè)類。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,645評論 18 399
  • 一:java概述:1,JDK:Java Development Kit,java的開發(fā)和運(yùn)行環(huán)境,java的開發(fā)工...
    ZaneInTheSun閱讀 2,810評論 0 11
  • 前一陣單位組織體檢,我在狂灌十瓶農(nóng)夫山泉后,靜坐憋尿等著做B超。我喝水喝得快崩潰了,覺得自己已經(jīng)開始變得浮腫,臉上...
    龍貓家的貓閱讀 404評論 0 1
  • 標(biāo)簽 標(biāo)簽顯示靜態(tài)文本。 標(biāo)簽: 可以顯示任意數(shù)量的靜態(tài)文字 不支持直接的用戶交互 可以由程序更新 可以夸越多行 ...
    糊君閱讀 1,351評論 0 5
  • “眾里尋他千百度,驀然回首,那人卻在,燈火闌珊處?!睅啄昵埃瑒偨佑|到稼軒的這首詞時(shí),更多的是欣賞他用詞用句的新...
    易簡易安閱讀 306評論 0 0

友情鏈接更多精彩內(nèi)容