Java学习路程之接口和抽象

一.接口和抽象类
1.接口和抽象之间的区别
1).使用方式
抽象类: 使用继承(关键字extends)
接口: 接口的实现(关键字 implements)
2.成员变量
抽象类:变量 常量
接口:常量(系统默认以public static final 修饰)
3.成员方法
抽象类: 抽象方法 成员方法
接口: 抽象方法(静态方法 默认方法)
4.构造方法
抽象类:有
接口:没有

类与类之间的关系:单继承和多层继承
类和接口之间的关系:单实现也可以多实现
接口与接口之间的关系:可以是单继承和多继承

public class Day10 {
    public static void main(String[] args) {

    }
}
interface interA{
    public abstract void fn1();
}
interface interB {
    public abstract void fn2();
}
//类和接口之间的关系:单实现也可以多实现
class classA implements interA,interB{
    //抽象方法的实现
    public void fn2() {

    }
    public void fn1() {

    }
}
//接口与接口之间的关系:可以是单继承和多继承
interface interC{
    public abstract void fn1();
}
interface interD extends interC,interE{

}
interface interE{
    public abstract void fn2();
}
//实现interD
class classB implements interD{
    public void fn1() {

    }
    public void fn2() {

    }
}

2.新特性 接口的静态方法和默认方法
静态方法:static修饰
默认方法:default修饰
默认方法实现类不要求强制重写,实现类中可以重写默认方法但是不能使用default修饰,调用可以使用多态的形式

interface Inter1{
    //抽象方法
    public abstract void fn();
    //静态方法
    public static void fn1(){
        System.out.println("接口Inter1中的静态方法");
    }
    //默认方法
    public default void fn2(){
        System.out.println("接口Inter1中的默认方法");
    }
}
//接口实现类
class InterImpl implements Inter1{
    public void fn() {
        System.out.println("我是实现类中的Fn方法");
    }
    public void defaultFn() {
        System.out.println("我是实现类的defaultFn方法");
    }
    //静态方法
    public static void staticFn() {
        System.out.println("我是实现类中的staticFn方法");
    }
    //成员方法
    public void test(){
        //调用接口中的静态方法
        Inter1.staticFn();
        //调用接口中的默认方法
        InterF.super.defaultFn();
    }
}

二.缺省适配器模式
实现方法:
1.使用一个适配器类实现接口,实现接口中的所有方法,方法使用空实现
2.用户的类再来继承这个适配器类
3.用户的类可以进行选择性的重写

public class Day10 {
    public static void main(String[] args) {
        Adapter adapter = new XM();
        adapter.run();//输出:跑步
    }
}
//接口
interface Gym{
    public abstract void run();
    public abstract void swim();
}
//适配器实现接口
class Adapter implements Gym{
    public void run(){};
    public void swim(){};
}
//创建用户类进行选择性重写
class XM extends Adapter{
    public void run(){
        System.out.println("跑步");

    };
}

练习1
/* 经过国际主板研究协会讨论
* 最终要求 主板生产商 要按规则生产可插卡的主板(插卡的方法)
* 所有的卡都要有 开始和停止的方法
* 设计完成 生产 大力牌主板
* 主板接口(插卡方法)
* 抽象卡类(开始和停止的方法)
* 声卡 继承抽象类
* 大力牌主板类 实现接口*/

//抽象卡类
abstract class Card{
    //抽象方法
    public abstract void start();
    public abstract void stop();
}
//接口类
interface MainBoardInter{
    //多态的插卡方法
    public abstract void insertCard(Card card);
}
//声卡类
class SoundCard extends Card{
    public void start(){
        System.out.println("播放音乐");
    }
    public void stop() {

        System.out.println("结束播放");
    }
}
//大力牌主板类
class DLMainBoard implements MainBoardInter{
    public void insertCard(Card card) {
        card.start();
        card.stop();
    }
}

练习2
/* 需求:
* 1.人类 吃 姓名 性别
* 2.男人类 姓名 性别 有女朋友 吃肉 介绍女朋友是谁和性别 并介绍自己是谁
* 3.女人类 姓名 性别 有男朋友 吃素 介绍男朋友是谁和性别 并介绍自己是谁
* 4.男人可以挣钱给女朋友花 接口 男人类实现
* 5.女的特有方法 整容 开眼角 丰唇
* (要求构造方法/set/get方法)
* 6.写测试类测试
*
* */

