Java重點(diǎn)梳理類(lèi)與對(duì)象核心原理
前言
在前面的篇章中,對(duì)Java語(yǔ)言的簡(jiǎn)單數(shù)據(jù)類(lèi)型、數(shù)組、運(yùn)算符和表達(dá)式以及流程控制的方法做了詳細(xì)介紹。從本章開(kāi)始,我們正式介紹面向?qū)ο蟮某绦蛟O(shè)計(jì)方法!
面向?qū)ο蟮木幊趟枷胧橇D使在計(jì)算機(jī)語(yǔ)言中對(duì)事物的描述與現(xiàn)實(shí)世界中該事物的本來(lái)面目盡可能一致。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,類(lèi)和對(duì)象是面向?qū)ο蟪绦蛟O(shè)計(jì)方法中最核心的概念。
一、類(lèi)與對(duì)象的基本關(guān)系
對(duì)象:對(duì)象是類(lèi)的一個(gè)實(shí)例(對(duì)象不是找個(gè)女朋友),有狀態(tài)和行為。例如,一條狗是一個(gè)對(duì)象,它的狀態(tài)有:顏色、名字、品種;行為有:搖尾巴、叫、吃等。
類(lèi):類(lèi)是一個(gè)模板,它描述一類(lèi)對(duì)象的行為和狀態(tài)。
下圖中男孩(boy)、女孩(girl)為 類(lèi)(class),而具體的每個(gè)人為該類(lèi)的 對(duì)象(object):

下圖中汽車(chē)為類(lèi)(class),而具體的每輛車(chē)為該汽車(chē)類(lèi)的對(duì)象(object),對(duì)象包含了汽車(chē)的顏色、品牌、名稱(chēng)等。

二、類(lèi)與對(duì)象的使用
1.類(lèi)的定義
類(lèi)可以看成是創(chuàng)建 Java 對(duì)象的模板。

