全方位講解Java的面向?qū)ο缶幊趟枷?/h1>
更新時(shí)間:2016年01月30日 18:03:40 作者:nisior
這篇文章主要介紹了Java的面相對(duì)象編程思想,包括類對(duì)象方法和封裝繼承多態(tài)等各個(gè)方面的OOP基本要素,非常推薦,需要的朋友可以參考下
什么是面向?qū)ο螅?br />
Object 對(duì)象,Oriendted 以…為導(dǎo)向的, Programming 程序設(shè)計(jì)
面向?qū)ο缶褪鞘褂脤?duì)象進(jìn)行程序設(shè)計(jì),簡(jiǎn)寫成OOP。

SP和OOP對(duì)比

面向?qū)ο蟮娜笤瓌t
封裝 繼承 多態(tài)
對(duì)象
對(duì)象是面向?qū)ο缶幊痰暮诵牟糠?,是?shí)際存在的具體實(shí)體,具有明確定義的狀態(tài)和行為;
對(duì)象其實(shí)就是“數(shù)據(jù)”和“函數(shù)”的封裝體,其中:
數(shù)據(jù)表示自身的狀態(tài),也稱作“屬性”或“成員數(shù)據(jù)”;
函數(shù)表示自身的功能,也稱作“方法”或“成員函數(shù)”。
類
人們?yōu)榱烁玫卣J(rèn)識(shí)世界,將現(xiàn)實(shí)生活中的事物(對(duì)象)劃分成類;
同一類中的事物總是具有一些共性;
類以共同的特性和行為定義實(shí)體;
類是具有相同屬性和和行為的一組對(duì)象的集合。
屬性
事物的特性在類中用變量表示;
每個(gè)對(duì)象的每個(gè)屬性都擁有其特定的值;
屬性名稱由類的所有對(duì)象共享;
對(duì)象或?qū)嶓w擁有的特征在類中表示時(shí)稱為屬性

方法
事物的行為和動(dòng)作在類中用函數(shù)表示;
每個(gè)對(duì)象都有相同的動(dòng)作和行為;
對(duì)象執(zhí)行的操作在類中表示為方法。

類和對(duì)象的區(qū)別
類是用來(lái)描述實(shí)體的“模板”或“原型”;
對(duì)象是實(shí)際的實(shí)體,每一個(gè)對(duì)象都是類的一個(gè)具體實(shí)例;
類用來(lái)定義對(duì)象所有的屬性和方法,同一類的所有對(duì)象都擁有相同的特征和操作;
可以將類理解成生產(chǎn)產(chǎn)品的模具,而對(duì)象則是根據(jù)此模具生產(chǎn)的一個(gè)個(gè)產(chǎn)品。
類與結(jié)構(gòu)

封裝
將某些東西包裝在一起,然后以新的完整形式呈現(xiàn)出來(lái);
隱藏屬性、方法或?qū)崿F(xiàn)細(xì)節(jié)的處理方式稱為封裝;
封裝其實(shí)就是有選擇性地公開或隱藏某些信息,它解決了數(shù)據(jù)的安全性問(wèn)題。

繼承
繼承就是重用現(xiàn)有的類來(lái)生成新類的一種特征;
通俗地講就是從現(xiàn)有的類(即父類或基類)創(chuàng)建新類(子類或派生類)的過(guò)程;
現(xiàn)實(shí)生活中,繼承可以達(dá)到財(cái)產(chǎn)重用的目的,而在Java中,繼承可以使代碼重用。
多態(tài)
多態(tài)是指同一函數(shù)在不同的類中有不同的實(shí)現(xiàn);
多態(tài)的好處就是使類更靈活,更便于擴(kuò)充。
這里還有一個(gè)不得不說(shuō)的的 “抽象”
抽象
把相同的或相似的對(duì)象歸為一類的這個(gè)過(guò)程就是抽象,所以,抽象就是分析問(wèn)題的方法;
抽象的基本原則:
只關(guān)心主要問(wèn)題,而不關(guān)心次要問(wèn)題;
只關(guān)心主要矛盾,而不關(guān)心次要矛盾;
只關(guān)心相同的東西,而不關(guān)心不同的東西;
只關(guān)心問(wèn)題是什么,能夠完成什么,而不關(guān)心怎樣去完成。
抽象的過(guò)程其實(shí)就是面向?qū)ο缶幊痰暮诵乃枷搿?/p>
在Java中定義類