//人类
class Person{
    private String name;
    private String gender;
    //构造方法
    public Person() {

    }
    public Person(String name,String gender) {
        this.name = name;
        this.gender = gender;
    }
    //set/get方法

    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public String getGender() {
        return gender;
    }
    //抽象吃的方法
    public abstract void eat();
}
//男人类
public class Man extends Person implements MakeMoney{
    //使用其他类的对象来当做自己类的成员变量
    //女友
    private Woman girlFriend;
    //构造方法
    public Man() {

    }
    public Man(String name, String gender, Woman girlFriend) {
        //先调用父类的有参数构造方法
        super(name, gender);
        //给自己特有的成员变量赋值
        this.girlFriend = girlFriend;
    }
    //set/get方法
    public void setGirlFriend(Woman girlFriend) {
        this.girlFriend = girlFriend;
    }
    public Woman getGirlFriend() {
        return girlFriend;
    }
    //实现抽象方法
    public void eat() {
        System.out.println("吃肉");
    }
    //介绍自己和女友方法
    public void sayHi() {
        //现获取女朋友的对象,对象.get方法获取名字性别
        System.out.println("女朋友是" +this.getGirlFriend().getName());
        System.out.println("性别" + this.girlFriend.getGender());
        System.out.println("我是" + this.getName());
    }
    //实现接口的方法
    public void makeMoney() {
        System.out.println("挣钱养家");
    }
}
//女人类
public class Woman extends Person{
    //男友
    private Man manFriend;
    public Woman() {

    }
    public Woman(String name,String gender, Man manFriend) {
        super(name, gender);
        //给自己特有的成员变量赋值
        this.manFriend = manFriend;
    }
    //set/get方法
    public Man getManFriend() {
        return manFriend;
    }
    public void setManFriend(Man manFriend) {
        this.manFriend = manFriend;
    }
    public void eat() {
        System.out.println("吃素");
    }
    //整容
    public void changeFace(String body) {
        System.out.println("整" + body);
    }
    //介绍
    public void sayHi() {
        //现获取男朋友的对象,对象.get方法获取名字性别
        System.out.println("我是" + this.getName());
        System.out.println("男朋友是" +this.manFriend.getName());
        System.out.println("性别" + this.manFriend.getGender());
    }
}
//接口
public interface MakeMoney {
    public abstract void makeMoney();
}
//测试类
public class Test {
    public static void main(String[] args) {
        //创建女对象
        Woman woman = new Woman();

        //男的赋值
        Man man = new Man();
        man.setName("东");
        man.setGender("男");
        man.setGirlFriend(woman);
        //女的赋值
        woman.setName("小花");
        woman.setGender("女");
        woman.setManFriend(man);
        man.sayHi();
        woman.sayHi();
        //通过man对象,把GirlFriend取出
        //拥有一个其他类的对象,
        man.getGirlFriend().changeFace("双眼皮");
    }
}

练习3
/*新建类:汽车类(Car) 引擎类(Engine)
汽车类特征:汽车名称carName 汽车颜色carColor
汽车价格carPrice 引擎carEngine
汽车类行为:介绍sayHi:汽车名称 汽车颜色 汽车价格 引擎名称 引擎类型
引擎类特征:引擎名称engineName 引擎类型engineType

创建轮胎类Tire
将四个轮胎装载在汽车上 输出轮胎装到汽车上的哪个位置
左前轮 右前轮 左后轮 右后轮
轮胎类
成员变量 轮胎名称tireName 轮胎类型tireType 轮胎位置tirePosition*/