通過(guò)上圖創(chuàng)建一個(gè)簡(jiǎn)單的類(lèi)來(lái)理解下 Java 中類(lèi)的定義:
public class Dog {
String breed;
int size;
String colour;
int age;
void eat() {
}
void run() {
}
void sleep(){
}
void name(){
}
}2.對(duì)象的創(chuàng)建
對(duì)象是根據(jù)類(lèi)創(chuàng)建的。在Java中,使用關(guān)鍵字 new 來(lái)創(chuàng)建一個(gè)新的對(duì)象。創(chuàng)建對(duì)象需要以下三步:
① 聲明:聲明一個(gè)對(duì)象,包括對(duì)象名稱(chēng)和對(duì)象類(lèi)型。
② 實(shí)例化:使用關(guān)鍵字 new 來(lái)創(chuàng)建一個(gè)對(duì)象。
③ 初始化:使用 new 創(chuàng)建對(duì)象時(shí),會(huì)調(diào)用構(gòu)造方法初始化對(duì)象。
下面是一個(gè)創(chuàng)建對(duì)象的例子:
public class Dog{
public Puppy(String name){
//這個(gè)構(gòu)造器僅有一個(gè)參數(shù):name
System.out.println("小狗的名字是 : " + name );
}
public static void main(String[] args){
// 下面的語(yǔ)句將創(chuàng)建一個(gè)Dog對(duì)象
Puppy myDog = new Dog( "小黑" );
}
}編譯并運(yùn)行上面的程序,會(huì)打印出下面的結(jié)果:
小狗的名字是 : 小黑
3.對(duì)象的使用
創(chuàng)建對(duì)象后,就可以對(duì)對(duì)象的成員進(jìn)行訪問(wèn)。通過(guò)對(duì)象來(lái)引用對(duì)象成員的格式如下:
對(duì)象名.對(duì)象成員
例如,將對(duì)象circle的半徑賦值為1.2,其代碼為:
circle.radius=2.8;
4.在類(lèi)定義內(nèi)調(diào)用方法
下面的例子展示如何訪問(wèn)實(shí)例變量和調(diào)用成員方法:
public class Dog{
int dogAge;
public Dog(String name){
// 這個(gè)構(gòu)造器僅有一個(gè)參數(shù):name
System.out.println("小狗的名字是 : " + name );
}
public void setAge( int age ){
dogAge = age;
}
public int getAge( ){
System.out.println("小狗的年齡為 : " + dogAge );
return dogAge;
}
public static void main(String[] args){
/* 創(chuàng)建對(duì)象 */
dog myDog = new Dog( "小黑" );
/* 通過(guò)方法來(lái)設(shè)定age */
mydog.setAge( 2 );
/* 調(diào)用另一個(gè)方法獲取age */
mydog.getAge( );
/*你也可以像下面這樣訪問(wèn)成員變量 */
System.out.println("變量值 : " + myDog.dogAge );
}
}以上程序運(yùn)行結(jié)果為 :
小狗的名字是 : 小黑
小狗的年齡為 : 2
變量值 : 2
三、參數(shù)傳遞
從上面所介紹的方法的語(yǔ)法格式可以看出,方法既可以有返回值也可以有參數(shù)。
1.以變量為參數(shù)調(diào)用方法
調(diào)用方法并傳遞參數(shù)時(shí),參數(shù)其實(shí)就是方法的自變量,所以參數(shù)要放在括號(hào)內(nèi)來(lái)進(jìn)行傳遞。括號(hào)內(nèi)的參數(shù)可以是數(shù)值型、字符串型、甚至是對(duì)象。
我們就用一個(gè)圓柱體類(lèi)Cylinder介紹變量的調(diào)用方法:
public class Demo{
public static void main(String[] args){
Cylinder volu = new Cylinder();
volu.setCylinder(2.5,5,3.14);
System.out.println("底面半徑"+volu.radius);
System.out.println("圓柱的高"+volu.height);
System.out.println("圓周率"+volu.pi);
System.out.println("底面積"+volu.area());
System.out.println("園柱的體積"+volu.voluem());
}
}
class Cylinder{
double radius;
int height;
double pi;
void setCylinder(double r, int h, double p){//這是具有三個(gè)參數(shù)的方法
pi = p;
radius = r;
height = h;
}
double area() {
return pi*radius*radius;
}
double voluem(){
return area()*height;
}
}程序運(yùn)行結(jié)果為:
底面半徑2.5
圓柱的高5
圓周率3.14
底面積19.625
園柱的體積98.125
2.以數(shù)組為參數(shù)或返回值的方法調(diào)用
①數(shù)組作為調(diào)用方法的參數(shù)
三要素:
返回值類(lèi)型:只是打印而已,不需要進(jìn)行計(jì)算,也沒(méi)有結(jié)果,用void
方法名稱(chēng):prinArray
參數(shù)列表:必須給我數(shù)組,我才能打印其中的元素,int[]array
舉例:
public class Demo{
public static void main(String[] args) {
int[]array={10,20,30,40,50};
printArray(array);
System.out.println("AAAAAA");
}
public static void printArray(int[]array){ //必須有參數(shù)列表
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}程序運(yùn)行結(jié)果為:
10
20
30
40
50
AAAAAA
②數(shù)組作為返回值類(lèi)型
- 一個(gè)方法有0、1多個(gè)參數(shù),但是只能有0個(gè)或者1個(gè)返回值,不能有多個(gè)返回值
- Q:如果希望一個(gè)方法當(dāng)中產(chǎn)生了多個(gè)數(shù)據(jù)進(jìn)行返回,怎么辦?
- A:可以寫(xiě)入一個(gè)數(shù)組里面
- 任何數(shù)據(jù)類(lèi)型都能作為方法的參數(shù)類(lèi)型,或著返回值類(lèi)型。
- 數(shù)組作為方法的參數(shù),傳進(jìn)去的是其實(shí)是數(shù)組的地址值。
- 數(shù)組作為方法的返回值,返回其實(shí)也是數(shù)組的地址值。
舉例:
public class Demo {
public static void main(String[] args) {
int[] result=caculate(10,20,30);
System.out.println("main方法接收到的返回值是");
System.out.println(result);//地址值
System.out.println("總和是"+result[0]);
System.out.println("平均數(shù)是"+result[1]);
}
public static int[] caculate(int a,int b,int c){
int sum=a+b+c;//總和
int avg=sum/3;//平均數(shù)
//兩個(gè)結(jié)果都希望進(jìn)行返回
//需要一個(gè)數(shù)組,也就是一個(gè)塑料兜,數(shù)組可以保存多個(gè)信息
int []array={sum,avg};
System.out.println("caculate方法內(nèi)部的數(shù)組是");
System.out.println(array);//地址值
return array;
}
}程序運(yùn)行結(jié)果為:
caculate方法內(nèi)部的數(shù)組是
[I@776ec8df
main方法接收到的返回值是
[I@776ec8df
總和是60
平均數(shù)是20
四、匿名對(duì)象
當(dāng)一個(gè)對(duì)象被創(chuàng)建之后,在調(diào)用該對(duì)象方法時(shí),可以不定義對(duì)象的引用變量,而直接調(diào)用這個(gè)方法的對(duì)象,這樣的對(duì)象叫做匿名對(duì)象。
例如將上面 圓柱體類(lèi)Cylinder 介紹變量的代碼段中
Cylinder volu = new Cylinder();
volu.setCylinder(2.5,5,3.14);
改寫(xiě)為:
new Cylinder().setCylinder(2.5,5,3.14);
則new Cylinder()就是匿名對(duì)象。這個(gè)語(yǔ)句沒(méi)有聲明任何對(duì)象,而是直接用new運(yùn)算符創(chuàng)建了Cylinder類(lèi)的對(duì)象并直接調(diào)用了它的setCylinder()方法。這個(gè)語(yǔ)句的執(zhí)行結(jié)果與改寫(xiě)前的執(zhí)行相同。當(dāng)這個(gè)方法執(zhí)行完后,這個(gè)對(duì)象也就成為了垃圾。
匿名對(duì)象使用場(chǎng)景:
1:當(dāng)對(duì)方法只進(jìn)行一次調(diào)用的時(shí)候,可以使用匿名對(duì)象。
2:當(dāng)對(duì)象對(duì)成員進(jìn)行多次調(diào)用時(shí),不能使用匿名對(duì)象。必須給對(duì)象起名字。
例如將匿名對(duì)象作為一個(gè)參數(shù)傳遞給一個(gè)方法,如:
public void getPerson(Person p);{
......
}可以用下面的語(yǔ)句調(diào)用這個(gè)方法:
getPerson(new Person());
五、本篇總結(jié)
1.“類(lèi)”是把事物的數(shù)據(jù)與相關(guān)的功能封裝在一起,形成的一種特殊結(jié)構(gòu),用來(lái)表達(dá)現(xiàn)實(shí)世界的一種抽象概念。
2.同一個(gè)Java程序內(nèi),若定義了多個(gè)類(lèi),則最多只能有一個(gè)類(lèi)聲明為public,這種情文件名稱(chēng)必須與聲明成public的類(lèi)名稱(chēng)相同。
3.Java 語(yǔ)言把數(shù)據(jù)成員稱(chēng)為“成員變量" ,把函數(shù)成員稱(chēng)為“成員方法”,成員方法簡(jiǎn)為“方法”。
4.“封裝”是指把變量和方法包裝在一個(gè)類(lèi)內(nèi),以限定成員的訪問(wèn),從而達(dá)到保護(hù)數(shù)據(jù)的一種技術(shù)。
5.由類(lèi)所創(chuàng)建的對(duì)象稱(chēng)為“實(shí)例”。
6.創(chuàng)建屬于某類(lèi)的對(duì)象,可以通過(guò)下面兩個(gè)步驟來(lái)完成: (1)聲明指向“由類(lèi)所創(chuàng)建的對(duì)象”的變量; (2)利用new運(yùn)算符創(chuàng)建新的對(duì)象,并用步驟(1)所創(chuàng)建的變量來(lái)指向它。
7.要訪問(wèn)到對(duì)象里的某個(gè)成員變量時(shí),可以通過(guò)“對(duì)象名.成員變量名"的形式來(lái)實(shí)現(xiàn)若要調(diào)用封裝在類(lèi)內(nèi)的方法時(shí),則可以使用“對(duì)象名.方法名()”的語(yǔ)法形式來(lái)完成。
8.如果要強(qiáng)調(diào)“對(duì)象本身的成員”,可以在成員名前加上this 關(guān)鍵字。即“this. 成員名”,此時(shí)的this即代表調(diào)用該成員的對(duì)象。
9.若方法本身沒(méi)有返回值,則必須在方法定義的前面加上關(guān)鍵字void.
10.類(lèi)外部可訪問(wèn)到的類(lèi)內(nèi)部的公共成員。
11.方法的參數(shù)可以是任意類(lèi)型的數(shù)據(jù),其返回值也可是任意類(lèi)型。
12.所謂匿名對(duì)象,就是當(dāng)一個(gè)對(duì)象被創(chuàng)建之后,在調(diào)用該對(duì)象的方法時(shí),不定義對(duì)象的引用變量,而直接調(diào)用這個(gè)對(duì)象的方法,這樣的對(duì)象叫做匿名對(duì)象。
到此這篇關(guān)于Java重點(diǎn)梳理類(lèi)與對(duì)象核心原理的文章就介紹到這了,更多相關(guān)Java類(lèi)與對(duì)象內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Tomcat正常啟動(dòng),訪問(wèn)所有頁(yè)面均報(bào)404異常,404異??偨Y(jié)分析
今天遇到一個(gè)問(wèn)題:Tomcat正常啟動(dòng),訪問(wèn)所有頁(yè)面均報(bào)404異常,究竟該如何解決這個(gè)問(wèn)題呢?下邊小編將為大家介紹一下解決方法,需要的朋友可以參考下2013-07-07
SpringCloud Open feign 使用okhttp 優(yōu)化詳解
這篇文章主要介紹了SpringCloud Open feign 使用okhttp 優(yōu)化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
java線程池不同場(chǎng)景下使用示例經(jīng)驗(yàn)總結(jié)
這篇文章主要為大家介紹了java線程池不同場(chǎng)景如何使用的示例源碼及經(jīng)驗(yàn)總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
詳解Spring簡(jiǎn)單容器中的Bean基本加載過(guò)程
本篇將對(duì)定義在 XMl 文件中的 bean,從靜態(tài)的的定義到變成可以使用的對(duì)象的過(guò)程,即 bean 的加載和獲取的過(guò)程進(jìn)行一個(gè)整體的了解2017-05-05
SpringBoot啟動(dòng)自動(dòng)終止也不報(bào)錯(cuò)的原因及解決
這篇文章主要介紹了SpringBoot啟動(dòng)自動(dòng)終止也不報(bào)錯(cuò)的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
使用ehcache三步搞定springboot緩存的方法示例
本次內(nèi)容主要介紹基于Ehcache 3.0來(lái)快速實(shí)現(xiàn)Spring Boot應(yīng)用程序的數(shù)據(jù)緩存功能。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04

