Java 全方位講解面向?qū)ο筇攸c(diǎn)與使用
面向過程和面向?qū)ο蟮膮^(qū)別
面向過程:當(dāng)事件比較簡(jiǎn)單的時(shí)候,利用面向過程,注重的是事件的具體步驟和過程,注重的是過程中的具體行為,以函數(shù)為最小單位,考慮怎么做。
面向?qū)ο螅鹤⒅卣?ldquo;參與者”,將功能封裝進(jìn)對(duì)象中,強(qiáng)調(diào)具備了功能的對(duì)象,以類/對(duì)象為最小單位,考慮誰來做。
案例:小明從冰箱里拿東西
面向過程:

面向?qū)ο?

面向過程 —> 面向?qū)ο?, 其實(shí)就是由執(zhí)行者 —> 指揮者的 一個(gè)過渡
類和對(duì)象的關(guān)系
萬物皆對(duì)象
對(duì)象:具體的事物,具體的實(shí)體,具體的實(shí)例,模板下具體的產(chǎn)品
類:對(duì)對(duì)象向上抽取出像的部分,公布部分,形成類,類是抽象的,是一個(gè)模板,一般在寫代碼的時(shí)候先寫類,然后再根據(jù)類創(chuàng)建對(duì)應(yīng)的對(duì)象
類是對(duì)象的抽象,對(duì)象是類的實(shí)例化

類和對(duì)象的創(chuàng)建
類的創(chuàng)建
1.屬性(field 成員變量)
屬性用于定義該類或該類對(duì)象包含的數(shù)據(jù)或者說靜態(tài)特征。屬性作用范圍是整個(gè)類體。
屬性定義格式:
[修飾符] 屬性類型 屬性名 = [默認(rèn)值];
2.方法
方法用于定義該類或該類實(shí)例的行為特征和功能實(shí)現(xiàn)。方法是類和對(duì)象行為特征的抽象。方法很類似于面向過程中的函數(shù)。面向過程中,函數(shù)是最基本單位,整個(gè)程序由一個(gè)個(gè)函數(shù)調(diào)用組成。面向?qū)ο笾校麄€(gè)程序的基本單位是類,方法是從屬于類和對(duì)象的。
方法定義格式:
[修飾符] 方法返回類型 方法名(形參列表){
? //Java語句
}
我們以上面王者榮耀英雄類創(chuàng)建為例:
//創(chuàng)建英雄類
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)建
接下來我們對(duì)我們創(chuàng)建好的類來創(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è)屬性又有不同的值,通過類我們可以創(chuàng)建很多個(gè)對(duì)象,每個(gè)對(duì)象又有不同的屬性值。
比如:王者里的一百多個(gè)英雄,每個(gè)都有不同的特點(diǎn)。

