Java 全方位講解面向?qū)ο筇攸c(diǎn)與使用
面向過(guò)程和面向?qū)ο蟮膮^(qū)別
面向過(guò)程:當(dāng)事件比較簡(jiǎn)單的時(shí)候,利用面向過(guò)程,注重的是事件的具體步驟和過(guò)程,注重的是過(guò)程中的具體行為,以函數(shù)為最小單位,考慮怎么做。
面向?qū)ο螅鹤⒅卣?ldquo;參與者”,將功能封裝進(jìn)對(duì)象中,強(qiáng)調(diào)具備了功能的對(duì)象,以類(lèi)/對(duì)象為最小單位,考慮誰(shuí)來(lái)做。
案例:小明從冰箱里拿東西
面向過(guò)程:
面向?qū)ο?
面向過(guò)程 —> 面向?qū)ο?, 其實(shí)就是由執(zhí)行者 —> 指揮者的 一個(gè)過(guò)渡
類(lèi)和對(duì)象的關(guān)系
萬(wàn)物皆對(duì)象
對(duì)象:具體的事物,具體的實(shí)體,具體的實(shí)例,模板下具體的產(chǎn)品
類(lèi):對(duì)對(duì)象向上抽取出像的部分,公布部分,形成類(lèi),類(lèi)是抽象的,是一個(gè)模板,一般在寫(xiě)代碼的時(shí)候先寫(xiě)類(lèi),然后再根據(jù)類(lèi)創(chuàng)建對(duì)應(yīng)的對(duì)象
類(lèi)是對(duì)象的抽象,對(duì)象是類(lèi)的實(shí)例化
類(lèi)和對(duì)象的創(chuàng)建
類(lèi)的創(chuàng)建
1.屬性(field 成員變量)
屬性用于定義該類(lèi)或該類(lèi)對(duì)象包含的數(shù)據(jù)或者說(shuō)靜態(tài)特征。屬性作用范圍是整個(gè)類(lèi)體。
屬性定義格式:
[修飾符] 屬性類(lèi)型 屬性名 = [默認(rèn)值];
2.方法
方法用于定義該類(lèi)或該類(lèi)實(shí)例的行為特征和功能實(shí)現(xiàn)。方法是類(lèi)和對(duì)象行為特征的抽象。方法很類(lèi)似于面向過(guò)程中的函數(shù)。面向過(guò)程中,函數(shù)是最基本單位,整個(gè)程序由一個(gè)個(gè)函數(shù)調(diào)用組成。面向?qū)ο笾校麄€(gè)程序的基本單位是類(lèi),方法是從屬于類(lèi)和對(duì)象的。
方法定義格式:
[修飾符] 方法返回類(lèi)型 方法名(形參列表){
? //Java語(yǔ)句
}
我們以上面王者榮耀英雄類(lèi)創(chuàng)建為例:
//創(chuàng)建英雄類(lèi) public class Hero { //屬性 String Name;//英雄姓名 int Survive;//生存能力 int Attack;//攻擊傷害 int Skill;//技能效果 int Difficulty;//上手難度 //技能 public void Kill(int number){ //根據(jù)輸入的數(shù)字釋放幾技能 System.out.println(Name+"釋放"+number+"技能?。?!"); } //輸出該英雄的屬性 public void print(){ System.out.println("英雄:"+Name); System.out.println("生存能力:"+Survive); System.out.println("攻擊傷害:"+Attack); System.out.println("技能效果:"+Skill); System.out.println("上手難度:"+Difficulty); } }
對(duì)象的創(chuàng)建
接下來(lái)我們對(duì)我們創(chuàng)建好的類(lèi)來(lái)創(chuàng)建對(duì)象
public class TestCode01 { //main方法,程序的入口 public static void main(String[] args) { //創(chuàng)建一個(gè)對(duì)象(英雄)-->馬克波羅 Hero make = new Hero(); make.Name = "馬克波羅"; make.Survive = 4; make.Attack = 6; make.Skill = 6; make.Difficulty = 5; //再創(chuàng)建一個(gè)英雄-->瀾 Hero lan = new Hero(); lan.Name = "瀾"; lan.Survive = 3; lan.Attack = 5; lan.Skill = 4; lan.Difficulty = 6; lan.Kill(1); //輸出兩個(gè)英雄的屬性 make.print(); System.out.println("-------------"); lan.print(); //釋放技能 make.Kill(3); System.out.println("-------------"); lan.Kill(2); } }
結(jié)果: 每個(gè)英雄都有相同的屬性,每個(gè)屬性又有不同的值,通過(guò)類(lèi)我們可以創(chuàng)建很多個(gè)對(duì)象,每個(gè)對(duì)象又有不同的屬性值。
比如:王者里的一百多個(gè)英雄,每個(gè)都有不同的特點(diǎn)。
創(chuàng)建對(duì)象的過(guò)程:
(1)在第一次遇到一個(gè)類(lèi)的時(shí)候,對(duì)這個(gè)類(lèi)要進(jìn)行加載,只加載一次。
(2)創(chuàng)建對(duì)象,在堆中開(kāi)辟空間
(3)對(duì)對(duì)象進(jìn)行初始化操作,屬性賦值都是默認(rèn)的初始值。
(4)new關(guān)鍵字調(diào)用構(gòu)造器,執(zhí)行構(gòu)造方法,在構(gòu)造器中對(duì)屬性重新進(jìn)行賦值
構(gòu)造器
對(duì)象都是new出來(lái)的,new關(guān)鍵字實(shí)際上在調(diào)用一個(gè)方法,這個(gè)方法叫做構(gòu)造方法(構(gòu)造器)
調(diào)用構(gòu)造器的時(shí)候,如果你的類(lèi)中沒(méi)有寫(xiě)構(gòu)造器,那么系統(tǒng)會(huì)默認(rèn)給你分配一個(gè)構(gòu)造器(空構(gòu)造器)
構(gòu)造方法格式:
[修飾符] 構(gòu)造器名字(){
}
構(gòu)造器和方法的區(qū)別:
- 沒(méi)有方法的返回值
- 方法體內(nèi)部不能有return語(yǔ)句
- 構(gòu)造器的名字很特殊,必須跟類(lèi)名一致
構(gòu)造器的作用:不是為了創(chuàng)建對(duì)象,因?yàn)樵谡{(diào)用構(gòu)造器之前,這個(gè)對(duì)象就已經(jīng)創(chuàng)建好了,并且屬性有默認(rèn)的初始化的值。
調(diào)用構(gòu)造器的目的是給屬性進(jìn)行賦值操作的。
注意:我們一般不會(huì)在空構(gòu)造器中進(jìn)行初始化操作,因?yàn)槟菢拥脑捗總€(gè)對(duì)象的屬性就一樣了。
下面例子:
class Hero{ //屬性 String Name;//英雄姓名 int Survive;//生存能力 int Attack;//攻擊傷害 int Skill;//技能效果 int Difficulty;//上手難度 public Hero(){ Survive=4; Attack=5; Skill=6; Difficulty=7; } public void print(){ System.out.println("英雄:"+Name); System.out.println("生存能力:"+Survive); System.out.println("攻擊傷害:"+Attack); System.out.println("技能效果:"+Skill); System.out.println("上手難度:"+Difficulty); } } public class TestCode01 { public static void main(String[] args) { //創(chuàng)建兩個(gè)英雄對(duì)象 Hero make = new Hero(); make.Name="馬克"; Hero lan=new Hero(); lan.Name="瀾"; //輸出兩個(gè)屬性 make.print(); lan.print(); } }
因?yàn)槲覀冊(cè)跇?gòu)造器里面賦值了,所以我們創(chuàng)建對(duì)象的時(shí)候?qū)傩跃鸵粯恿?/p>
實(shí)際上,我們只要保證空構(gòu)造器的存在就可以了,里面的東西不用寫(xiě),我們要用構(gòu)造器賦值就要對(duì)構(gòu)造器重載
構(gòu)造器重載
一般保證空構(gòu)造器的存在,空構(gòu)造器中一般不會(huì)進(jìn)行屬性的賦值操作
一般我們會(huì)重載構(gòu)造器,在重載的構(gòu)造器中進(jìn)行屬性賦值操作
在重載構(gòu)造器以后,假如空構(gòu)造器忘寫(xiě)了,系統(tǒng)也不會(huì)給你分配默認(rèn)的空構(gòu)造器了,那么你要調(diào)用的話就會(huì)出錯(cuò)了。所以我們重載構(gòu)造器時(shí),一般要保留默認(rèn)構(gòu)造器
當(dāng)形參名字和屬性名字重名的時(shí)候,會(huì)出現(xiàn)就近原則:在要表示對(duì)象的屬性前加上this.來(lái)修飾 ,因?yàn)閠his代表的就是你創(chuàng)建的那個(gè)對(duì)象
this的使用
this就是指當(dāng)前的對(duì)象
this可以修飾屬性
當(dāng)屬性名字和形參發(fā)生重名的時(shí)候,或者 屬性名字 和局部變量重名的時(shí)候,都會(huì)發(fā)生就近原則,所以如果我要是直接使用變量名字的話就指的是離的近的那個(gè)形參或者局部變量,這時(shí)候如果我想要表示屬性的話,在前面要加上:this.修飾(如果不發(fā)生重名問(wèn)題的話,實(shí)際上你要是訪問(wèn)屬性也可以省略this.)
this修飾方法
在同一個(gè)類(lèi)中,方法可以互相調(diào)用,this.可以省略不寫(xiě)。
this可以修飾構(gòu)造器
同一個(gè)類(lèi)中的構(gòu)造器可以相互用this調(diào)用,注意:this修飾構(gòu)造器必須放在第一行
static修飾
static可以修飾:屬性、方法、代碼塊、內(nèi)部類(lèi)
static修飾屬性
在類(lèi)加載的時(shí)候,會(huì)將靜態(tài)內(nèi)容也加載到方法區(qū)的靜態(tài)域中,靜態(tài)的內(nèi)容先于對(duì)象存在,并且這個(gè)靜態(tài)內(nèi)容被所有該類(lèi)的對(duì)象共享。
- 在類(lèi)加載的時(shí)候一起加載入方法區(qū)中的靜態(tài)域中
- 先于對(duì)象存在
- 訪問(wèn)方式: 對(duì)象名.屬性名 類(lèi)名.屬性名(推薦)
static修飾屬性的應(yīng)用場(chǎng)景:某些特定的數(shù)據(jù)想要在內(nèi)存中共享,只有一塊 -->這個(gè)情況下,就可以用static修飾的屬性。
static修飾方法:
- static和public都是修飾符,并列的沒(méi)有先后順序,先寫(xiě)誰(shuí)后寫(xiě)誰(shuí)都行
- 在靜態(tài)方法中不能使用this關(guān)鍵字
- 在靜態(tài)方法中不能訪問(wèn)非靜態(tài)的方法
- 在靜態(tài)方法中不能訪問(wèn)非靜態(tài)的屬性
- 靜態(tài)的方法可以用 對(duì)象名.方法名去調(diào)用 也可以 用 類(lèi)名.方法名 (推薦)
- 在同一個(gè)類(lèi)中可以直接調(diào)用靜態(tài)方法
代碼塊
代碼塊的分類(lèi): 普通塊、構(gòu)造塊、靜態(tài)塊、同步塊(多線程)
代碼塊執(zhí)行順序: 最先執(zhí)行靜態(tài)塊–>再執(zhí)行構(gòu)造塊,(不常用)–>再執(zhí)行構(gòu)造器–>再執(zhí)行方法中的普通塊
public class Test { //屬性 int a; static int sa; //方法 public void a(){ System.out.println("-----a"); { //普通塊限制了局部變量的作用范圍 System.out.println("這是普通塊"); System.out.println("----000000"); int num = 10; System.out.println(num); } } public static void b(){ System.out.println("------b"); } //構(gòu)造塊 { System.out.println("------這是構(gòu)造塊"); } //靜態(tài)塊 static{ System.out.println("-----這是靜態(tài)塊"); //在靜態(tài)塊中只能方法:靜態(tài)屬性,靜態(tài)方法 System.out.println(sa); b(); } //構(gòu)造器 public Test(){ System.out.println("這是空構(gòu)造器"); } public Test(int a){ this.a = a; } //這是一個(gè)main方法,是程序的入口: public static void main(String[] args) { Test t = new Test(); t.a(); Test t2 = new Test(); t2.a(); } }
包(import)
包的作用: 為了解決重名的作用,解決權(quán)限問(wèn)題
包名的定義:
- 名字全部小寫(xiě)
- 中間用.隔開(kāi)
- 一般都是公司域名倒著寫(xiě):com.jd 、com.taobao
- 加上模塊名字 :com.taobao.login
- 不能使用系統(tǒng)中的關(guān)鍵字:null
- 包聲明的位置一般都在非注釋代碼的第一行
導(dǎo)包:
(1)使用不同包下的類(lèi)要需要導(dǎo)包, 例如:import java.util.Date;
(2)在導(dǎo)包以后,還想用其他包下同名的類(lèi),就必須要手動(dòng)自己寫(xiě)所在的包。
(3)同一個(gè)包下的類(lèi)想使用不需要導(dǎo)包,可以直接使用。
(4)在java.lang
包下的類(lèi),可以直接使用無(wú)需導(dǎo)包
(5)可以直接導(dǎo)入*
:
靜態(tài)導(dǎo)入:
//靜態(tài)導(dǎo)入: import static java.lang.Math.*; //導(dǎo)入:java.lang下的Math類(lèi)中的所有靜態(tài)的內(nèi)容 public class Test { //這是一個(gè)main方法,是程序的入口: public static void main(String[] args) { System.out.println(random()); System.out.println(PI); System.out.println(round(5.6)); } //在靜態(tài)導(dǎo)入后,同一個(gè)類(lèi)中有相同的方法的時(shí)候,會(huì)優(yōu)先走自己定義的方法。 public static int round(double a){ return 1000; } }
到此這篇關(guān)于Java 全方位講解面向?qū)ο筇攸c(diǎn)與使用的文章就介紹到這了,更多相關(guān)Java 面向?qū)ο髢?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于spring 方法級(jí)緩存的多種實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇基于spring 方法級(jí)緩存的多種實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09springboot集成nacos讀取nacos配置數(shù)據(jù)的原理
這篇文章主要介紹了springboot集成nacos讀取nacos配置數(shù)據(jù)的原理,文中有詳細(xì)的代碼流程,對(duì)大家學(xué)習(xí)springboot集成nacos有一定的幫助,需要的朋友可以參考下2023-05-05Java干貨知識(shí)深入理解內(nèi)部類(lèi)
這篇文章主要介紹了Java干貨知識(shí)深入理解內(nèi)部類(lèi),定義在另一個(gè)類(lèi)或方法中的類(lèi)就叫做內(nèi)部類(lèi),需要的朋友可以參考下2019-06-06Java?Collections工具類(lèi)中常用算法解析
在軟件開(kāi)發(fā)中,算法是非常重要的一部分,它們可以提供高效的數(shù)據(jù)處理和操作,這篇文章主要為大家介紹了Collections?工具類(lèi)集合框架中常用算法,感興趣的可以了解一下2023-06-06SpringBoot實(shí)現(xiàn)掃碼登錄的示例代碼
本文主要介紹了SpringBoot實(shí)現(xiàn)掃碼登錄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java中Calendar類(lèi)的一些常用方法小結(jié)
項(xiàng)目當(dāng)中,我們經(jīng)常會(huì)涉及到對(duì)時(shí)間的處理,Date類(lèi)最主要的作用就是獲得當(dāng)前時(shí)間,同時(shí)這個(gè)類(lèi)里面也具有設(shè)置時(shí)間以及一些其他的功能,但更推薦使用 Calendar 類(lèi)進(jìn)行時(shí)間和日期的處理,這篇文章主要給大家介紹了關(guān)于Java中Calendar類(lèi)的一些常用方法,需要的朋友可以參考下2021-11-11SpringCloud Alibaba使用Seata處理分布式事務(wù)的技巧
在傳統(tǒng)的單體項(xiàng)目中,我們使用@Transactional注解就能實(shí)現(xiàn)基本的ACID事務(wù)了,隨著微服務(wù)架構(gòu)的引入,需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行分庫(kù)分表,每個(gè)服務(wù)擁有自己的數(shù)據(jù)庫(kù),這樣傳統(tǒng)的事務(wù)就不起作用了,那么我們?nèi)绾伪WC多個(gè)服務(wù)中數(shù)據(jù)的一致性呢?跟隨小編一起通過(guò)本文了解下吧2021-06-06RabbitMQ 的七種隊(duì)列模式和應(yīng)用場(chǎng)景
最近學(xué)習(xí)RabbitMQ,本文就記錄一下RabbitMQ 的七種隊(duì)列模式和應(yīng)用場(chǎng)景,方便以后使用,也方便和大家共享,相互交流2021-05-05