1. 程式人生 > >封裝 繼承 多型 總結和心得和案例

封裝 繼承 多型 總結和心得和案例

一想到面向物件,首先我們第一想到的就是封裝,繼承,多型,介面等等。以下我做的一些筆記和一些經典的例子。
:面向物件
(1)面向物件
面向物件是基於面向過程的程式設計思想
(2)面向物件的思想特點
A:是一種更符合我們思考習慣的思想
B:把複雜的事情簡單化
C:讓我們從執行者變成了指揮者


舉例:
買電腦
洗衣服
做飯
...
萬事萬物皆物件
(3)把大象裝進冰箱(理解)
A:面向過程實現
B:面向物件實現


注意:如何讓我們的操作更符合面向物件思想呢?
A:有哪些類
B:每個類有哪些成員
C:類與類的關係
(4)類與物件
A:現實世界的事物
屬性 事物的基本描述
行為 事物的功能
B:Java語言中最基本的單位是類。所以,我們要用類來體現事物
C:類
成員變數 事物屬性
成員方法 事物行為
D:類:是一組相關的屬性和行為的集合。是一個抽象的概念。
 物件:是該類事物的具體存在,是一個具體的例項。(物件)
 
 舉例:
學生:類
班長:物件
(5)類的定義及使用
A:類的定義
成員變數 定義格式和以前一樣,就是位置不同,在類中,方法外。
成員方法 定義格式和以前一樣,就是去掉了static。
B:使用類的內容
a:建立物件? 格式
類名 物件名 =  new 類名();
b:如何使用成員變數和成員方法呢
物件名.成員變數
物件名.成員方法()
4:封裝
(1)隱藏實現細節,提供公共的訪問方式
(2)好處:
A:隱藏實現細節,提供公共的訪問方式
B:提高程式碼的複用性
C:提高程式碼的安全性
(3)設計原則
把不想讓外界知道的實現細節給隱藏起來,提供公共的訪問方式
(4)private是封裝的一種體現。
封裝:類,方法,private修飾成員變數




5:private關鍵字
(1)私有的意義,可以修飾成員變數和成員方法
(2)特點:
被private修飾的後的成員只能在本類中被訪問
(3)private的應用:
以後再寫一個類的時候:
把所有的成員變數給private了
提供對應的getXxx()/setXxx()方法




6:this關鍵字
(1)代表當前類的引用物件
記住:哪個物件呼叫方法,該方法內部的this就代表那個物件
(2)this的應用場景:
A:解決了區域性變數隱藏成員變數的問題
B:其實this還有其他的應用,明天講解。




7:構造方法
(1)作用:用於對物件的資料進行初始化
(2)格式:
A:方法名和類名相同
B:沒有返回值型別,連void都不能有
C:沒有返回值


(3)構造方法的注意事項
A:如果我們沒寫構造方法,系統將提供一個預設的無參構造方法
B:如果我們給出了構造方法,系統將不再提供預設構造方法
如果這個時候,我們要使用無參構造方法,就必須自己給出。
推薦:永遠手動自己給出無參構造方法。
(4)給成員變數賦值的方式
A:setXxx()
B:帶參構造方法
(5)這是我寫的的一個案例(封裝)
class Student {
private String name;
private int age;


public Student(){}


public Student(String name,int age) {
this.name = name;
this.age = age;
}


public String getName() {
return name;
}


public void setName(String name) {
this.name = name;
}


public int getAge() {
return age;
}


public void setAge(int age) {
this.age = age;
}
}


測試:
class StudentDemo {
public static void main(String[] args) {
//方式1
Student s1 = new Student();
s1.setName("哈哈");
s1.setAge(27);
System.out.println(s1.getName()+"---"+s1.getAge());


//方式2
Student s2 = new Student("呵呵",30);
System.out.println(s2.getName()+"---"+s2.getAge());
}
以上封裝案例


以下是繼承案例和自己的總結
class Student {
public void eat() {
System.out.println("吃飯");
}


public void sleep() {
System.out.println("睡覺");
}
}




class Teacher {
public void eat() {
System.out.println("吃飯");
}


public void sleep() {
System.out.println("睡覺");
}
}








//使用繼承後
class Person {
public void eat() {
System.out.println("吃飯");
}


public void sleep() {
System.out.println("睡覺");
}
}




//class Student extends Person {}




//class Teacher extends Person {}




class ExtendsDemo {
public static void main(String[] args) {
Student s = new Student();
s.eat();
s.sleep();
System.out.println("-------------");


Teacher t = new Teacher();
t.eat();
t.sleep();
}
}
/*通過學習繼承讓我感受到了很好處,
例如提高了程式碼的複用性和程式碼的維護性,但是繼承也有一個弊端,
還有開發原則:降低了低耦合和高內聚,
類和類的關係, 內聚就是完成自己的事情的能力,
它們都具有自己獨特的功能,唯一不太理解的就是其中的耦合性是否增強了
*/
*/
class Father {
private int num = 10;
public int num2 = 20;


//私有方法,子類不能繼承
private void method() {
System.out.println(num);
System.out.println(num2);
}


public void show() {
System.out.println(num);
System.out.println(num2);
}
}




class Son extends Father {
public void function() {
//num可以在Father中訪問private
//System.out.println(num); //子類不能繼承父類的私有成員變數
System.out.println(num2);
}
}




class ExtendsDemo3 {
public static void main(String[] args) {
// 建立物件
Son s = new Son();
//s.method(); //子類不能繼承父類的私有成員方法
s.show();
s.function();
}
}
要主要電就是子類只能繼承父類成員方法和成員變數,
子類不能繼承父類的構造方法,但是可以通過super關鍵字去訪問父類的構造方法,還有就是不要為了一些功能去繼承。


還有就是多型一個案例  自己寫的
class Animal {
public void eat(){
System.out.println("eat");
}

public void sleep(){
System.out.println("sleep");
}
}


class Dog extends Animal {
public void eat(){
System.out.println("狗吃肉");
}

public void sleep(){
System.out.println("狗站著睡覺");
}
}


class Cat extends Animal {
public void eat() {
System.out.println("貓吃魚");
}

public void sleep() {
System.out.println("貓趴著睡覺");
}
}


class Pig extends Animal {
public void eat() {
System.out.println("豬吃白菜");
}

public void sleep() {
System.out.println("豬側著睡");
}
}


//針對動物操作的工具類
class AnimalTool {
private AnimalTool(){}


/*
//呼叫貓的功能
public static void useCat(Cat c) {
c.eat();
c.sleep();
}

//呼叫狗的功能
public static void useDog(Dog d) {
d.eat();
d.sleep();
}

//呼叫豬的功能
public static void usePig(Pig p) {
p.eat();
p.sleep();
}
*/
public static void useAnimal(Animal a) {
a.eat();
a.sleep();
}

}


class DuoTaiDemo2 {
public static void main(String[] args) {
//我喜歡貓,就養了一隻
Cat c = new Cat();
c.eat();
c.sleep();

//我很喜歡貓,所以,又養了一隻
Cat c2 = new Cat();
c2.eat();
c2.sleep();

//我特別喜歡貓,又養了一隻
Cat c3 = new Cat();
c3.eat();
c3.sleep();