public class Car {
    private String carName;
    private String carColor;
    private String carPrice;
    //声明引擎类的对象,作为成员变量
    private Engine carEngine;
    //轮胎保存在车类里
    //Tire[] tires
    private Tire[] tires = new Tire[4];
    //构造方法
    public Car() {
    }
    public Car(String carName, String carColor, String carPrice, Engine carEngine) {
        this.carName = carName;
        this.carColor = carColor;
        this.carPrice = carPrice;
        this.carEngine = carEngine;
    }
    //set/get方法
    public String getCarName() {
        return carName;
    }
    public void setCarName(String carName) {
        this.carName = carName;
    }
    public String getCarColor() {
        return carColor;
    }
    public void setCarColor(String carColor) {
        this.carColor = carColor;
    }
    public String getCarPrice() {
        return carPrice;
    }
    public void setCarPrice(String carPrice) {
        this.carPrice = carPrice;
    }
    public Engine getCarEngine() {
        return carEngine;
    }
    public void setCarEngine(Engine carEngine) {
        this.carEngine = carEngine;
    }
    //轮胎数组的setget方法
    public void setTires(Tire[] tires) {
        this.tires = tires;
    }
    public Tire[] getTires() {
        return this.tires;
    }
    //需要一个装轮胎的方法,一个一个装到声明的数组中
    //tirePosition表示轮胎该装到什么位置上,相当于装到数组的哪个位置上
    public void setTire(Tire tire,int tirePosition) {
        //把轮胎按数组的位置放入数组中
        this.tires[tirePosition] = tire;
        //按照索引赋值轮胎的位置信息
        switch (tirePosition) {
        case 0:
            tire.setTirePosition("左前轮");
            break;
        case 1:
            tire.setTirePosition("右前轮");
            break;
        case 2:
            tire.setTirePosition("左后轮");
            break;
        case 3:
            tire.setTirePosition("右后轮");
            break;

        default:
            break;
        }
    }
    //介绍自己的方法
    //汽车类行为:介绍sayHi:汽车名称 汽车颜色 汽车价格 引擎名称 引擎类型
    public void sayHi() {
        System.out.println("汽车名称" + carName);
        System.out.println("汽车颜色" + carColor);
        System.out.println("汽车价格" + carPrice);
        //如果不给carEngine赋值,初值就是null,用它来调用方法就会出现空指针异常
        System.out.println("引擎名称" + carEngine.getEngineName());
        System.out.println("引擎类型" + carEngine.getEngineType());
        //遍历数组,打印每一个轮胎的属性
        for (int i = 0; i < tires.length; i++) {
            //取出每一个轮胎
            Tire tire = tires[i];
            //打印轮胎信息
            System.out.println(tire);
        }
    }
}
//引擎类
public class Engine {
    private String engineName;
    private String engineType;
    //构造方法
    public Engine() {

    }
    public Engine(String engineName, String engineType) {
        super();
        this.engineName = engineName;
        this.engineType = engineType;
    }
    //set/get方法
    public String getEngineName() {
        return engineName;
    }
    public void setEngineName(String engineName) {
        this.engineName = engineName;
    }
    public String getEngineType() {
        return engineType;
    }
    public void setEngineType(String engineType) {
        this.engineType = engineType;
    }
}
//轮胎类
public class Tire {
    private String tireName;
    private String tireType;
    private String tirePosition;
    //构造方法
    public Tire() {

    }
    //轮胎只有安装的时候才确定位置信息,所以开始不需要次参数
    public Tire(String tireName, String tireType) {
        super();
        this.tireName = tireName;
        this.tireType = tireType;
    }
    //set/get方法
    public String getTireName() {
        return tireName;
    }
    public void setTireName(String tireName) {
        this.tireName = tireName;
    }
    public String getTireType() {
        return tireType;
    }
    public void setTireType(String tireType) {
        this.tireType = tireType;
    }
    public String getTirePosition() {
        return tirePosition;
    }
    public void setTirePosition(String tirePosition) {
        this.tirePosition = tirePosition;
    }
    //
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        String str = "轮胎名字" + tireName + "轮胎类型" + tireType +"轮胎位置" + tirePosition;
        return str;
    }
}
//测试类
public class Test {
    public static void main(String[] args) {
        Engine engine = new Engine("V18", "涡轮加压");
        Car car = new Car("路虎", "黑色", "50万", engine);
        //循环装轮胎
        for (int i = 0; i < 4; i++) {
            Tire tire = new Tire("米其林", "雨胎");
            //装轮胎,set方法
            car.setTire(tire, i);
        }
        //介绍自己
        car.sayHi();
    }
}

猜你喜欢

转载自blog.csdn.net/l710820742/article/details/82261663
今日推荐