創(chuàng)建對(duì)象的過程:
(1)在第一次遇到一個(gè)類的時(shí)候,對(duì)這個(gè)類要進(jìn)行加載,只加載一次。
(2)創(chuàng)建對(duì)象,在堆中開辟空間
(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出來的,new關(guān)鍵字實(shí)際上在調(diào)用一個(gè)方法,這個(gè)方法叫做構(gòu)造方法(構(gòu)造器)
調(diào)用構(gòu)造器的時(shí)候,如果你的類中沒有寫構(gòu)造器,那么系統(tǒng)會(huì)默認(rèn)給你分配一個(gè)構(gòu)造器(空構(gòu)造器)
構(gòu)造方法格式:
[修飾符] 構(gòu)造器名字(){
}
構(gòu)造器和方法的區(qū)別:
- 沒有方法的返回值
- 方法體內(nèi)部不能有return語句
- 構(gòu)造器的名字很特殊,必須跟類名一致
構(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)造器的存在就可以了,里面的東西不用寫,我們要用構(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)造器忘寫了,系統(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.來修飾 ,因?yàn)閠his代表的就是你創(chuàng)建的那個(gè)對(duì)象

this的使用
this就是指當(dāng)前的對(duì)象
this可以修飾屬性
當(dāng)屬性名字和形參發(fā)生重名的時(shí)候,或者 屬性名字 和局部變量重名的時(shí)候,都會(huì)發(fā)生就近原則,所以如果我要是直接使用變量名字的話就指的是離的近的那個(gè)形參或者局部變量,這時(shí)候如果我想要表示屬性的話,在前面要加上:this.修飾(如果不發(fā)生重名問題的話,實(shí)際上你要是訪問屬性也可以省略this.)

this修飾方法
在同一個(gè)類中,方法可以互相調(diào)用,this.可以省略不寫。

this可以修飾構(gòu)造器
同一個(gè)類中的構(gòu)造器可以相互用this調(diào)用,注意:this修飾構(gòu)造器必須放在第一行

static修飾
static可以修飾:屬性、方法、代碼塊、內(nèi)部類
static修飾屬性
在類加載的時(shí)候,會(huì)將靜態(tài)內(nèi)容也加載到方法區(qū)的靜態(tài)域中,靜態(tài)的內(nèi)容先于對(duì)象存在,并且這個(gè)靜態(tài)內(nèi)容被所有該類的對(duì)象共享。
- 在類加載的時(shí)候一起加載入方法區(qū)中的靜態(tài)域中
- 先于對(duì)象存在
- 訪問方式: 對(duì)象名.屬性名 類名.屬性名(推薦)

static修飾屬性的應(yīng)用場(chǎng)景:某些特定的數(shù)據(jù)想要在內(nèi)存中共享,只有一塊 -->這個(gè)情況下,就可以用static修飾的屬性。
static修飾方法:
- static和public都是修飾符,并列的沒有先后順序,先寫誰后寫誰都行
- 在靜態(tài)方法中不能使用this關(guān)鍵字
- 在靜態(tài)方法中不能訪問非靜態(tài)的方法
- 在靜態(tài)方法中不能訪問非靜態(tài)的屬性
- 靜態(tài)的方法可以用 對(duì)象名.方法名去調(diào)用 也可以 用 類名.方法名 (推薦)
- 在同一個(gè)類中可以直接調(diào)用靜態(tà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)限問題
包名的定義:
- 名字全部小寫
- 中間用.隔開
- 一般都是公司域名倒著寫:com.jd 、com.taobao
- 加上模塊名字 :com.taobao.login
- 不能使用系統(tǒng)中的關(guān)鍵字:null
- 包聲明的位置一般都在非注釋代碼的第一行

導(dǎo)包:
(1)使用不同包下的類要需要導(dǎo)包, 例如:import java.util.Date;
(2)在導(dǎo)包以后,還想用其他包下同名的類,就必須要手動(dòng)自己寫所在的包。
(3)同一個(gè)包下的類想使用不需要導(dǎo)包,可以直接使用。
(4)在java.lang包下的類,可以直接使用無需導(dǎo)包
(5)可以直接導(dǎo)入*:
靜態(tài)導(dǎo)入:
//靜態(tài)導(dǎo)入:
import static java.lang.Math.*;
//導(dǎo)入:java.lang下的Math類中的所有靜態(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è)類中有相同的方法的時(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ī)硪黄趕pring 方法級(jí)緩存的多種實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
springboot集成nacos讀取nacos配置數(shù)據(jù)的原理
這篇文章主要介紹了springboot集成nacos讀取nacos配置數(shù)據(jù)的原理,文中有詳細(xì)的代碼流程,對(duì)大家學(xué)習(xí)springboot集成nacos有一定的幫助,需要的朋友可以參考下2023-05-05
SpringBoot實(shí)現(xiàn)掃碼登錄的示例代碼
本文主要介紹了SpringBoot實(shí)現(xiàn)掃碼登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
SpringCloud Alibaba使用Seata處理分布式事務(wù)的技巧
在傳統(tǒng)的單體項(xiàng)目中,我們使用@Transactional注解就能實(shí)現(xiàn)基本的ACID事務(wù)了,隨著微服務(wù)架構(gòu)的引入,需要對(duì)數(shù)據(jù)庫進(jìn)行分庫分表,每個(gè)服務(wù)擁有自己的數(shù)據(jù)庫,這樣傳統(tǒng)的事務(wù)就不起作用了,那么我們?nèi)绾伪WC多個(gè)服務(wù)中數(shù)據(jù)的一致性呢?跟隨小編一起通過本文了解下吧2021-06-06
RabbitMQ 的七種隊(duì)列模式和應(yīng)用場(chǎng)景
最近學(xué)習(xí)RabbitMQ,本文就記錄一下RabbitMQ 的七種隊(duì)列模式和應(yīng)用場(chǎng)景,方便以后使用,也方便和大家共享,相互交流2021-05-05

