## Java專題零:類的繼承
[TOC]
### 0.1. final不能繼承
- 使用`final`修飾的類不能被繼承
- 使用`final`修飾的方法不能被重寫
### 0.2. 重寫方法的訪問修飾符
> 子類的重寫方法修飾符必須比大于或等于父類的方法
方法的訪問修飾符:
- `public`:公開的,所有類都可以訪問
- `protected`:保護的,本類和子類才可以訪問
- `package-default`:包私有的,本類和相同包的類才可以訪問
- `private`:私有的,本類才可以訪問
訪問權限大小: `public` > `protected` > ` package-default `> `private`
如:
FatherClass類中`packageMethod`方法訪問修飾符是`package-default`,SonClass類中重寫的`packageMethod`方法訪問修飾符必須大于或等于`package-default`,可以是`public`、`protected`、` package-default `,但不可以是`private`,否則編譯時會報語法錯誤
~~~
public class FatherClass {
void packageMethod(){
}
}
~~~
~~~
public class SonClass extends FatherClass{
public void packageMethod(){
}
}
~~~
### 0.3. 重寫方法的異常拋出
> 子類的重寫方法拋出的異常是父類拋出的異常或異常的子類
如:
FatherClass類中`exceptionMethod`方法拋出的異常是`FileNotFoundException`,SonClass類中重寫的`packageMethod`方法拋出的異常只能是`FileNotFoundException`或`FileNotFoundException`的子類,下面的`IOException`,編譯時會報被重寫的父類方法沒有拋出`IOException`
~~~
public class FatherClass {
public void exceptionMethod() throws FileNotFoundException {
}
}
~~~
~~~
public class SonClass extends FatherClass{
public void exceptionMethod() throws IOException {
}
}
~~~
### 0.4. 子類對象創建的順序
***創建順序如下***:
1. 父類靜態成員(包括方法和變量,按順序初始化)
2. 子類靜態成員(包括方法和變量,按順序初始化)
3. 父類成員變量(包括非靜態代碼塊)
4. 父類構造方法
5. 子類成員變量(包括非靜態代碼塊)
6. 子類構造方法
***驗證代碼***:
```java
// 主類,用來創建子類對象,驗證我們的結果
public class Main {
public static void main(String[] args) {
new Son();
}
}
// 書類,用于測試對象成員變量
class Book{
public Book(String user){
System.out.println(user + "成員變量");
}
}
// 子類
class Son extends Fa{
static Book book= new Book("子類靜態");
static{
System.out.println("子類靜態代碼塊");
}
Book sBook = new Book("子類");
{
System.out.println("子類非靜態代碼塊");
}
public Son(){
System.out.println("子類構造方法");
}
}
// 父類
class Fa{
static Book book= new Book("父類靜態");
static{
System.out.println("父類靜態代碼塊");
}
Book fBook = new Book("父類");
{
System.out.println("父類非靜態代碼塊");
}
public Fa(){
System.out.println("父類構造方法");
}
}
```
***輸出結果***:
> 父類靜態成員變量
父類靜態代碼塊
子類靜態成員變量
子類靜態代碼塊
父類成員變量
父類非靜態代碼塊
父類構造方法
子類成員變量
子類非靜態代碼塊
子類構造方法
- JavaCook
- Java專題零:類的繼承
- Java專題一:數據類型
- Java專題二:相等與比較
- Java專題三:集合
- Java專題四:異常
- Java專題五:遍歷與迭代
- Java專題六:運算符
- Java專題七:正則表達式
- Java專題八:泛型
- Java專題九:反射
- Java專題九(1):反射
- Java專題九(2):動態代理
- Java專題十:日期與時間
- Java專題十一:IO與NIO
- Java專題十一(1):IO
- Java專題十一(2):NIO
- Java專題十二:網絡
- Java專題十三:并發編程
- Java專題十三(1):線程與線程池
- Java專題十三(2):線程安全與同步
- Java專題十三(3):內存模型、volatile、ThreadLocal
- Java專題十四:JDBC
- Java專題十五:日志
- Java專題十六:定時任務
- Java專題十七:JavaMail
- Java專題十八:注解
- Java專題十九:淺拷貝與深拷貝
- Java專題二十:設計模式
- Java專題二十一:序列化與反序列化
- 附加專題一:MySQL
- MySQL專題零:簡介
- MySQL專題一:安裝與連接
- MySQL專題二:DDL與DML語法
- MySQL專題三:工作原理
- MySQL專題四:InnoDB存儲引擎
- MySQL專題五:sql優化
- MySQL專題六:數據類型
- 附加專題二:Mybatis
- Mybatis專題零:簡介
- Mybatis專題一:配置文件
- Mybatis專題二:映射文件
- Mybatis專題三:動態SQL
- Mybatis專題四:源碼解析
- 附加專題三:Web編程
- Web專題零:HTTP協議
- Web專題一:Servlet
- Web專題二:Cookie與Session
- 附加專題四:Redis
- Redis專題一:數據類型
- Redis專題二:事務
- Redis專題三:key的過期
- Redis專題四:消息隊列
- Redis專題五:持久化