1. 程式人生 > >Java碼農進階之路~程式碼塊&面向物件特徵之繼承

Java碼農進階之路~程式碼塊&面向物件特徵之繼承

一 程式碼塊
1.區域性程式碼塊(方法)

書寫位置:方法中

作用:限制作用域

2.構造程式碼塊

書寫位置:類中 方法外

程式碼的執行順序:

①系統呼叫

②只要建立物件 就會呼叫

③構造程式碼塊 在 構造方法 之前被呼叫

作用:當你有方法 需要每一個物件都呼叫的時候,可以將這個方法在構造程式碼塊中呼叫(不常用)

3.靜態程式碼塊

使用關鍵詞static修飾的程式碼塊

位置:類中方法外

呼叫順序:

1.隨著類的載入

2.只加載一次

3.在構造程式碼塊之前執行

應用場景:

載入驅動(載入資料庫驅動---一個類)

4.同步程式碼塊(多執行緒部分)
public class Demo01 {
	public static void main(String[] args) {
		//fun1();
		
		Person p1 = new Person();
		p1.name = "發了";
		p1.sayHi();
		
		Person p2 = new Person("啊哦",10);
		p2.sayHi();
		
	}

	public static void fun1() {
//		{
//			// 區域性程式碼塊 限制變數的作用域
//			int num = 10;
//		}
//		System.out.println(num);
	}
}

//暴力除錯法
//小黃鴨除錯法(邏輯除錯)
class Person{
	String name;
	int age;
	// 無參 和 有參構造方法
	// 介紹自己方法
	// 吃
	public Person() {
		 name = "奧迪";
		 age = 16; 
		 System.out.println("我是無參的構造方法");
	}
	public Person(String name , int age) {
		this.name = name;
		this.age = age;
		System.out.println("我是有參的構造方法");
	}
	public void sayHi() {
		System.out.println(name + " " + age);
	}
	public void eat() {
		System.out.println("人--吃飯");
	}
	//構造程式碼塊
	{
		System.out.println("我執行了嗎?");
	}
	//靜態程式碼塊
	static {
		System.out.println("我是靜態程式碼塊");
	}
}
其列印結果為

public class Demo02 {
	static {
		System.out.println("我是main方法的靜態程式碼塊");
	}
	public static void main(String[] args) {
		System.out.println("我是main方法");
		
		Test test1 = new Test();
		test1.name = "xx";
		
		Test test2 = new Test("dd");
		
	}

}
class Test {
	String name;
	public Test() {
		System.out.println("我是 test類 無參構造方法");
	}
	
	public Test(String name) {
		this.name = name;
		System.out.println("我是 test類 有參構造方法");
	}
	
	{
		System.out.println("我是 test類  構造程式碼塊");
	}
	static {
		System.out.println("我是test類  靜態程式碼塊");
	}
}

列印順序為

先執行main函式,而在此之前需要在方法區將Demo02.class執行,根據之前所說的,在隨著類的載入,其靜態構造程式碼塊將會率先執行,列印①"我是main方法的靜態程式碼塊",之後呼叫main函式先列印②"我是main方法",隨後建立一個物件test,而建立物件之前,又需要先在方法區載入Test類,而類中又有static修飾的靜態程式碼塊,所以列印③"我是test類 靜態程式碼塊",隨之列印④"我是test類 構造程式碼塊",類中程式碼塊執行完畢後,隨即建立完無參物件.列印⑤"我是test類 無參構造方法".之後又建立test2物件,同上,列印⑥"我是test類 構造程式碼塊",⑦"我是test類 有參構造方法".


二 面向物件特徵之繼承

面向物件的特徵為:封裝,繼承,多型

繼承:

1.可以進行傳遞

2.繼承的是 屬性 和 行為(不是全部)

3.繼承 建立 類和類之間的關係

繼承的好處:

1.減少程式碼量

2.提高工作效率

3.增強了類與類之間的關係(讓類和類的關係更加緊密)

繼承的弊端:

提高內聚:希望一個類中,方法與方法之間聯絡加強

降低耦合:希望類與類之間減少聯絡

而繼承違反了 低耦合.

什麼時候使用繼承?

繼承:一定要符合 邏輯(比如:蘋果 -子類 是 水果 -父類)

如若兩個類沒有合適的繼承關係的話,可以考慮建立並繼承一個第三類.

比如 專案經理 和 程式設計師,沒有合適的父子類的邏輯關係,這是可以增加並繼承一個員工類.