在Java中創(chuàng)建對(duì)象

創(chuàng)建對(duì)象的語(yǔ)法
和數(shù)組相似,對(duì)象也是引用數(shù)據(jù)類型,只能使用new運(yùn)算符從堆中分配內(nèi)存;
創(chuàng)建對(duì)象的一般語(yǔ)法:
類名 引用名 = new 類名();
使用已經(jīng)定義好的類,創(chuàng)建該類對(duì)象的過(guò)程稱為“實(shí)例化”。
成員運(yùn)算符 “ . ”
只有先實(shí)例化類的對(duì)象,才可以訪問(wèn)到類中的成員(屬性和方法);
使用成員運(yùn)算符(.)來(lái)訪問(wèn)成員屬性或成員方法;
一般語(yǔ)法是:
對(duì)象名.成員名
如:
std.age = 18; //為成員屬性賦值
std.dining(); //調(diào)用成員方法
訪問(wèn)權(quán)限:public和private
C語(yǔ)言中結(jié)構(gòu)體的成員可以從任何地方進(jìn)行訪問(wèn),這將給數(shù)據(jù)的安全留下極大的隱患;
為了避免從類外部直接訪問(wèn)類成員而造成的數(shù)據(jù)損壞,Java對(duì)類成員的訪問(wèn)制定了約束;
關(guān)鍵字public和private是訪問(wèn)修飾符,用來(lái)說(shuō)明某個(gè)成員是否可以從類外部進(jìn)行訪問(wèn);
public修飾的成員可以在任何地方進(jìn)行訪問(wèn),不受任何約束;
private修飾的成員只能夠被本類中的其它成員訪問(wèn),而不能從類的外部進(jìn)行訪問(wèn)。
無(wú)法從類的外部訪問(wèn)私有成員;
其它類的私有成員對(duì)于當(dāng)前類也是隱藏的。

