1.多態(tài)的概述及其成員訪問特點代碼體現(xiàn) A:多態(tài)(polymorphic)概述
B:多態(tài)前提-
1.要有繼承關系 2.要有方法重寫 3.要有父類引用指向子類對象。 C:多態(tài)中的成員訪問特點之
成員變量:編譯和運行都看父類。 成員方法:編譯看父類,運行看子類(非靜態(tài))。 靜態(tài)成員方法:編譯和運行都看父類—— (靜態(tài)和類相關,算不上重寫,訪問還是父類) class JavaObject {public static void main(String [] args) {Father a = new Son(); //父類引用指向子類對象System.out.println(a.num);//成員變量-編譯看父類,運行也看父類。Father f = new Son();f.print(); //成員方法非靜態(tài)運行看子類f.method(); //靜態(tài)和類相似,相當于是Father.methond()。}
}
class Father {int num = 10;public void print () {System.out.println("父級");}public static void method() {System.out.println("father static method");}
}
class Son extends Father {int num = 20;public void print () {System.out.println("子級");}public static void method() {System.out.println("son static method");}
}
2.李明和老李的故事-多態(tài)向上向下轉型 A:案例分析-通過該案例幫助理解多態(tài)的現(xiàn)象 B:詳細講解多態(tài)中向上轉型和向下轉型 class JavaObject {public static void main(String [] args) {Boy b = new Man(); //父類引用指向子類對象,人類 System.out.println(b.name); //父類引用指向子類對象就是向上轉型b.eat();Man m = (Man)b; //向下轉型m.work(); //多肽的弊端,不能直接使用子類的//基本數(shù)據(jù)類型自動類型提升和強制類型轉換int i = 10;byte c = 20;//i = c; //自動類型提升c = (byte)i; //強制類型轉換}
}class Boy {String name = "liming";public void eat() {System.out.println("吃一小碗飯");}
}
class Man extends Boy {String name = "laoli";public void eat () {System.out.println("吃一大碗飯");}public void work() {System.out.println("工作");}
}
3.多態(tài)的好處和弊端 A:多態(tài)的好處
a:提高了代碼的維護性(繼承保證) b:提高了代碼的擴展性(由多態(tài)保證) B:案例演示
多態(tài)的好處 可以當作形式參數(shù),可以接收任意子類對象 C:多態(tài)的弊端
D:案例演示 method(Animal a) method(Cat c) class JavaObject {public static void main(String [] args) {//Cat c1 = new Cat(); //父類引用指向子類對象,人類//c1.Cat();method(new Cat());method(new Dog());//Animal a = new Cat();開發(fā)很少用父類引用指向子類對象,直接創(chuàng)建子類對象使用其特有屬性和行為。}/*public static void method(Cat c) { //主類加靜態(tài)c.eat();}public static void method(Dog d) { d.eat();}*/public static void method(Animal a) {//當作參數(shù)的時候用多態(tài)最好,因為擴展性強//Cat c = (Cat)a;強轉會出現(xiàn)類型轉換異常,ClassCastException//關鍵字 instanseof 判斷前邊的引用是否是后邊的數(shù)據(jù)類型if (a instanceof Cat) {Cat c = (Cat)a;//向下轉型,轉向子類c.eat();c.catchMouse();} else if (a instanceof Dog) {Dog d = (Dog)a;d.eat();d.lookHome();} else {a.eat();}}
}
class Animal {public void eat() {System.out.println("動物吃飯");}
}
class Cat extends Animal {public void eat () {System.out.println("貓吃魚");}public void catchMouse() {System.out.println("抓老鼠");}
}
class Dog extends Animal {public void eat () {System.out.println("狗吃肉");}public void lookHome() {System.out.println("看家");}
}
4.多態(tài)中的題目分析題 A:看下面程序是否有問題,如果沒有,說出結果 class Fu {public void show() {System.out.println("fu show");}
}class Zi extends Fu {public void show() {System.out.println("zi show");}public void method() {System.out.println("zi method");}
}class Test1Demo {public static void main(String[] args) {Fu f = new Zi();f.method();f.show();}
} B:看下面程序是否有問題,如果沒有,說出結果 class A {public void show() {show2();}public void show2() {System.out.println("我");}
}
class B extends A {public void show2() {System.out.println("愛");}
}
class C extends B {public void show() {super.show();}public void show2() {System.out.println("你");}
}
public class Test2DuoTai {public static void main(String[] args) {A a = new B();a.show();B b = new C();b.show();}
}
5.抽象類的概述及其特點 abstract class JavaObject { //抽象類public static void main(String [] args) {//Animal a = new Animal();//Animal a = new Cat();//a.eat();}
}
abstract class Animal {public abstract void eat();
}
abstract class Cat extends Animal {/*public void eat() {System.out.println("貓吃魚");}*/
}
6.抽象類的成員特點 A:抽象類的成員特點
a:成員變量:既可以是變量,也可以是常量;abstract不能修飾成員變量。 b:構造方法:有。
c:成員方法:既可以是抽象的,也可以是非抽象的。 B:案例演示
C:抽象類的成員方法特性:
a:抽象方法 強制要求子類做的事情。 b:非抽象方法 子類繼承的事情,提高代碼復用性。 abstract class JavaObject { //抽象類public static void main(String [] args) {}
}
abstract class Demo {int num1 = 10;final int num2 = 20;public Demo() {}public void print() {System.out.println("11111");}public abstract void method();
}
class DemoSon extends Demo {public void method() {System.out.println("22222");}
}
7.旅行-案例演示抽象類的作用 abstract class JavaObject { //抽象類public static void main(String [] args) {name1 n = new name1();n.traffic();}
}
/*
旅行travel
交通traffic
*/
abstract class travel {public abstract void traffic();
}
class name1 extends travel {public void traffic() {System.out.println("坐汽車");}
}
class name2 extends travel {public void traffic() {System.out.println("坐火車");}
}
class name3 extends travel {public void traffic() {System.out.println("坐飛機");}
}
8.抽象類練習貓狗案例 A:案例演示
具體事物:貓,狗 共性:姓名,年齡,吃飯 貓的特性:抓老鼠 狗的特性:看家 abstract class JavaObject {public static void main(String [] args) {Cat c = new Cat("加菲貓",8);System.out.println(c.getName() + "..." + c.getAge());c.eat();c.catchMouse();Dog d = new Dog("八公",12);System.out.println(d.getName() + "..." + d.getAge());d.eat();d.lookHome();}
}
abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name,int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}public abstract void eat();
}
class Cat extends Animal {public Cat() {}public Cat(String name,int age) {super(name,age);}public void eat() {System.out.println("貓吃魚");}public void catchMouse() {System.out.println("抓老鼠");}
}
class Dog extends Animal {public Dog() {}public Dog(String name,int age) {super(name,age);}public void eat() {System.out.println("狗吃肉");}public void lookHome() {System.out.println("看家");}
}
9.抽象類練習老師學生案例 A:案例演示
具體事物:基礎班老師,就業(yè)班老師 共性:姓名,年齡,講課。 具體事物:基礎班學生,就業(yè)班學生 共性:姓名,年齡,學習 abstract class JavaObject { //抽象類public static void main(String [] args) {Teacher1 b1 = new Teacher1("王城",30);System.out.println(b1.getName() + "..." + b1.getAge());b1.teach();System.out.println("----------------------------");Teacher2 b2 = new Teacher2("黎明",32);System.out.println(b2.getName() + "..." + b2.getAge());b2.teach();System.out.println("----------------------------");Student1 s1 = new Student1("馮鞏",18);System.out.println(s1.getName() + "..." + s1.getAge());s1.study();System.out.println("----------------------------");Student2 s2 = new Student2("張宇",20);System.out.println(s2.getName() + "..." + s2.getAge());s2.study();System.out.println("----------------------------");}
}
class Person {private String name;private int age;public Person() {}public Person(String name,int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}
}
abstract class Teacher extends Person {public Teacher() {}public Teacher(String name,int age) {super(name,age);}public abstract void teach(); //講課抽象方法
}
class Teacher1 extends Teacher {public Teacher1() {}public Teacher1(String name,int age) {super(name,age);}public void teach() {System.out.println("基礎班老師講課");}
}
class Teacher2 extends Teacher {public Teacher2() {}public Teacher2(String name,int age) {super(name,age);}public void teach() {System.out.println("就業(yè)班老師講課");}
}
abstract class Student extends Person {public Student() {}public Student(String name,int age) {super(name,age);}public abstract void study(); //學習抽象方法
}
class Student1 extends Student {public Student1() {}public Student1(String name,int age) {super(name,age);}public void study() {System.out.println("基礎班學生學習");}
}
class Student2 extends Student {public Student2() {}public Student2(String name,int age) {super(name,age);}public void study() {System.out.println("就業(yè)班學生學習");}
}
10.抽象類練習員工案例 A:案例演示
假如我們在開發(fā)一個系統(tǒng)時需要對程序員類進行設計,程序員包含3個屬性:姓名、工號以及工資。 經(jīng)理,除了含有程序員的屬性外,另為還有一個獎金屬性。 請使用繼承的思想設計出程序員類和經(jīng)理類。要求類中提供必要的方法進行屬性訪問。 class JavaObject {public static void main(String [] args) {Coder c = new Coder("蓋倫","001",12000);c.work();Manager m = new Manager("諾手","007",18000,5000);m.work();}
}
abstract class Employee {private String name;private String id;private double salary;public Employee() {}public Employee(String name,String id,double salary) {this.name = name;this.id = id;this.salary = salary;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setId(String id) {this.id = id;}public String getId() {return id;}public void setSalary(double salary) {this.salary = salary;}public double getSalary() {return salary;}public abstract void work();
}
class Coder extends Employee {public Coder() {}public Coder(String name,String id,double salary) {super(name,id,salary);}public void work() {System.out.println("姓名是" + this.getName() + ",工號是" + this.getId() + ",工資是" + this.getSalary() + ",工作是敲代碼");}
}
class Manager extends Employee {private int bonus; //獎金public Manager() {}public Manager(String name,String id,double salary,int bonus) {super(name,id,salary);this.bonus = bonus;}public void work() {System.out.println("獎金是" + bonus + ",姓名是" + this.getName() + ",工號是" + this.getId() + ",工資是" + this.getSalary() + ",工作是管理");}
}
11.抽象類中的面試題 A:面試題1
一個抽象類如果沒有抽象方法,可不可以定義為抽象類?如果可以,有什么意義? 可以 這么做目的只有一個,就是不讓其他類創(chuàng)建本類對象,交給子類完成 B:abstract不能和哪些關鍵字共存
abstract和static
被abstract修飾的方法沒有方法體 被static修飾的可以用類名.調用,但是類名.調用抽象方法是沒有意義的 abstract和final
被abstract修飾的方法強制子類重寫 被final修飾的不讓子類重寫,所以他倆是矛盾的 abstract和private
被abstract修飾是為了讓子類看到并強制重寫 被private修飾不讓子類訪問,所以他倆是矛盾的 abstract class Demo {public static abstract void print();// 錯誤: 非法的修飾符組合: abstract和staticpublic final abstract void print();//錯誤: 非法的修飾符組合: abstract和finalprivate abstract void print(); //錯誤: 非法的修飾符組合: abstract和private
}
12.接口的概述及其特點 A:接口概述
從狹義的角度講就是指java中的interface 從廣義的角度講對外提供規(guī)則的都是接口 B:接口特點
C:案例演示
abstract class JavaObject { //抽象類public static void main(String [] args) {//Inter i = new Inter(); //接口不能被實例化,調用抽象方法沒有意義Inter i = new Demo(); //父類引用指向子類對象i.print(); }
}
interface Inter {public abstract void print(); //接口中的方法都是抽象的
}class Demo implements Inter{public void print() {System.out.println("print");}
}
13.接口的成員特點 abstract class JavaObject { //抽象類public static void main(String [] args) {//Inter i = new Inter(); //接口不能被實例化,調用抽象方法沒有意義Demo d = new Demo(); //父類引用指向子類對象d.print(); System.out.println(Inter.num);}
}
interface Inter {public static final int num = 10;public Inter(){} //接口中沒有構造方法public abstract void print(); //接口中的方法都是抽象的public void print() { //接口中不能定義非抽象方法 }public abstract void print();
}
class Demo /*extends Object*/implements Inter{ //一個類不寫繼承任何類,默認繼承Object類。public void print() {//num = 20;System.out.println(num);}public Demo() {super();}
}
14.類與類,類與接口,接口與接口的關系 A:類與類,類與接口,接口與接口的關系
a:類與類:
b:類與接口:
實現(xiàn)關系,可以單實現(xiàn),也可以多實現(xiàn)。 并且還可以在繼承一個類的同時實現(xiàn)多個接口。 c:接口與接口:
B:案例演示
interface InterA {public abstract void printA();
}
interface InterB {public abstract void printB();
}
interface InterC extends InterA,InterB{
}
class Demo extends Object implements InterA,InterB {//implements只能寫一次public void printA() {System.out.println("printA");}public void printB() {System.out.println("PrintB");}
}
15.抽象類和接口的區(qū)別 A:成員區(qū)別
抽象類:
成員變量:可以變量,也可以常量 構造方法:有 成員方法:可以抽象,也可以非抽象 接口:
B:關系區(qū)別
類與類
類與接口
實現(xiàn),單實現(xiàn),多實現(xiàn) 接口與接口
C:設計理念區(qū)別
抽象類 被繼承體現(xiàn)的是:”is a”的關系。抽象類中定義的是該繼承體系的共性功能。 接口 被實現(xiàn)體現(xiàn)的是:”like a”的關系。接口中定義的是該繼承體系的擴展功能。 16.貓狗案例加入跳高功能分析及其代碼實現(xiàn) A:案例演示
動物類:姓名,年齡,吃飯,睡覺。 貓和狗 動物培訓接口:跳高 abstract class JavaObject {public static void main(String [] args) {Cat c = new Cat("加菲貓",8);c.eat();c.sleep();JumpCat jc = new JumpCat("跳高貓",12);jc.eat();jc.sleep();jc.jump();}
}
abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name,int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}public abstract void eat(); //抽象 吃飯public abstract void sleep(); //抽象 睡覺
}
interface Jumping { //跳高的接口public void jump();
}class Cat extends Animal {public Cat() {}public Cat(String name,int age) {super(name,age);}public void eat() {System.out.println("貓吃魚");}public void sleep() {System.out.println("側著睡");}
}
class JumpCat extends Cat implements Jumping {public JumpCat() {}public JumpCat(String name,int age) {super(name,age);}public void jump() {System.out.println("貓?zhí)?#34;);}
}
總結
以上是生活随笔 為你收集整理的Java编程基础10——面向对象_多态抽象类接口 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內容還不錯,歡迎將生活随笔 推薦給好友。