注意:

1.Java中 只允許 單繼承(類與類)(通過介面實現多繼承)

Java中 還允許 多層繼承(繼承鏈) A->B->C

2.當你想只使用共有方法和屬性時,一般選擇 使用繼承鏈最頂端的類

3.當你想使用特有方法的時候, 一般選擇 使用繼承鏈最末端的類

4.如果一個類沒有寫繼承 ,那麼這個類 預設繼承 Object類(基類)

三 繼承中的構造方法

注意:構造方法是不能繼承的

當建立子類物件的時候,為了保證繼承的完整性(不管你在建立子類物件的時候,使用的是無參還是有參構造)

系統會預設幫你呼叫 父類中的 無參 構造方法

public class Demo05 {
	public static void main(String[] args) {
		Son son = new Son();
		System.out.println("-----------------動感光波------------------");
		Son son1 = new Son("小新");
		
	}
}
class Father{
	String name;
	public Father() {
		System.out.println("我是Father類的無參構造方法");
	}
	public Father(String name) {
		this.name = name;
		System.out.println("我是Father類的有參構造方法");
	}
	public void sayHi() {
		System.out.println(name);
	}
}
class Son extends Father{
	public Son() {
		//系統幫你在 構造方法的第一行,寫了一句程式碼
		//如果你不寫,系統會預設幫你加上
		super();//呼叫父類的構造方法
		System.out.println("我是Son類的無參構造方法");
	}
	public Son(String name) {
		super();
		this.name = name;
		System.out.println("我是Son類的有參構造方法");
	}
}

列印的結果是:

再來看這段程式碼

public class Demo06 {
	public static void main(String[] args) {
		TestB testB = new TestB();
		testB.print();
	}
}
class TestA{
	int num1 = 10;
	int num2 = 20;
	public void fun() {
		System.out.println("我是父類的方法");
	}
}
class TestB extends TestA{
	int num2 = 30;
	public void print() {
		System.out.println(this.num1);
		System.out.println(this.num2);
		//直接呼叫父類的屬性 使用super關鍵詞
		System.out.println(super.num2);
		//super也可以呼叫父類的方法
		super.fun();
	}
}

super和this

super在子類中代表的是 父類的物件

this在子類中,可以呼叫子類的屬性 和 方法

(當子類中沒有這個屬性 或者方法的時候,就去父類中尋找,找到就用,沒找到就報錯)

其列印的是:

如果父類沒有無參的構造方法,此時只需要在子類的構造方法中第一行,呼叫一下父類構造方法

public class Demo07 {
	public static void main(String[] args) {
		Audi audi = new Audi();
	}
}
class Car{
	String name;
//	public Car() {
//		System.out.println("我是Car的無參");
//	}
	public Car(String name) {
		this.name = name;
		System.out.println("我是Car的有參");
	}
}
class Audi extends Car{
	public Audi() {
		//只要你在構造方法的第一行
		//呼叫一下父類構造方法(無參 有參都行)
		super("雙鑽");
		System.out.println("我是Audi的無參");
	}
	public Audi(String name) {
		super("四鑽");
		this.name = name;
		System.out.println("我是Audi的有參");
	}
}

四 方法過載和重寫
方法過載(Overload)(在一個類中進行)
方法重寫(Override)(前提:至少兩個類 並且還有繼承關係)

方法重寫相當於對父級的該方法進行升級

重寫:跟父類的寫法完全一致

書寫一個類,都寫什麼方法?

有參無參構造方法

set/get方法

重寫toString方法輸出屬性

public class Demo08 {
	public static void main(String[] args) {
		TestD testD = new TestD();
		testD.print();
	}
}
class TestC{
	public void print() {
		System.out.println("我是C類的 print方法");
	}
}
class TestD extends TestC{
	public void print() {
		//重寫父類的方法時
		//調不呼叫父類的方法 要根據你的需求而定
		//ios7 siri 只會說英文
		//ios8 siri 英文,中文都能說了
		super.print();
		System.out.println("我是D類的 print方法");
		
		IOS8 ios8 = new IOS8();
		//咱們直接列印物件
		//希望直接把這個類的 屬性輸出出來
		System.out.println(ios8);
		ios8.siri();
	}
}
class IOS7{
	public void siri() {
		System.out.println("說英文");
	}
}
class IOS8 extends IOS7{
	//註解 標識這個方法是重寫父類
	@Override
	public void siri() {
		super.siri();
		System.out.println("說中文");
	}
	public void fun() {
		
	}
	//這個方法 一般用來輸出 本類中的屬性
	@Override
	public String toString() {
		//呼叫的是父類的方法
		//打印出來 全類名@16進位制的hashcode碼
		return "我就想看看屬性";
	}
}

