java學習筆記(13-介面、final、多型)
阿新 • • 發佈:2019-01-08
1.介面interface
1.1 介面基本使用
package com.daigua13; /* * 介面的成員特點: * 只能有抽象方法 * 只能有常量 * 預設使用public&abstract修飾方法 * 只能使用public&abstract修飾方法 * 預設使用public static final來修飾成員變數 * * 建議:建議大家手動的給上預設修飾符 * * 注意: * 介面不能建立物件(不能例項化) * 類與介面的關係是實現關係,一個類實現一個介面必須實現它所有的方法 */ public class InterfaceDemo { public static void main(String[] args) { Cat c = new Cat(); c.eat(); System.out.println(c.num); System.out.println(Animal.num); } } // 定義介面 interface Animal { // 介面只能有常量用public static final修飾 public static final int num = 10; // 抽象方法 public abstract void eat(); } class Cat implements Animal { public void eat() { System.out.println("我是你爸爸!"); } }
1.2 介面的多繼承
package com.daigua13; /* * * 類與類:繼承關係,單一繼承,多層繼承 * 類與介面:實現關係,多實現 * 介面與介面的關係:繼承關係,多繼承 */ public class InterfaceDemo2 { public static void main(String[] args) { } } interface InterA extends InterB { public abstract void method(); } interface InterB { public abstract void function(); } interface InterC extends InterA { } class Demo implements InterC { @Override public void method() { // TODO Auto-generated method stub } @Override public void function() { // TODO Auto-generated method stub } }
1.3 運動員案例

package com.daigua13; public class InterfaceTest { public static void main(String[] args) { Basketball b = new Basketball(); b.name = "Mike"; b.age = 50; b.gender = "男"; b.studyEnglish(); b.study(); } } class Human { String name; int age; String gender; public void eat() { System.out.println("吃飯"); } public void sleep() { System.out.println("睡覺"); } } abstract class Althlete extends Human { // 抽象方法 學習 public abstract void study(); } abstract class Coach extends Human { // 抽象方法 教 public abstract void teach(); } interface StudyEnglish { public abstract void studyEnglish(); } class PingPong extends Althlete { @Override public void study() { // TODO Auto-generated method stub System.out.println("學習抽球"); } } class Basketball extends Althlete implements StudyEnglish { @Override public void study() { // TODO Auto-generated method stub System.out.println("學扣籃"); } @Override public void studyEnglish() { // TODO Auto-generated method stub System.out.println("籃球運動員" + this.name + "學英語"); } } class BasketballCoach extends Coach { @Override public void teach() { // TODO Auto-generated method stub System.out.println("教扣籃"); } } class PingPongCoach extends Coach { @Override public void teach() { // TODO Auto-generated method stub System.out.println("教抽球"); } }
2.final關鍵字
2.1 簡單使用
package com.daigua13;
/*
* final: 修飾符,可以用於修飾類、成員方法和成員變數
* final所修飾的類:不能被繼承,不能有子類
* final所修飾的方法:不能被重寫
* final所修飾的變數:是不可以修改的,是常量
*
* 常量:
* 字面值常量:1,2,3
* 自定義常量:被final所修飾的成員變數,一旦初始化則不可改變
*
* 注意:自定義常量必須初始化,可以選擇顯示初始化或者構造初始化
*/
public class FinalDemo {
public static void main(String[] args) {
// Animal a = new Animal();
// a.eat();
Dog d = new Dog();
// d.eat();
// d.num = 20;
System.out.println(d.NUM);
}
}
/* final */ class Animall {
public final void eat() {
System.out.println("吃東西");
}
}
class Dog extends Animall {
/* public void eat() {} */
final int NUM;
public Dog() {
NUM = 10;
}
}
3.多型
3.1基本使用
package com.daigua13;
/*
* 多型的前提:
* 子父類的繼承關係
* 方法的重寫
* 父類引用指向子類物件
*
* 動態繫結:執行期間呼叫的方法,是根據其具體的型別
*
*/
public class PolymorphismDemo {
public static void main(String[] args) {
/*
* Cat c = new Cat(); c.eat();
*/
// 父類引用 Animal a
// 指向 =
// 子類物件 new Cat()
Animal3 a = new Cat3();
a.eat();
}
}
class Animal3 {
public void eat() {
System.out.println("吃東西");
}
}
class Cat3 extends Animal3 {
public void eat() {
System.out.println("貓吃魚");
}
}
3.2多型成員特點(執行順序)
package com.daigua13;
/*
*
* 多型的成員特點:
* 成員變數 編譯時看的是左邊,執行時看的左邊
* 成員方法 編譯時看的是左邊,執行時看右邊
* 靜態方法 編譯時看的是左邊,執行時看的也是左邊
*
*
* 編譯時看的都是左邊,執行時成員方法看的是右邊,其他(成員變數和靜態的方法)看的都是左邊
*
*/
public class PolymorphicDemo2 {
public static void main(String[] args) {
Dad d = new Kid();
// System.out.println(d.num);
d.method();
d.function();// 使用變數去呼叫靜態方法,其實相當於用變數型別的類名去呼叫
}
}
class Dad {
int num = 20;
public void method() {
System.out.println("我是父類方法");
}
public static void function() {
System.out.println("我是父類靜態方法");
}
}
class Kid extends Dad {
int num = 10;
public void method() {
System.out.println("我是子類方法");
}
public static void function() {
System.out.println("我是子類靜態方法");
}
}
3.3多型中向上轉型與向下轉型
package com.daigua13;
/*
*
* 多型中的向上轉型和向下轉型:
*
* 引用型別之間的轉換
* 向上轉型
* 由小到大(子型別轉換成父型別)
* 向下轉型
* 由大到小
* 基本資料型別的轉換
* 自動型別轉換
* 由小到大
* byte short char --- int --- long --- float --- double
* 強制型別轉換
* 由大到小
*
*
*
*/
public class DuoTailDemo3 {
public static void main(String[] args) {
Animal2 a = new Dog1();// 向上轉型
a.eat();
Dog1 d = (Dog1) a;// 向下轉型
d.swim();
}
}
class Animal2 {
public void eat() {
System.out.println("吃東西");
}
}
class Dog1 extends Animal2 {
@Override
public void eat() {
System.out.println("啃骨頭");
}
public void swim() {
System.out.println("狗刨");
}
}
3.4 多型的優缺點
package com.itheima_01;
/*
*
* 多型的優缺點
* 優點:可以提高可維護性(多型前提所保證的),提高程式碼的可擴充套件性
缺點:無法直接訪問子類特有的成員
*/
public class PoymorphicDemo4 {
public static void main(String[] args) {
MiFactory factory = new MiFactory();
factory.createPhone(new MiNote());
factory.createPhone(new RedMi());
}
}
class MiFactory {
/*public void createPhone(MiNote mi) {
mi.call();
}
public void createPhone(RedMi mi) {
mi.call();
}*/
// 這裡是對多型的體現
public void createPhone(Phone p) {
p.call();
}
}
interface Phone {
public void call();
}
//小米Note
class MiNote implements Phone{
public void call() {
System.out.println("小米Note打電話");
}
}
//紅米
class RedMi implements Phone {
public void call() {
System.out.println("紅米打電話");
}
}