【JAVA筆記】JAVA-入門基礎-面向物件04
一、OOP詳解
- 面向物件程式設計(Object-Oriented Programming,OOP)
- 面向物件程式設計的本質就是:以類的方式組織程式碼,以物件的組織(封裝)資料。
- 抽象
- 三大特性:封裝、繼承、多型、
1、 class類
我們面向物件,就是把一個一個抽象的事務具象化一個類,然後把屬性和行為定義出來。
定義類
public class Cat { String name; int age; void eat(){ System.out.println("小貓吃魚!"); } }
這就是一個類,小貓的名字和年齡是它本身的屬性,吃是小貓的行為
2、類與物件的關係
類是一種抽象的資料型別,而物件是對這種抽象的類的例項化。
public static void main(String[] args) { Cat cat = new Cat(); cat.eat(); }
二.類詳解-封裝
1、 this關鍵字
this翻譯出來就是這個,每一個類都有一個this,他是一個引用。通常情況下可以省略。
在例項方法中,或者構造方法中,為了區分區域性變數和例項變數,不能省略。
private String name; public void setName(String name) { this.name = name; }
這個時候區分這個this.name代表類種屬性的name而不是區域性變數。
2 、構造方法
每個類都有一個預設的構造方法,和類名一樣的無參構造。
但是如果我們寫了一個構造器,系統就不會自動生成無參構造器了
public class Cat { private String name; int age; public Cat() { } public Cat(String name, int age) { this.name = name; this.age = age; } void eat(){ System.out.println("小貓吃魚!"); } }
alt+insert可以選擇constrouctor快速的生成構造方法。構造方法可以過載。
3、封裝
一個類的屬性不應該完全暴露,不然就會被隨意更改,我們需要定義一個方法,通過方法來操作我們的屬性,這就是封裝的基本理念
1)private強調是自己來使用
2)預設是給同包下的來使用
3)protected 強調的是給子類使用
4)public 強調的是給大家使用
封裝的意義:
private 是私有的意思,我們把屬性通過private修飾,然後通過方法去取值和賦值,這樣對於一些違規的操作我們就可以在方法裡進行過濾,比如年齡如果傳過來超過一百五十歲這種。
public class Cat { private String name; private int age; public Cat() { } 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; } public Cat(String name, int age) { this.name = name; this.age = age; } void eat(){ System.out.println("小貓吃魚!"); } }
alt+inser也可以快速生成
三.類詳解-繼承
類與類直接可以繼承,比如我們定義一個人類,然後男人類和女人類就可以繼承人類。完全繼承他的屬性和方法。還有自己的特定的屬性
public class Person { private String name; private int age; public void eat() { System.out.println("吃"); } }
public class Man extends Person { private String huzi; public void niao(){ System.out.println("站著尿尿"); } }
我們就定義是一個人類,基本上每個人都是有年齡名字和吃的行為,但是男人除了人類的特性,還有鬍子和站著尿尿的行為,這樣我們為了不重複宣告屬性和行為,直接繼承即可。
一個類只能單繼承,只能繼承一個父類,但是一個父類可以有多個子類。
Object類是所有類的父類。
1、Super關鍵字
之前介紹了this關鍵字,是類的引用,Super關鍵字就是代表父類的引用。
public void niao(){ super.eat(); System.out.println("站著尿尿"); }
我們子類在尿尿的時候,可以呼叫父類吃的方法,吃完在尿
不管是顯式還是隱式的父類的構造器,super語句一定要出現在子類構造器中第一行程式碼。所以this和 super不可能同時使用它們呼叫構造器的功能,因為它們都要出現在第一行程式碼位置。
2、方法重寫
方法重寫是發生在子類中,引數和方法名返回值型別都得相同。
重寫 例項:
package com.cnblogs; //本類用於實現 public class Application { public static void main(String[] args) { //例項化父類 Person person = new Person(); //例項化子類 Student stu = new Student(); person.getName();//父類屬性 stu.getName(); //子類屬性 //父類屬性 } }
package com.cnblogs; /* person類 */ public class Person { //父類屬性 private String name = "父類屬性"; //父類方法 public void getName(){ System.out.println(name); } }
package com.cnblogs;
/*
student類
*/
public class Student extends Person{
//子類屬性
private String name = "子類屬性";
//子類重寫父類方法
@Override
public void getName() {
System.out.println(name);
//super關鍵字
super.getName();
}
}
四.類詳解-多型
定義:父類引用指向子類物件,就是多型
多型的存在要有3個必要條件:要有繼承,要有方法重寫,父類引用指向子類物件
1、多型例項:
Animal 父類:
package cn.itcast.demo7; //定義父類 public class Animal { private String name; // 空參構造 public Animal() { } // 帶參構造 public Animal(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } // 成員方法 public void eat() { System.out.println("吃飯"); } }
Dog 子類:
package cn.itcast.demo7; //是Animal的子類 public class Dog extends Animal { //對父類eat重寫 @Override public void eat() { System.out.println(getName() + "吃骨頭"); } }
Mouse 子類:
package cn.itcast.demo7; //子類-老鼠類 public class Mouse extends Animal { @Override //對父類eat重寫 public void eat() { System.out.println(getName() + "吃乳酪"); } }
Test測試類(寫法1):
package cn.itcast.demo7; public class Test { public static void main(String[] args) { Animal animal1 = new Dog(); animal1.setName("哈士奇"); animal1.eat(); Animal animal2 = new Mouse(); animal2.setName("Jerry"); animal2.eat(); } }
測試結果:
哈士奇吃骨頭 Jerry吃乳酪
Test測試類(寫法1):
package cn.itcast.demo7; public class Test { public static void main(String[] args) { // 用來測試Dog類和Mouse類 // 測試Dog類 Dog d = new Dog(); d.setName("哈士奇"); showAnimal(d); // 用來測試老鼠類 Mouse m = new Mouse(); m.setName("Jerry"); showAnimal(m); } // 多型的使用場景:父型別可以作為形參的資料型別 public static void showAnimal(Animal an) { an.eat(); } }
兩種寫法返回結果相同
備註:
1)多型關係中,成員變數不涉及重寫 簡單記憶:編譯看左,執行看左 2)多型關係中,成員方法 簡單記憶:編譯看左,執行看右
2、多型呼叫子類獨有方法例項:
Animal 父類:
package cn.itcast.demo8; public class Animal { public void eat() { System.out.println("吃飯"); } }
Dog子類:
package cn.itcast.demo8;
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨頭");
}
public void watch() {
System.out.println("狗會看家");
}
}
Test 測試類:
package cn.itcast.demo8; public class Test { public static void main(String[] args) { // 通過多型建立物件呼叫子類的方法 Animal an = new Dog(); // 呼叫eat()方法 an.eat(); // 呼叫watch()方法,屬於子類獨有的方法 // an.watch(); 不能直接使用 //1、向下轉型(呼叫子類獨有的方法) /* Dog dog = (Dog) an; dog.watch();*/ // 優化、判斷物件是否是Dog物件,如果是再呼叫watch()方法 if (an instanceof Dog) { //能走到這裡說明條件滿足 Dog dog = (Dog) an; dog.watch(); } } }
測試結果:
狗吃骨頭 狗會看家