五 關鍵字final

1.可以修飾方法 方法不能被重寫

2.修飾類 類不能被繼承

3.修飾變數 變數不能修改

final修飾引用資料型別,不能進行重新指向(地址不能修改)

物件中的屬性不會影響修改

public class Demo09 {
	public static void main(String[] args) {
//	final int num = 10;
//		num = 20;
	}
}
class TestE{
	//堆記憶體分配預設值 是無效的預設
//	final修飾成員變數的時候,需要賦值
//	賦值初始值,有三種方式
	//一般使用final會直接定義成靜態常量
	//使用類名直接呼叫 方便
	//常量命名規範 所有字母大寫 多單詞用下劃線分開
//	final int num = 10;
	public static final int MAX_VALUE = 10;
	
	public final void fun() {
		
	}
	
	public TestE() {
		//可以在構造方法中對變數進行賦值
//		num = 10;
	}
	{
		//也可以在構造程式碼塊中進行賦值
//		num = 10;
	}
}
class TestF extends TestE{
//	private void fun() {
//		
//	}
	
}

相關推薦

Java~程式碼&面向物件特徵繼承

一 程式碼塊1.區域性程式碼塊(方法)書寫位置:方法中作用:限制作用域2.構造程式碼塊書寫位置:類中 方法外程式碼的執行順序:①系統呼叫②只要建立物件 就會呼叫③構造程式碼塊 在 構造方法 之前被呼叫作用:當你有方法 需要每一個物件都呼叫的時候,可以將這個方法在構造程式碼塊中

Java~構造方法&靜態與成員變數及方法

一 構造方法當你在這個類中沒有提供無參的構造方法的時候,系統會在你建立物件的時候,也會呼叫無參的構造,而這個無參方法,系統會幫你提供一個.如果你只是提供了有參的構造方法,那麼系統將不再給你提供 無參構造方法了建議:寫類的時候 ,無參,有參的構造方法都寫上以保證不會出錯.二 靜

Java~基本資料型別&運算子&流程控制-分支&三目

基本資料型別    首先先說下位元組:位元組(byte)是計算機資訊科技用於計量儲存容量的一種計量單位    通常情況下一位元組由8個二進位制位表示 0000 0000;一個位元組的取值範圍為-128~127.大家有興趣的可以瞭解下為什麼是-128~127.    一個Byt

Java~JavaWeb開發入門

一.Web分類靜態Web資源:頁面中供人訪問的資源是不變的(html,css,js)動態Web資源:使用者在訪問動態資源的時候,訪問內容是由程式碼生成的,可與使用者互動,改變顯示的資源(jsp,Servlet)二.伺服器使用者通過網址來請求伺服器端請求就是伺服器端上面的靜態資

python-day15-初識面向物件

初識面向物件一、面向物件和麵向過程(重點理解)1、面向過程: 一切以事物的流程為核心。核心是"過程"二字,過程是指解決問題的步驟。即,先幹什麼,後幹什麼。基於該思想編寫程式就好比在編寫一套流水線。是一種機械式的程式設計思維。 優點:負責問題流程化,編寫相對簡單 缺點:可擴充套件性差2、面向物件:一切以物件為中

