Java自學筆記(二):面向物件
阿新 • • 發佈:2020-07-20
學習網站:https://www.runoob.com/java/java-tutorial.html
目錄
類和物件基本構造和訪問
- 物件構造方法,相當於初始化物件。至少需要呼叫一個構造方法
public class Puppy{
String a;
public Puppy() //最簡單的構造方法
{}
public Puppy(string x){
a=x;
}
}
- 建立物件,物件名+new+構造方法
Puppy P1 = new Puppy(); Puppy P2 = new Puppy("abc");
- 訪問物件的屬性和方法(物件名.屬性名/方法())
繼承
- 基本概念:子類重用父類的非私有屬性和方法
- 格式:
class A{ }
class B extends A{ }
用implements繼承介面:
interface A{ }
class B implements A{ }
關鍵詞this, super:
this: 子類
super: 父類
- 繼承型別
- 單繼承
- 多重繼承
- 不同類繼承同一類
- 多繼承不支援
- 特徵
- 可繼承的父類屬性和方法應是非private的
- 子類也拓展自己的屬性和方法,也可改寫父類的方法
- 用final修飾的類無法被繼承,用final修飾的方法是不能被子類所重寫
- 構造器
父類自身含有有參或無參構造器,子類可以顯式或隱式呼叫。若父類有有參構造器,子類需要用super(xxx)來呼叫其有參建構函式;若父類有無參構造器,子類不需要特別寫,系統可以自動呼叫其無參建構函式。
重寫(Override)與過載(Overload)
- 區別:重寫是子類重寫改寫父類的方法,過載是同一個類中對同一個方法的不同實現
區別點 | 重寫 | 過載 |
---|---|---|
引數列表 | 不能變 | 必須變 |
返回型別 | 不能變 | 可變可不變 |
異常丟擲 | 可減少或刪除,修改的話不能有新的異常或比比其更廣的異常 | 可變可不變 |
訪問 | 不能是比父類更嚴格的限制(可以降低限制) | 可變可不變變 |
-
重寫的規則
- 外殼不變,只變內部
- 子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了宣告為 private 和 final 的方法
- 子類和父類不在同一個包中,那麼子類只能夠重寫父類的宣告為 public 和 protected 的非 final 方法
- 構造方法不能被重寫
-
過載的規則
- 引數列表必須獨一無二,單單改變返回型別是不行的
- 最常用的地方就是構造器的過載
多型
- 概念:是同一個行為具有多個不同表現形式或形態的能力
- 三種必要條件
- 繼承
- 重寫
- 父類引用指向子類物件
Parent p = new Child();
- 實現方法
- 重寫
- 介面(各方法的集合,沒有具體實現)
- 抽象類和抽象方法
- 例子
abstract class Animal{
abstract void say();
}
class Cat extends Animal{
void say() {
System.out.println("我是貓");
}
}
class Dog extends Animal{
void say() {
System.out.println("我是狗");
}
}
public class Puppy {
public static void main(String[] args) {
Animal A = new Cat();
Animal B = new Dog();
A.say();
B.say();
}
}
抽象類和抽象方法
- 抽象類
(修飾詞) abstract class A() {xxx}
- 抽象類可以作為只給出類的框架,而由繼承的子類來重寫擴充類
- 抽象類不能被例項化,只能被繼承
- 抽象類不一定包含抽象方法,但是包含抽象方法的類一定要是抽象類
- 抽象方法
(修飾詞) abstract (返回值) function(); //只有(),沒有{xxx}
- 子類必須重寫抽象類的抽象方法,或是子類也是抽象類的話就不用重寫
- 構造方法,類方法(用 static 修飾的方法)不能宣告為抽象方法
封裝
- 封裝(Encapsulation)是將某些private的值隱藏起來,用介面函式來實現訪問和修改private值
- 例子
public class Puppy{
private int age;
public Puppy() { }
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
Puppy P = new Puppy();
P.setAge(12);
int result = P.getAge();
System.out.println(result);
}
}
介面
- 定義:介面(Interface)是一個抽象類,是抽象方法的集合。
- 實現介面:除非是抽象類,否則實現(implements)介面的類要定義介面中的所有方法
- 繼承介面:由另一個介面繼承(extends)父介面
interface Animal {
public void eat();
}
interface Cat extends Animal{
public void meow();
}
public class Puppy implements Cat{
public Puppy() { }
public void eat() {System.out.println("eat");}
public void meow() {System.out.println("meow");}
public static void main(String[] args) {
Puppy P = new Puppy();
P.eat();
P.meow();
}
}
- 介面特性
- 介面沒有構造方法
- 介面中所有的方法必須是抽象方法(隱式抽象,隱式指定為public abstract而不用明寫)
- 介面不能包含成員變數,除了 static 和 final 變數(隱式的指定為 public static final 變數)
- 介面支援多繼承(類不支援多繼承)
- 介面中不能含有靜態程式碼塊以及靜態方法(用 static 修飾的方法),但是JDK 1.8 以後
包package
- 一些常見的java包:java.lang-打包基礎的類;java.io-包含輸入輸出功能的函式
- 匯入包:import xxx