Java中類的定義與實(shí)例化詳解
類的定義
面向?qū)ο蟮某绦蛟O(shè)計(jì)中,類可以看作是我們自定義的數(shù)據(jù)類型,那么,如何能更加優(yōu)美,更加高效地定義它就顯得尤為重要。
類中的成員有很多,每一部分都是十分關(guān)鍵的,畢竟“面向?qū)ο蟆痹贘ava學(xué)習(xí)中真的很重要,許許多多的Java開發(fā)者定義出來的類等待著我們?nèi)ナ褂?,加油!攻克它?/p>
直接上代碼:
package com.my.pac02;
/**
* @author Summerday
* @date 2019/11/26 21:40
*/
//類名和文件名一致,且包含main方法
public class CatTest{
//程序入口
public static void main(String[] args) {
//創(chuàng)建對(duì)象
Cat cat = new Cat();
//為對(duì)象的屬性賦值
cat.name = "sink";
cat.isMale = true;
//通過對(duì)象調(diào)用方法
cat.sleep();
cat.jump();
cat.laughAt("Susan");
System.out.println(cat.isNotMale());
//打印引用變量的值
System.out.println(cat);
//創(chuàng)建一個(gè)新的引用變量并指向原先的對(duì)象
Cat otherCat = cat;
System.out.println(otherCat);
System.out.println(otherCat.name);//"sink"
//將cat和實(shí)際對(duì)象之間的引用消除
cat = null;
}
}
//定義一個(gè)Cat類
class Cat{
//構(gòu)造方法
Cat() {
System.out.println("cat is cute.");
}
//成員變量
String name;
int age;
boolean isMale;
String color = "Blue";
//方法
void sleep(){
System.out.println(name+"is sleeping---");
}
public void jump() {
System.out.println(name+"is jumping---");
}
public void laughAt(String otherName)
{
System.out.println(name+"is laughing at "+otherName);
}
//返回boolean類型的方法
boolean isNotMale() {
return !isMale;
}
}
定義一個(gè)簡(jiǎn)單的類
[修飾符] class 類名
{
(零個(gè)到多個(gè))構(gòu)造器...
(零個(gè)到多個(gè))成員變量(屬性)...
(零個(gè)到多個(gè))方法...
}
[修飾符]修飾類時(shí)可以是上面代碼中的public,或者final,abstract,也可以省略不寫,但不建議使用private和protected。
參考:Java的外部類為什么不能使用private、protected進(jìn)行修飾:
對(duì)于頂級(jí)類(外部類)來說,只有兩種修飾符:public和默認(rèn)(default)。因?yàn)橥獠款惖纳弦粏卧前?,所以外部類只有兩個(gè)作用域:同包,任何位置。因此,只需要兩種控制權(quán)限:包控制權(quán)限和公開訪問權(quán)限,也就對(duì)應(yīng)兩種控制修飾符:public和默認(rèn)(default)。
如果類使用了private修飾符,說明是個(gè)內(nèi)部類。內(nèi)部類的上一級(jí)是外部類,那么對(duì)應(yīng)的有四種訪問控制修飾符:本類(private),同包(default),父子類(protected),任何位置(public)。當(dāng)一個(gè)內(nèi)部類使用了private修飾后,只能在該類的外部類內(nèi)部使用。
上面這些都是平時(shí)使用司空見慣的,但是為什么是這種情況呢?
可以想一下,一個(gè)java項(xiàng)目是不可能在一個(gè)class里面完成的。mvc模式中,是把類分為三層,一層層調(diào)用類。如果定義為私有的和受保護(hù)的就無法調(diào)用。換句話說,對(duì)于一個(gè)java文件,要么就是自己?jiǎn)为?dú)運(yùn)行,要么就是被其他程序作為庫(kù)調(diào)用,如果一個(gè)java文件的類被private修飾,那么是不是其他的程序或是類是無法使用它的,那么他作為一個(gè)單獨(dú)的文件就沒啥用了。如果它作為單個(gè)文件運(yùn)行,類加載怎么找到它呢,因?yàn)樗鼘?duì)外不可見。同時(shí),也失去了類的存在意義。因此,類只有public和默認(rèn)修飾符。
類名命名規(guī)范:要見名知義,意思是需要多個(gè)有意義的英文單詞組成,每個(gè)單詞首字母大寫,規(guī)范這種東西,建議遵守!養(yǎng)成好習(xí)慣。
上面三種成員(構(gòu)造器,成員變量,方法)都可以定義零個(gè)或多個(gè),但是都是零個(gè)就變成了空類,沒啥意義。
定義一個(gè)成員變量
[修飾符] 類型 成員變量名 [=默認(rèn)值]; //例如 boolean isMale; String color = "Blue";
成員變量包括實(shí)例變量和類變量,static修飾的成員變量稱作類變量,關(guān)于static之后再細(xì)講。
定義一個(gè)方法
[修飾符] 返回值類型 方法名(形參列表)
{
零條到多條可執(zhí)行語句組成的方法體...
}
//例如
void sleep(){
System.out.println(name+"is sleeping---");
}
public void jump() {
System.out.println(name+"is jumping---");
}
public void laughAt(String otherName)
{
System.out.println(name+"is laughing at "+otherName);
}
//返回boolean類型的方法
boolean isNotMale() {
return !isMale;
}
定義一個(gè)構(gòu)造器
[修飾符] 構(gòu)造器名 (形參列表)
{
(零條到多條可執(zhí)行語句組成的構(gòu)造器執(zhí)行體...
}
//例如
//構(gòu)造方法
Cat() {
System.out.println("cat is cute.");
}
- 構(gòu)造器用于構(gòu)造類的實(shí)例,也就是創(chuàng)建某個(gè)類的對(duì)象時(shí)會(huì)自動(dòng)調(diào)用構(gòu)造方法,之后會(huì)討論。
- 構(gòu)造器名一定要和類名相同!
- 沒有定義構(gòu)造器的話,系統(tǒng)會(huì)提供默認(rèn)的構(gòu)造器。
設(shè)計(jì)類時(shí)的具體細(xì)節(jié),接下來將會(huì)一一展開,還有未涉及到的內(nèi)部類和代碼塊部分,之后將會(huì)進(jìn)行學(xué)習(xí),暫且從這三個(gè)部分展開探究。
類的實(shí)例化
通過類構(gòu)造屬于該類對(duì)象的過程就叫做類的實(shí)例化。對(duì)象是具體存在的事物,也稱作實(shí)例,可以調(diào)用類中定義的實(shí)例變量以及方法。(不考慮static修飾變量的情況下)
創(chuàng)建對(duì)象及使用對(duì)象:
//使用Cat類創(chuàng)建了Cat類型的對(duì)象
//并調(diào)用Cat類的構(gòu)造器,返回Cat的實(shí)例,賦值給變量cat
Cat cat = new Cat();
//訪問cat的實(shí)例變量name和isMale,并為他們賦值
cat.name = "sink";
cat.isMale = true;
//調(diào)用cat的方法
cat.sleep();
cat.jump();
cat.laughAt("Susan");
//輸出isNotMale()方法的返回值
System.out.println(cat.isNotMale());
- 如果訪問權(quán)限允許的情況下(訪問權(quán)限涉及到private等關(guān)鍵字,暫且不談),類中定義的方法和成員變量都可以通過類或?qū)嵗齺碚{(diào)用。
- 創(chuàng)建對(duì)象:類型 實(shí)例名 = new 類型(參數(shù)列表);例如:Cat cat = new Cat();
- 調(diào)用類成員變量或方法:類.類變量或類.方法或?qū)嵗?實(shí)例變量或?qū)嵗?方法,類變量涉及static關(guān)鍵字,也是暫且放一邊,之后繼續(xù)回顧。
可以這么理解:定義類就是為了創(chuàng)建許許多多該類的實(shí)例,這些實(shí)例具有相同的特征。
創(chuàng)建對(duì)象的過程在內(nèi)存中的表現(xiàn)
類是一種引用數(shù)據(jù)類型:也就是說,在棧內(nèi)存里的引用變量并不是真正存儲(chǔ)對(duì)象的成員變量,而是它的引用,實(shí)際的成員變量藏在堆內(nèi)存中,這一點(diǎn)類似于前面提到過的數(shù)組類型。而且,可以知道,棧內(nèi)存中存儲(chǔ)的是實(shí)際對(duì)象在堆內(nèi)存中的地址值,可以直接打印引用變量cat的值驗(yàn)證。
創(chuàng)建對(duì)象
//創(chuàng)建對(duì)象,并初始化 Cat cat = new Cat();