Python學習——六(面向物件

                                               面對物件程式設計 一、概述 1.全稱:OOP(Object Oriented Programming) 2.作用:一種解決軟體複用的設計和程式設計方法。使用面對物件程式設計的方

程式語言入門及、設計模式、面向物件書籍

1. Python Python 基礎教程 Automate the Boring Stuff with Python(繁瑣工作自動化) 前六章,python 語言基礎; 其後便是一些自動化實現

python---16 初識面向物件

三十五.初識面向物件   一 .面向物件和麵向過程比較     ①面向過程:一切以事物的發展流程為核心            優點:負責的問題流程化,編寫相對簡單          缺點:可擴充套件性差     ②面向物件:一切以物件為中心. 一切皆為物件.          

PythonI/O學習筆記_3.2面向物件程式設計_python的封裝

  前言: 本篇相關內容分為3篇多型、繼承、封裝,這篇為第三篇 封裝。 本篇內容圍繞 python基礎教程這段: 在面向物件程式設計中,術語物件大致意味著一系列資料(屬性)以及一套訪問和操作這些資料的方法。使用物件而非全域性變數和函式的原因有多個,下面列出了使用物件的最重要的好處。  多型:可對不

Java小白(一)

1、字串操作:replace方法(舊字串,新子串)。 Scanner scanner = new Scanner(System.in); System.out.println("請輸入"); // 接收使用者的輸入的字串 String s1 = scanner.next(); // 接受整型 i

java程式設計師需要的學習過程

其實本來真的沒打算寫這篇文章,主要是LZ得記憶力不是很好,不像一些記憶力強的人,面試完以後,幾乎能把自己和麵試官的對話都給記下來。LZ自己當初面試完以後,除了記住一些聊過的知識點以外,具體的內容基本上忘得一乾二淨,所以寫這篇文章其實是很有難度的。 但是,最近問LZ的人實

JAVA-程式設計師

       自己大學期間學習的是軟體工程,從需求分析到專案上線整套流程都接觸過,大二就開始接觸java,但是沒有好好把握。大把時間虛度在lol裡面了。已經在工作的我,作為一個菜鳥程式設計師,自己也有一

Java 高階工程師 JDBC

JDBC介面及資料庫廠商實現JDBC中定義了一些介面: 1、驅動管理: DriverManager 2、連線介面 Connection DatabasemetaData 3、語句物件介面 Statement PreparedStatement CallableStatement 4、結果集介面 ResultS

#過來人告訴你:8年Java,比起掉髮,我更怕掉隊!

這8年碼農路上我至少浪費了5年時間,這5年可以足夠讓自己成長為一個優秀的程式設計師,可惜我錯過了,我用這五年時間和很多程式設計師一樣在困惑和迷茫中找不到出路! 路上本沒有坑,走的人多了,路就爛了。 在大公司做事情有一個特徵,你只需要在工作時間做好公司給你安排的那份工作,你就會做的很好

未雨綢繆:Java高階架構必學 ⑥ 大知識要點附視訊學習資料

程式設計師,一個令人嚮往的職業,看起來有著高薪酬、高技術,還是一群高智商、頭腦靈活的人。事實上,程式設計師的工作,讓人非常抓狂,程式設計師的生活,異常線性單調。而且技術更新快,相互之間競爭壓力非常大~~ 相信你可能經歷過這些: 已經工作3年了,每個專案都會保質保量的完成,

Java 8程式設計-Stream函數語言程式設計

1、什麼是Stream       Java 8 API添加了一個新的抽象稱為流Stream,可以讓你以一種宣告的方式處理資料。Stream 使用一種類似用 SQL 語句從資料庫查詢資料的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。Stream API可以極大提

一個Java的Node

本篇是一個Node新手做完實際專案後的心得總結。摘要如果BOSS要求你在短期內快速實現一套聊天雲服務平臺,實現成本主要是:要維護社交關係,一大波殭屍POJO正在襲來。 要儲存資料庫,找個ORM工具。 長連線吧方面是WebSocket標準,亦或Netty、Mina

路上有你我-相互相持篇ES6裏箭頭函數裏的this指向問題

inner str 決定 strong 調用 出現 對象 AR 針對 首先復習下普通函數裏的this指向: 1 function test(){ 2 console.log(this) 3 } 4 test() 你會秒殺的毫無疑問的回答:window,針對普通函

史上最牛的Java架構師路線

驀然回首自己做開發已經十年了,這十年中我獲得了很多,技術能力、培訓、出國、大公司的經歷,還有很多很好的朋友。但再仔細一想,這十年中我至少浪費了五年時間,這五年可以足夠讓自己成長為一個優秀的程式設計師,可惜我錯過了,我用這五年時間和很多程式設計師一樣在困惑和迷茫中找不到出路! 路其實一直都在那裡,

群英傳》連載(一) —— Go 語言父 Rob Pike

近幾年來在計算機語言排行榜上成長最快的語言就是 Go 語言。它勇往直前勢如破竹,從幾年前的 50 名之外快速躍進前十的寶座,而且還在馬不停蹄向上攀登。 大家都知道 Go 語言是 Google 推出來的,它是由 Google 包養了一群骨灰級程式設計師組成了一個叫著「Go Team」的精英團隊共同打造。這個隊