訪問(wèn)權(quán)限示例
class Student {
private String name; //姓名,私有的,不可以從類外部直接訪問(wèn)
private int age; //年齡,私有的,不可以從類外部直接訪問(wèn)
private float weight; //體重,私有的,不可以從類外部直接訪問(wèn)
//吃飯的方法,公有的,可以從任何地方訪問(wèn)
public void dining() {
System.out.println("吃飽了...");
weight++; //dining方法是類內(nèi)部成員,可以直接訪問(wèn)本類私有成員
}
//走路的方法,公有的,可以從任何地方訪問(wèn)
public void walk() {
System.out.println("走累了...");
weight--; //walk方法是類內(nèi)部成員,可以直接訪問(wèn)本類私有成員
}
}
public class Test {
public static void main(String[] args) {
Student std = new Student(); //實(shí)例化一個(gè)Student對(duì)象
std.age = 18; //試圖從類外部訪問(wèn)私有成員,將會(huì)報(bào)出一個(gè)錯(cuò)誤
std.dining(); //允許訪問(wèn)公有成員
}
}
訪問(wèn)權(quán)限(續(xù))
加上訪問(wèn)修飾符有時(shí)候可能會(huì)給操作數(shù)據(jù)帶來(lái)不便,但可以在很大程度上保證數(shù)據(jù)的安全;
一般地,我們會(huì)將成員屬性聲明為private,而將成員方法聲明為public,但這樣做并不是絕對(duì)的;
有時(shí)候,類外部可能要操作到某些私有數(shù)據(jù)成員,那么就可以增加一個(gè)公有的方法,再由這個(gè)方法來(lái)操作私有數(shù)據(jù),避免因類外部的誤操作而造成的數(shù)據(jù)損壞;
因?yàn)閙ain方法要由類外部的虛擬機(jī)來(lái)調(diào)用,所以main方法必須聲明成public。
如:修改Student類
class Student { //定義學(xué)生類
private String name; //姓名,私有
private int age; //年齡,私有
private float weight; //體重,私有
public void setName(String name) { //為姓名賦值的方法,公有
this.name = name;
}
public void setAge(int a) { //為年齡賦值的方法,公有
age = a;
}
public void setWeight(float w) { //為體重賦值的方法,公有
weight = w;
}
public void display() { //將所有信息打印出來(lái)的方法,公有
System.out.println("姓名:" + name + ",年齡:" + age + ",體重:" + weight);
}
public void dining() {……} //吃飯的方法,公有,代碼略
public void walk() {……} //走路的方法,公有,代碼略
}
public class Test {
public static void main(String[] args) {
Student std = new Student(); //實(shí)例化學(xué)生類對(duì)象
std.setName("張三"); //為姓名賦值
std.setAge(18); //為年齡賦值
std.setWeight(55); //為體重賦值
std.dining(); //調(diào)用吃飯的方法
std.display(); //將信息打印出來(lái)
}
}
對(duì)象初始化
在上例中,只能逐個(gè)地為數(shù)據(jù)成員賦值,如果想在對(duì)象實(shí)例化的同時(shí)就初始化成員屬性,就使用到了構(gòu)造方法;
構(gòu)造方法是特殊的成員方法,它與類同名,在對(duì)象實(shí)例化時(shí)由虛擬機(jī)自動(dòng)調(diào)用;
請(qǐng)注意:構(gòu)造方法沒有返回值類型,也不能有返回值。
構(gòu)造方法示例:
/*定義ConstructorDemo類,對(duì)構(gòu)造方法進(jìn)行測(cè)試*/
class ConstructorDemo
{
/*構(gòu)造方法,方法名與類名完全一致
無(wú)需指定返回值類型,也不能有返回值*/
public ConstructorDemo()
{
System.out.println("這是構(gòu)造方法");
}
}
/*Test類,用來(lái)容納main方法
一般將包含有main方法的類聲明為public*/
public class Test
{
/*main方法,程序入口*/
public static void main(String[] args)
{
/*實(shí)例化ConstructorDemo類的對(duì)象*/
ConstructorDemo cd = new ConstructorDemo();
}
} //會(huì)輸出“這是構(gòu)造方法”
構(gòu)造方法
正是由于在實(shí)例化對(duì)象的同時(shí)會(huì)自動(dòng)調(diào)用構(gòu)造方法,所以構(gòu)造方法一般用來(lái)給數(shù)據(jù)成員分配資源或初始化數(shù)據(jù)成員;
構(gòu)造方法的一般形式:
訪問(wèn)權(quán)限 類名(形參列表) {
方法體
}
因?yàn)槭怯商摂M機(jī)來(lái)調(diào)用構(gòu)造方法,所以構(gòu)造方法一般應(yīng)定義成public。
如:為Student類添加構(gòu)造方法
class Student { //定義學(xué)生類
private String name; //姓名,私有
private int age; //年齡,私有
private float weight; //體重,私有
//構(gòu)造方法,根據(jù)傳遞進(jìn)來(lái)的參數(shù),為數(shù)據(jù)成員賦值
public Student(String n, int a, float w) {
//分別為每個(gè)數(shù)據(jù)成員賦初始值
name = n;
age = a;
weight = w;
}
public void setName(String n) {……} //為姓名賦值的方法,公有,代碼略
public void setAge(int a) {……} //為年齡賦值的方法,公有,代碼略
public void setWeight(float w) {……} //為體重賦值的方法,公有,代碼略
public void display() {……} //將所有信息打印出來(lái)的方法,公有,代碼略
public void dining() {……} //吃飯的方法,公有,代碼略
public void walk() {……} //走路的方法,公有,代碼略
}
public class Test {
public static void main(String[] args) {
//利用構(gòu)造方法,為數(shù)據(jù)成員指定初始值
Student std = new Student("張三", 18, 55);
std.display(); //將信息打印出來(lái)
}
}
構(gòu)造方法(續(xù))
每個(gè)對(duì)象在生成時(shí)都必須執(zhí)行構(gòu)造方法,而且只能執(zhí)行一次;
如果構(gòu)造方法調(diào)用失敗,那么對(duì)象也無(wú)法創(chuàng)建;
不可以顯式地直接調(diào)用構(gòu)造方法;
在沒有定義構(gòu)造方法的情況下,類會(huì)自動(dòng)產(chǎn)生一個(gè)無(wú)參數(shù)的默認(rèn)構(gòu)造方法,這個(gè)默認(rèn)的構(gòu)造方法什么都不做;
一旦顯式地定義了構(gòu)造方法,默認(rèn)構(gòu)造方法自動(dòng)消失。故一般定義無(wú)參和有參兩個(gè)構(gòu)造方法。
總結(jié)
- 對(duì)象由狀態(tài)(屬性)和行為(方法)組成;
- 類是具有相同屬性和方法的對(duì)象的集合;
- 封裝可以隱藏對(duì)象實(shí)現(xiàn)的具體細(xì)節(jié);
- 必須先實(shí)例化類的對(duì)象,才可以訪問(wèn)到其中的成員;
- 成員運(yùn)算符用于訪問(wèn)對(duì)象的成員;
- 成員可以定義為公有,也可以定義為私有;
- 構(gòu)造方法一般用來(lái)初始化對(duì)象中的數(shù)據(jù)成員;
- 如果不定義構(gòu)造方法,將有默認(rèn)的構(gòu)造方法,一旦定義,默認(rèn)的構(gòu)造方法自動(dòng)消失。
相關(guān)文章
-
Idea2023配置JavaWeb項(xiàng)目(最新)
本文將介紹如何配置JavaWeb項(xiàng)目,以在Idea中實(shí)現(xiàn)開發(fā)環(huán)境,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧 2023-09-09
-
SpringBoot中API接口參數(shù)獲取方式小結(jié)
在Spring Boot中,API接口參數(shù)可以通過(guò)多種方式獲取,具體取決于你定義的API接口參數(shù)類型(如路徑參數(shù)、查詢參數(shù)、請(qǐng)求體參數(shù)、請(qǐng)求頭等),本文給大家就介紹了一些常見的參數(shù)獲取方式,需要的朋友可以參考下 2024-06-06
-
如何解決freemarker靜態(tài)化生成html頁(yè)面亂碼的問(wèn)題
這篇文章主要介紹了如何解決freemarker靜態(tài)化生成html頁(yè)面亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2023-01-01
-
Java getParameter()獲取數(shù)據(jù)為空的問(wèn)題
這篇文章主要介紹了Java getParameter()獲取數(shù)據(jù)為空的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2022-03-03
-
Spring MVC實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)增刪改查完整實(shí)例
這篇文章主要介紹了Spring MVC實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)增刪改查完整實(shí)例,從創(chuàng)建一個(gè)web項(xiàng)目開始,分享了項(xiàng)目結(jié)構(gòu)以及具體Java代碼和前端頁(yè)面等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以了解下。 2017-12-12
-
Java操作minio刪除文件夾及其文件方法(MinIO基本使用)
MinIO是一個(gè)高性能、無(wú)限擴(kuò)展的開源對(duì)象存儲(chǔ)服務(wù)器,它以對(duì)象的形式存儲(chǔ)數(shù)據(jù),并兼容Amazon S3接口,它適用于大規(guī)模數(shù)據(jù)存儲(chǔ)、大數(shù)據(jù)分析、文件共享和備份等應(yīng)用場(chǎng)景,這篇文章主要介紹了java操作minio刪除文件夾及其文件方法,需要的朋友可以參考下 2024-02-02
-
Springboot整合JPA配置多數(shù)據(jù)源流程詳解
這篇文章主要介紹了Springboot整合JPA配置多數(shù)據(jù)源,JPA可以通過(guò)實(shí)體類生成數(shù)據(jù)庫(kù)的表,同時(shí)自帶很多增刪改查方法,大部分sql語(yǔ)句不需要我們自己寫,配置完成后直接調(diào)用方法即可,很方便 2022-11-11
-
Java中批處理框架spring batch詳細(xì)介紹
這篇文章主要介紹了Java中批處理框架spring batch詳細(xì)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧 2020-07-07
最新評(píng)論
什么是面向?qū)ο螅?br /> Object 對(duì)象,Oriendted 以…為導(dǎo)向的, Programming 程序設(shè)計(jì)
面向?qū)ο缶褪鞘褂脤?duì)象進(jìn)行程序設(shè)計(jì),簡(jiǎn)寫成OOP。
SP和OOP對(duì)比
面向?qū)ο蟮娜笤瓌t
封裝 繼承 多態(tài)
對(duì)象
對(duì)象是面向?qū)ο缶幊痰暮诵牟糠?,是?shí)際存在的具體實(shí)體,具有明確定義的狀態(tài)和行為;
對(duì)象其實(shí)就是“數(shù)據(jù)”和“函數(shù)”的封裝體,其中:
數(shù)據(jù)表示自身的狀態(tài),也稱作“屬性”或“成員數(shù)據(jù)”;
函數(shù)表示自身的功能,也稱作“方法”或“成員函數(shù)”。
類
人們?yōu)榱烁玫卣J(rèn)識(shí)世界,將現(xiàn)實(shí)生活中的事物(對(duì)象)劃分成類;
同一類中的事物總是具有一些共性;
類以共同的特性和行為定義實(shí)體;
類是具有相同屬性和和行為的一組對(duì)象的集合。
屬性
事物的特性在類中用變量表示;
每個(gè)對(duì)象的每個(gè)屬性都擁有其特定的值;
屬性名稱由類的所有對(duì)象共享;
對(duì)象或?qū)嶓w擁有的特征在類中表示時(shí)稱為屬性
方法
事物的行為和動(dòng)作在類中用函數(shù)表示;
每個(gè)對(duì)象都有相同的動(dòng)作和行為;
對(duì)象執(zhí)行的操作在類中表示為方法。
類和對(duì)象的區(qū)別
類是用來(lái)描述實(shí)體的“模板”或“原型”;
對(duì)象是實(shí)際的實(shí)體,每一個(gè)對(duì)象都是類的一個(gè)具體實(shí)例;
類用來(lái)定義對(duì)象所有的屬性和方法,同一類的所有對(duì)象都擁有相同的特征和操作;
可以將類理解成生產(chǎn)產(chǎn)品的模具,而對(duì)象則是根據(jù)此模具生產(chǎn)的一個(gè)個(gè)產(chǎn)品。
類與結(jié)構(gòu)
封裝
將某些東西包裝在一起,然后以新的完整形式呈現(xiàn)出來(lái);
隱藏屬性、方法或?qū)崿F(xiàn)細(xì)節(jié)的處理方式稱為封裝;
封裝其實(shí)就是有選擇性地公開或隱藏某些信息,它解決了數(shù)據(jù)的安全性問(wèn)題。
繼承
繼承就是重用現(xiàn)有的類來(lái)生成新類的一種特征;
通俗地講就是從現(xiàn)有的類(即父類或基類)創(chuàng)建新類(子類或派生類)的過(guò)程;
現(xiàn)實(shí)生活中,繼承可以達(dá)到財(cái)產(chǎn)重用的目的,而在Java中,繼承可以使代碼重用。
多態(tài)
多態(tài)是指同一函數(shù)在不同的類中有不同的實(shí)現(xiàn);
多態(tài)的好處就是使類更靈活,更便于擴(kuò)充。
這里還有一個(gè)不得不說(shuō)的的 “抽象”
抽象
把相同的或相似的對(duì)象歸為一類的這個(gè)過(guò)程就是抽象,所以,抽象就是分析問(wèn)題的方法;
抽象的基本原則:
只關(guān)心主要問(wèn)題,而不關(guān)心次要問(wèn)題;
只關(guān)心主要矛盾,而不關(guān)心次要矛盾;
只關(guān)心相同的東西,而不關(guān)心不同的東西;
只關(guān)心問(wèn)題是什么,能夠完成什么,而不關(guān)心怎樣去完成。
抽象的過(guò)程其實(shí)就是面向?qū)ο缶幊痰暮诵乃枷搿?/p>
在Java中定義類
在Java中創(chuàng)建對(duì)象
創(chuàng)建對(duì)象的語(yǔ)法
和數(shù)組相似,對(duì)象也是引用數(shù)據(jù)類型,只能使用new運(yùn)算符從堆中分配內(nèi)存;
創(chuàng)建對(duì)象的一般語(yǔ)法:
類名 引用名 = new 類名();
使用已經(jīng)定義好的類,創(chuàng)建該類對(duì)象的過(guò)程稱為“實(shí)例化”。
成員運(yùn)算符 “ . ”
只有先實(shí)例化類的對(duì)象,才可以訪問(wèn)到類中的成員(屬性和方法);
使用成員運(yùn)算符(.)來(lái)訪問(wèn)成員屬性或成員方法;
一般語(yǔ)法是:
對(duì)象名.成員名
如:
std.age = 18; //為成員屬性賦值 std.dining(); //調(diào)用成員方法
訪問(wèn)權(quán)限:public和private
C語(yǔ)言中結(jié)構(gòu)體的成員可以從任何地方進(jìn)行訪問(wèn),這將給數(shù)據(jù)的安全留下極大的隱患;
為了避免從類外部直接訪問(wèn)類成員而造成的數(shù)據(jù)損壞,Java對(duì)類成員的訪問(wèn)制定了約束;
關(guān)鍵字public和private是訪問(wèn)修飾符,用來(lái)說(shuō)明某個(gè)成員是否可以從類外部進(jìn)行訪問(wèn);
public修飾的成員可以在任何地方進(jìn)行訪問(wèn),不受任何約束;
private修飾的成員只能夠被本類中的其它成員訪問(wèn),而不能從類的外部進(jìn)行訪問(wèn)。
無(wú)法從類的外部訪問(wèn)私有成員;
其它類的私有成員對(duì)于當(dāng)前類也是隱藏的。
訪問(wèn)權(quán)限示例
class Student { private String name; //姓名,私有的,不可以從類外部直接訪問(wèn) private int age; //年齡,私有的,不可以從類外部直接訪問(wèn) private float weight; //體重,私有的,不可以從類外部直接訪問(wèn) //吃飯的方法,公有的,可以從任何地方訪問(wèn) public void dining() { System.out.println("吃飽了..."); weight++; //dining方法是類內(nèi)部成員,可以直接訪問(wèn)本類私有成員 } //走路的方法,公有的,可以從任何地方訪問(wèn) public void walk() { System.out.println("走累了..."); weight--; //walk方法是類內(nèi)部成員,可以直接訪問(wèn)本類私有成員 } } public class Test { public static void main(String[] args) { Student std = new Student(); //實(shí)例化一個(gè)Student對(duì)象 std.age = 18; //試圖從類外部訪問(wèn)私有成員,將會(huì)報(bào)出一個(gè)錯(cuò)誤 std.dining(); //允許訪問(wèn)公有成員 } }
訪問(wèn)權(quán)限(續(xù))
加上訪問(wèn)修飾符有時(shí)候可能會(huì)給操作數(shù)據(jù)帶來(lái)不便,但可以在很大程度上保證數(shù)據(jù)的安全;
一般地,我們會(huì)將成員屬性聲明為private,而將成員方法聲明為public,但這樣做并不是絕對(duì)的;
有時(shí)候,類外部可能要操作到某些私有數(shù)據(jù)成員,那么就可以增加一個(gè)公有的方法,再由這個(gè)方法來(lái)操作私有數(shù)據(jù),避免因類外部的誤操作而造成的數(shù)據(jù)損壞;
因?yàn)閙ain方法要由類外部的虛擬機(jī)來(lái)調(diào)用,所以main方法必須聲明成public。
如:修改Student類
class Student { //定義學(xué)生類 private String name; //姓名,私有 private int age; //年齡,私有 private float weight; //體重,私有 public void setName(String name) { //為姓名賦值的方法,公有 this.name = name; } public void setAge(int a) { //為年齡賦值的方法,公有 age = a; } public void setWeight(float w) { //為體重賦值的方法,公有 weight = w; } public void display() { //將所有信息打印出來(lái)的方法,公有 System.out.println("姓名:" + name + ",年齡:" + age + ",體重:" + weight); } public void dining() {……} //吃飯的方法,公有,代碼略 public void walk() {……} //走路的方法,公有,代碼略 } public class Test { public static void main(String[] args) { Student std = new Student(); //實(shí)例化學(xué)生類對(duì)象 std.setName("張三"); //為姓名賦值 std.setAge(18); //為年齡賦值 std.setWeight(55); //為體重賦值 std.dining(); //調(diào)用吃飯的方法 std.display(); //將信息打印出來(lái) } }
對(duì)象初始化
在上例中,只能逐個(gè)地為數(shù)據(jù)成員賦值,如果想在對(duì)象實(shí)例化的同時(shí)就初始化成員屬性,就使用到了構(gòu)造方法;
構(gòu)造方法是特殊的成員方法,它與類同名,在對(duì)象實(shí)例化時(shí)由虛擬機(jī)自動(dòng)調(diào)用;
請(qǐng)注意:構(gòu)造方法沒有返回值類型,也不能有返回值。
構(gòu)造方法示例:
/*定義ConstructorDemo類,對(duì)構(gòu)造方法進(jìn)行測(cè)試*/ class ConstructorDemo { /*構(gòu)造方法,方法名與類名完全一致 無(wú)需指定返回值類型,也不能有返回值*/ public ConstructorDemo() { System.out.println("這是構(gòu)造方法"); } } /*Test類,用來(lái)容納main方法 一般將包含有main方法的類聲明為public*/ public class Test { /*main方法,程序入口*/ public static void main(String[] args) { /*實(shí)例化ConstructorDemo類的對(duì)象*/ ConstructorDemo cd = new ConstructorDemo(); } } //會(huì)輸出“這是構(gòu)造方法”
構(gòu)造方法
正是由于在實(shí)例化對(duì)象的同時(shí)會(huì)自動(dòng)調(diào)用構(gòu)造方法,所以構(gòu)造方法一般用來(lái)給數(shù)據(jù)成員分配資源或初始化數(shù)據(jù)成員;
構(gòu)造方法的一般形式:
訪問(wèn)權(quán)限 類名(形參列表) {
方法體
}
因?yàn)槭怯商摂M機(jī)來(lái)調(diào)用構(gòu)造方法,所以構(gòu)造方法一般應(yīng)定義成public。
如:為Student類添加構(gòu)造方法
class Student { //定義學(xué)生類 private String name; //姓名,私有 private int age; //年齡,私有 private float weight; //體重,私有 //構(gòu)造方法,根據(jù)傳遞進(jìn)來(lái)的參數(shù),為數(shù)據(jù)成員賦值 public Student(String n, int a, float w) { //分別為每個(gè)數(shù)據(jù)成員賦初始值 name = n; age = a; weight = w; } public void setName(String n) {……} //為姓名賦值的方法,公有,代碼略 public void setAge(int a) {……} //為年齡賦值的方法,公有,代碼略 public void setWeight(float w) {……} //為體重賦值的方法,公有,代碼略 public void display() {……} //將所有信息打印出來(lái)的方法,公有,代碼略 public void dining() {……} //吃飯的方法,公有,代碼略 public void walk() {……} //走路的方法,公有,代碼略 } public class Test { public static void main(String[] args) { //利用構(gòu)造方法,為數(shù)據(jù)成員指定初始值 Student std = new Student("張三", 18, 55); std.display(); //將信息打印出來(lái) } }
構(gòu)造方法(續(xù))
每個(gè)對(duì)象在生成時(shí)都必須執(zhí)行構(gòu)造方法,而且只能執(zhí)行一次;
如果構(gòu)造方法調(diào)用失敗,那么對(duì)象也無(wú)法創(chuàng)建;
不可以顯式地直接調(diào)用構(gòu)造方法;
在沒有定義構(gòu)造方法的情況下,類會(huì)自動(dòng)產(chǎn)生一個(gè)無(wú)參數(shù)的默認(rèn)構(gòu)造方法,這個(gè)默認(rèn)的構(gòu)造方法什么都不做;
一旦顯式地定義了構(gòu)造方法,默認(rèn)構(gòu)造方法自動(dòng)消失。故一般定義無(wú)參和有參兩個(gè)構(gòu)造方法。
總結(jié)
- 對(duì)象由狀態(tài)(屬性)和行為(方法)組成;
- 類是具有相同屬性和方法的對(duì)象的集合;
- 封裝可以隱藏對(duì)象實(shí)現(xiàn)的具體細(xì)節(jié);
- 必須先實(shí)例化類的對(duì)象,才可以訪問(wèn)到其中的成員;
- 成員運(yùn)算符用于訪問(wèn)對(duì)象的成員;
- 成員可以定義為公有,也可以定義為私有;
- 構(gòu)造方法一般用來(lái)初始化對(duì)象中的數(shù)據(jù)成員;
- 如果不定義構(gòu)造方法,將有默認(rèn)的構(gòu)造方法,一旦定義,默認(rèn)的構(gòu)造方法自動(dòng)消失。
相關(guān)文章
Idea2023配置JavaWeb項(xiàng)目(最新)
本文將介紹如何配置JavaWeb項(xiàng)目,以在Idea中實(shí)現(xiàn)開發(fā)環(huán)境,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-09-09SpringBoot中API接口參數(shù)獲取方式小結(jié)
在Spring Boot中,API接口參數(shù)可以通過(guò)多種方式獲取,具體取決于你定義的API接口參數(shù)類型(如路徑參數(shù)、查詢參數(shù)、請(qǐng)求體參數(shù)、請(qǐng)求頭等),本文給大家就介紹了一些常見的參數(shù)獲取方式,需要的朋友可以參考下2024-06-06如何解決freemarker靜態(tài)化生成html頁(yè)面亂碼的問(wèn)題
這篇文章主要介紹了如何解決freemarker靜態(tài)化生成html頁(yè)面亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Java getParameter()獲取數(shù)據(jù)為空的問(wèn)題
這篇文章主要介紹了Java getParameter()獲取數(shù)據(jù)為空的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Spring MVC實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)增刪改查完整實(shí)例
這篇文章主要介紹了Spring MVC實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)增刪改查完整實(shí)例,從創(chuàng)建一個(gè)web項(xiàng)目開始,分享了項(xiàng)目結(jié)構(gòu)以及具體Java代碼和前端頁(yè)面等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12Java操作minio刪除文件夾及其文件方法(MinIO基本使用)
MinIO是一個(gè)高性能、無(wú)限擴(kuò)展的開源對(duì)象存儲(chǔ)服務(wù)器,它以對(duì)象的形式存儲(chǔ)數(shù)據(jù),并兼容Amazon S3接口,它適用于大規(guī)模數(shù)據(jù)存儲(chǔ)、大數(shù)據(jù)分析、文件共享和備份等應(yīng)用場(chǎng)景,這篇文章主要介紹了java操作minio刪除文件夾及其文件方法,需要的朋友可以參考下2024-02-02Springboot整合JPA配置多數(shù)據(jù)源流程詳解
這篇文章主要介紹了Springboot整合JPA配置多數(shù)據(jù)源,JPA可以通過(guò)實(shí)體類生成數(shù)據(jù)庫(kù)的表,同時(shí)自帶很多增刪改查方法,大部分sql語(yǔ)句不需要我們自己寫,配置完成后直接調(diào)用方法即可,很方便2022-11-11Java中批處理框架spring batch詳細(xì)介紹
這篇文章主要介紹了Java中批處理框架spring batch詳細(xì)介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07