1. 程式人生 > 實用技巧 >Java自學筆記(二):面向物件

Java自學筆記(二):面向物件

學習網站:https://www.runoob.com/java/java-tutorial.html

目錄

類和物件基本構造和訪問

  1. 物件構造方法,相當於初始化物件。至少需要呼叫一個構造方法
public class Puppy{
 String a;
 public Puppy()  //最簡單的構造方法
 {}
 public Puppy(string x){
  a=x;
 }
}
  1. 建立物件,物件名+new+構造方法
Puppy P1 = new Puppy();
Puppy P2 = new Puppy("abc");
  1. 訪問物件的屬性和方法(物件名.屬性名/方法())

繼承

  1. 基本概念:子類重用父類的非私有屬性和方法
  2. 格式:
class A{ }
class B extends A{ }

用implements繼承介面:

interface A{ }
class B implements A{ }

關鍵詞this, super:

this: 子類
super: 父類
  1. 繼承型別
    • 單繼承
    • 多重繼承
    • 不同類繼承同一類
    • 多繼承不支援
  2. 特徵
    • 可繼承的父類屬性和方法應是非private的
    • 子類也拓展自己的屬性和方法,也可改寫父類的方法
    • 用final修飾的類無法被繼承,用final修飾的方法是不能被子類所重寫
  3. 構造器
    父類自身含有有參或無參構造器,子類可以顯式或隱式呼叫。若父類有有參構造器,子類需要用super(xxx)來呼叫其有參建構函式;若父類有無參構造器,子類不需要特別寫,系統可以自動呼叫其無參建構函式。

重寫(Override)與過載(Overload)

  1. 區別:重寫是子類重寫改寫父類的方法,過載是同一個類中對同一個方法的不同實現
區別點 重寫 過載
引數列表 不能變 必須變
返回型別 不能變 可變可不變
異常丟擲 可減少或刪除,修改的話不能有新的異常或比比其更廣的異常 可變可不變
訪問 不能是比父類更嚴格的限制(可以降低限制) 可變可不變變
  1. 重寫的規則

    • 外殼不變,只變內部
    • 子類和父類在同一個包中,那麼子類可以重寫父類所有方法,除了宣告為 private 和 final 的方法
    • 子類和父類不在同一個包中,那麼子類只能夠重寫父類的宣告為 public 和 protected 的非 final 方法
    • 構造方法不能被重寫
  2. 過載的規則

    • 引數列表必須獨一無二,單單改變返回型別是不行的
    • 最常用的地方就是構造器的過載

多型

  1. 概念:是同一個行為具有多個不同表現形式或形態的能力
  2. 三種必要條件
    • 繼承
    • 重寫
    • 父類引用指向子類物件
Parent p = new Child();
  1. 實現方法
    • 重寫
    • 介面(各方法的集合,沒有具體實現)
    • 抽象類和抽象方法
  2. 例子
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();
    }
}

抽象類和抽象方法

  1. 抽象類
(修飾詞) abstract class A() {xxx}
- 抽象類可以作為只給出類的框架,而由繼承的子類來重寫擴充類
- 抽象類不能被例項化,只能被繼承
- 抽象類不一定包含抽象方法,但是包含抽象方法的類一定要是抽象類
  1. 抽象方法
(修飾詞) abstract (返回值) function();  //只有(),沒有{xxx}
- 子類必須重寫抽象類的抽象方法,或是子類也是抽象類的話就不用重寫
- 構造方法,類方法(用 static 修飾的方法)不能宣告為抽象方法

封裝

  1. 封裝(Encapsulation)是將某些private的值隱藏起來,用介面函式來實現訪問和修改private值
  2. 例子
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);
	}
}

介面

  1. 定義:介面(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();
	}
}
  1. 介面特性
    • 介面沒有構造方法
    • 介面中所有的方法必須是抽象方法(隱式抽象,隱式指定為public abstract而不用明寫)
    • 介面不能包含成員變數,除了 static 和 final 變數(隱式的指定為 public static final 變數)
    • 介面支援多繼承(類不支援多繼承)
    • 介面中不能含有靜態程式碼塊以及靜態方法(用 static 修飾的方法),但是JDK 1.8 以後

包package

- 一些常見的java包:java.lang-打包基礎的類;java.io-包含輸入輸出功能的函式
- 匯入包:import xxx