物件導向-介面
介面的特點:
/*
介面的特點:
A:介面用關鍵字interface表示
interface 介面名 {}
B:類實現介面用implements表示
class 類名 implements 介面名 {}
C:介面不能例項化
那麼,介面如何例項化呢?
按照多型的方式來例項化。
D:介面的子類
a:可以是抽象類。但是意義不大。
b:可以是具體類。要重寫介面中的所有抽象方法。(推薦方案)
由此可見:
A:具體類多型(幾乎沒有)
B:抽象類多型(常用)
C:介面多型(最常用)
*/
//定義動物培訓介面
interface AnimalTrain {
public abstract void jump();
}
//抽象類實現介面,但是意義不大
abstract class Dog implements AnimalTrain {
}
//具體類實現介面,推薦方案
class Cat implements AnimalTrain {
public void jump() {
System.out.println("貓可以跳高了");
}
}
class InterfaceDemo {
public static void main(String[] args) {
//AnimalTrain是抽象的; 無法例項化
//AnimalTrain at = new AnimalTrain();
//at.jump();
AnimalTrain at = new Cat();
at.jump();
}
}
介面的成員特點:
A:成員變數:只能是常量,並且是靜態的。
預設修飾符:public static final
建議:自己手動給出。
public interface Inter {
public int num = 10;
public final int num2 = 20;
//完整版的介面中的變數,不寫public static final,也預設是這樣的
public static final int num3 = 30;
}
//介面名+Impl這種格式是介面的實現類格式
public class InterImpl implements Inter {
}
public class InterfaceDemo2 {
public static void main(String[] args) {
//建立物件
Inter i = new InterImpl();
System.out.println(i.num); //10
System.out.println(i.num2);//20
/*i.num = 100;
i.num2 = 200;
System.out.println(i.num); //報錯:無法為最終變數num分配值
System.out.println(i.num2);//報錯:無法為最終變數num2分配值*/
System.out.println(Inter.num); //10
System.out.println(Inter.num2);//20
}
}
B:構造方法:介面沒有構造方法。
所有的類都預設繼承自一個類:Object。
類 Object 是類層次結構的根類。每個類都使用 Object 作為超類。
所以介面沒有構造方法不影響
C:成員方法:只能是抽象方法。
預設修飾符:public abstract
建議:自己手動給出。
------------------------------------------------------------------------------------------------------------------------------------------------------------
類與類,類與介面,介面與介面的關係:
/*
類與類:
繼承關係,只能單繼承,可以多層繼承。
類與介面:
實現關係,可以單實現,也可以多實現。
並且還可以在繼承一個類的同時實現多個介面。
介面與介面:
繼承關係,可以單繼承,也可以多繼承。
*/
interface Father {
public abstract void show();
}
interface Mother {
public abstract void show2();
}
interface Sister extends Father,Mother {//介面與介面,繼承關係,可以單繼承,也可以多繼承
}
//class Son implements Father,Mother //多實現
class Son extends Object implements Father,Mother {//在繼承一個類的同時實現多個介面
public void show() {
System.out.println("show son");
}
public void show2() {
System.out.println("show2 son");
}
}
class InterfaceDemo3 {
public static void main(String[] args) {
//建立物件
Father f = new Son();
f.show();
//f.show2(); //報錯
//要想用show2(),向下轉型
Son s = (Son)f;
s.show2();
Mother m = new Son();
//m.show(); //報錯
//要想用show(),向下轉型
Son ss = (Son)m;
ss.show();
m.show2();
}
}
抽象類和介面的區別:開發中一般不記它,但是面試中經常會問到
A:成員區別
抽象類:
成員變數:可以變數,也可以常量
構造方法:有
成員方法:可以抽象,也可以非抽象
介面:
成員變數:只可以常量
成員方法:只可以抽象
B:關係區別
類與類
繼承,單繼承
類與介面
實現,單實現,多實現
介面與介面
繼承,單繼承,多繼承
C:設計理念區別
抽象類 被繼承體現的是:”is a”的關係。抽象類中定義的是該繼承體系的共性功能。
介面 被實現體現的是:”like a”的關係。介面中定義的是該繼承體系的擴充套件功能。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
貓狗案例加入跳高功能分析:
/*
貓狗案例,加入跳高的額外功能
分析:從具體到抽象
貓:
姓名,年齡
吃飯,睡覺
狗:
姓名,年齡
吃飯,睡覺
由於有共性功能,所以,我們抽取出一個父類:
動物:
姓名,年齡
吃飯();
睡覺(){}
貓:繼承自動物
狗:繼承自動物
跳高的額外功能是一個新的擴充套件功能,所以我們要定義一個介面
介面:
跳高
部分貓:實現跳高
部分狗:實現跳高
實現;
從抽象到具體
使用:
使用具體類
*/
//定義跳高介面
interface Jumpping {
//跳高功能
public abstract void 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 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 abstract void eat();
//睡覺(){}
public void sleep() {
System.out.println("睡覺覺了");
}
}
//具體貓類
class Cat extends Animal {
public Cat(){}
public Cat(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("貓吃魚");
}
}
//具體狗類
class Dog extends Animal {
public Dog(){}
public Dog(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("狗吃肉");
}
}
//有跳高功能的貓
class JumpCat extends Cat implements Jumpping {
public JumpCat() {}
public JumpCat(String name,int age) {
super(name,age);
}
public void jump() {
System.out.println("跳高貓");
}
}
//有跳高功能的狗
class JumpDog extends Dog implements Jumpping {
public JumpDog() {}
public JumpDog(String name,int age) {
super(name,age);
}
public void jump() {
System.out.println("跳高狗");
}
}
class InterfaceTest {
public static void main(String[] args) {
//定義跳高貓並測試
JumpCat jc = new JumpCat();
jc.setName("哆啦A夢");
jc.setAge(3);
System.out.println(jc.getName()+"---"+jc.getAge());
jc.eat();
jc.sleep();
jc.jump();
System.out.println("-----------------");
JumpCat jc2 = new JumpCat("加菲貓",2);
System.out.println(jc2.getName()+"---"+jc2.getAge());
jc2.eat();
jc2.sleep();
jc2.jump();
//定義跳高狗並進行測試的事情自己完成。
}
}
老師學生案例加入抽菸功能分析及程式碼實現:
/*
老師和學生案例,加入抽菸的額外功能
分析:從具體到抽象
老師:姓名,年齡,吃飯,睡覺
學生:姓名,年齡,吃飯,睡覺
由於有共性功能,我們提取出一個父類,人類。
人類:
姓名,年齡
吃飯();
睡覺(){}
抽菸的額外功能不是人、老師、學生一開始就應該具備的,所以,我們把它定義為介面
抽菸介面。
部分老師抽菸:實現抽菸介面
部分學生抽菸:實現抽菸介面
實現:從抽象到具體
使用:具體
*/
//定義抽菸介面
interface Smoking {
//抽菸的抽象方法
public abstract void smoke();
}
//定義抽象人類
abstract class Person {
//姓名
private String name;
//年齡
private int age;
public Person() {}
public Person(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;
}
//吃飯();
public abstract void eat();
//睡覺(){}
public void sleep() {
System.out.println("睡覺覺了");
}
}
//具體老師類
class Teacher extends Person {
public Teacher() {}
public Teacher(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("吃大白菜");
}
}
//具體學生類
class Student extends Person {
public Student() {}
public Student(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("吃紅燒肉");
}
}
//抽菸的老師
class SmokingTeacher extends Teacher implements Smoking {
public SmokingTeacher() {}
public SmokingTeacher(String name,int age) {
super(name,age);
}
public void smoke() {
System.out.println("抽菸的老師");
}
}
//抽菸的學生
class SmokingStudent extends Student implements Smoking {
public SmokingStudent() {}
public SmokingStudent(String name,int age) {
super(name,age);
}
public void smoke() {
System.out.println("抽菸的學生");
}
}
class InterfaceTest2 {
public static void main(String[] args) {
//測試學生
SmokingStudent ss = new SmokingStudent();
ss.setName("林青霞");
ss.setAge(27);
System.out.println(ss.getName()+"---"+ss.getAge());
ss.eat();
ss.sleep();
ss.smoke();
System.out.println("-------------------");
SmokingStudent ss2 = new SmokingStudent("劉意",30);
System.out.println(ss2.getName()+"---"+ss2.getAge());
ss2.eat();
ss2.sleep();
ss2.smoke();
//測試老師留給自己練習
}
}
相關文章
- 物件導向-物件導向思想物件
- 物件導向與程式導向物件
- 程式導向與物件導向物件
- “程序導向”和“物件導向”物件
- 物件導向物件
- 物件導向,搞定物件物件
- JAVA物件導向基礎--物件導向介紹Java物件
- PHP 物件導向 (九)物件導向三大特徵PHP物件特徵
- PHP物件導向PHP物件
- 物件導向 -- 反射物件反射
- JavaScript 物件導向JavaScript物件
- JS物件導向JS物件
- Java物件導向Java物件
- Python——物件導向Python物件
- 物件導向--下物件
- scala物件導向物件
- 物件導向(下)物件
- Python物件導向Python物件
- 物件導向(oop)物件OOP
- [Java物件導向]Java物件
- python 物件導向Python物件
- Java — 物件導向Java物件
- 物件導向(上)物件
- python-程式導向、物件導向、類Python物件
- Java物件導向——類與物件Java物件
- Js物件導向(1): 理解物件JS物件
- php中的程式導向與物件導向PHP物件
- 初識物件導向物件
- 物件導向拾遺物件
- 物件導向--繼承物件繼承
- java物件導向(上)Java物件
- java物件導向(中)Java物件
- python物件導向(一)Python物件
- 物件導向css oocss物件CSS
- PHP物件導向(三)PHP物件
- golang 物件導向特性Golang物件
- 物件導向相關物件
- 物件導向:繼承物件繼承
- 物件導向再探究物件