訪問實(shí)例變量
//訪問實(shí)例變量 cat.name = "sink"; cat.isMale = true;

Java不允許直接訪問堆內(nèi)存中的對(duì)象,只能通過該對(duì)象的引用操作該對(duì)象。
另外,堆內(nèi)存中的同一個(gè)對(duì)象可以由棧內(nèi)存中多個(gè)引用變量所指向。例如:
//把引用變量cat賦值給另一個(gè)引用變量otherCat Cat otherCat = cat;
這時(shí),cat和otherCat都在棧內(nèi)存中被創(chuàng)建,且他們都指向了原先cat所指向的那塊堆內(nèi)存,所以他們操作的是同一個(gè)實(shí)際對(duì)象。
堆內(nèi)存的對(duì)象沒有任何變量指向時(shí),就會(huì)在一段時(shí)間內(nèi)作為“垃圾”被Java的垃圾回收機(jī)制回收,釋放對(duì)象所占用的內(nèi)存區(qū)。
所以想讓他提前釋放,直接給引用變量賦值為null。
參考書籍:《瘋狂Java講義》
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
java servlet結(jié)合Oracle搭建java的web開發(fā)環(huán)境
今天我將與大家分享一下我學(xué)JAVA WEB寫的一些小實(shí)例 ,我個(gè)人是不太喜歡書本上的晦澀的概念的,所以我花了更多的時(shí)間在一些應(yīng)用實(shí)例上,我覺得這樣的學(xué)習(xí)方式很適合我,由簡(jiǎn)到繁,由淺入深2015-12-12
vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過程
這篇文章主要介紹了vscode 配置java環(huán)境并調(diào)試運(yùn)行的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05
Java maven三種倉(cāng)庫(kù),本地倉(cāng)庫(kù),私服,中央倉(cāng)庫(kù)的配置
今天給大家簡(jiǎn)單介紹Maven三種倉(cāng)庫(kù)的配置,文中有非常詳細(xì)的解釋,對(duì)Java初學(xué)者很有幫助喲,需要的朋友可以參考下,希望能夠給你帶來幫助2021-09-09
springboot項(xiàng)目整合注冊(cè)功能模塊開發(fā)實(shí)戰(zhàn)
這篇文章主要介紹了springboot項(xiàng)目整合注冊(cè)功能模塊開發(fā)實(shí)戰(zhàn),在用戶的注冊(cè)是首先需要查詢當(dāng)前的用戶名是否存在,如果存在則不能進(jìn)行注冊(cè),相當(dāng)于一個(gè)查詢語句,本文通過實(shí)例代碼詳細(xì)講解,需要的朋友可以參考下2022-11-11
一篇文章學(xué)會(huì)java死鎖與CPU 100%的排查
這篇文章主要介紹了一篇文章學(xué)會(huì)java死鎖與CPU 100%的排查,文中主要介紹了Java死鎖以及服務(wù)器CPU占用率達(dá)到100%時(shí)的排查和解決方法,感興趣的朋友一起來看一看吧2021-08-08
SpringCloud Ribbon負(fù)載均衡工具使用
Ribbon是Netflix的組件之一,負(fù)責(zé)注冊(cè)中心的負(fù)載均衡,有助于控制HTTP和TCP客戶端行為。Spring?Cloud?Netflix?Ribbon一般配合Ribbon進(jìn)行使用,利用在Eureka中讀取的服務(wù)信息,在調(diào)用服務(wù)節(jié)點(diǎn)時(shí)合理進(jìn)行負(fù)載2023-02-02
SpringCloud與Dubbo集成Nacos時(shí)服務(wù)重復(fù)注冊(cè)問題的分析與解決
Nacos作為阿里巴巴開源的服務(wù)注冊(cè)與發(fā)現(xiàn)工具,廣泛應(yīng)用于Spring Cloud和Dubbo等微服務(wù)框架中,然而,在實(shí)際開發(fā)中,我們可能會(huì)遇到服務(wù)重復(fù)注冊(cè)的問題,下面我們就來詳細(xì)分析一下這一問題2025-03-03

