Java微服务学习 第九天 接口 内部类

2.接口

当抽象类中所有方法都是抽象方法的时候,那么这个类是一个特殊的抽象类,叫接口 接口是java中最重要的概念,接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成。 格式: interface 接口名{} 接口中的成员修饰符是固定的。 成员常量:public static final 成员函数:public abstract 发现接口中的成员都是public的。

public interface USB {
    public static final  int AGE=0;
    //public abstract void study1();//灰色的可以省略  方法名和常量名不能删
    default void add(){
        System.out.println("这是一个普通方法");
        study();
        eat();
        play();
    }
    void study();
    void eat();
    void play();
​
}
​
public class TestUsb implements USB {
​
    @Override
    public void study() {
        System.out.println("学习");
    }
​
    @Override
    public void eat() {
        System.out.println("吃饭");
    }
​
    @Override
    public void play() {
        System.out.println("打篮球");
    }
​
    public static void main(String[] args) {
        TestUsb testUsb = new TestUsb();
        testUsb.add();
​
    }

defalt来修饰:

接口的出现将“多继承”通过另一种方式体现出来,即“多实现”

接口的特点:

1.接口是对外暴露的原则

2.接口是程序的功能拓展

3.接口的出现降低耦合性 高内聚,低耦合

4.接口可以用来多实现

5.类与接口之间是实现关系,而且类可以继承一个类的同时还可以实现多个接口

6.接口与接口直接可以有继承关系

接口为类:com.zx.dao

借口实现包:com.zx.dao.impl

第三大特征 - 多态

什么是多态

简单来说,多态就是一个对象具有多种形态

向同一父类

instanceof 是 java的保留关键字

它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean的数据类型

package com.zx.test1;
​
import com.zx.beans1.Animal;
import com.zx.beans1.Cat;
import com.zx.beans1.Dog;
​
public class AnimalTest {
    public static void main(String[] args) {
        Animal animal = new Dog();
       // animal.eat();
        Animal animal2 = new Cat();
        animal2.eat();
        
        if (animal instanceof Cat){
            Cat cat =(Cat) animal2;
        }else {
            System.out.println("类型不兼容");
        }
        if (animal instanceof Dog){
            Dog dog =(Dog) animal;
            animal.eat();
        }else {
            System.out.println("类型不兼容");
        }
​
    }
​
}

3.作业

第三题:分析以下需求,并用代码实现 1.定义动物类: 属性: 年龄行为: 喝水,吃东西(吃什么不确定) 2.定义游泳接口: 行为: 游泳方法 3.定义狗类: 行为: 吃饭(啃骨头)和游泳(狗刨) 4.定义羊类: 行为: 吃饭(羊啃草) 5.定义青蛙类: 行为: 吃饭(吃虫子)和游泳(蛙泳) 6.定义饲养员类: 行为: 饲养动物:包括吃饭和喝水 7.定义测试类: 创建饲养员对象,饲养员调用三次饲养方法:饲养狗,饲养羊,饲养青蛙

要求: 1子类重写父类中的吃东西方法 2.要求给狗和青蛙添加游泳的方法(实现游泳接口) 3.饲养员类中定义一个方法,传入动物类对象(父类), 调用吃饭方法,如果有游泳方法也需进行测试 4.打印如下格式的结果: 喝水 狗啃骨头 狗会狗刨游泳 喝水 青蛙吃小虫青蛙会蛙泳 喝水 I 羊啃草

package com.动物题.beans;
​
public abstract class Animal {
    public void drink(){
        System.out.println("喝水");
    }
    public abstract void eat();
​
}
-----------------------------------------------------------------
package com.动物题.beans;
​
public class Dog   extends Animal  implements Swim{
​
    @Override
    public void eat() {
        System.out.println("狗啃骨头");
    }
​
    @Override
    public void swim() {
        System.out.println("狗会狗刨游泳");
    }
}
-----------------------------------------------------------------
package com.动物题.beans;
​
public class Frog extends Animal  implements Swim{
    @Override
    public void eat() {
        System.out.println("吃虫子");
    }
​
    @Override
    public void swim() {
        System.out.println("蛙泳");
    }
}
--------------------------------------------------------------------
package com.动物题.beans;
​
public class Person {
​
​
    public void feed(Animal animal) {
        animal.drink();
        animal.eat();
​
        if (animal instanceof Dog) {//
            Dog dog =(Dog) animal;
           dog.swim();
        }else if (animal instanceof Frog){
            ((Frog) animal).swim();
        }
    }
}
​
​
--------------------------------------------------------------------
package com.动物题.beans;
​
public class Sheep extends Animal {
    @Override
    public void eat() {
        System.out.println("羊啃草");
    }
}
--------------------------------------------------------------
package com.动物题.beans;
​
public interface Swim {
    void swim();
}
-----------------------------------------------------------------
package com.动物题.test;
​
import com.动物题.beans.Dog;
import com.动物题.beans.Frog;
import com.动物题.beans.Person;
import com.动物题.beans.Sheep;
​
public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        Sheep sheep = new Sheep();
        Frog frog = new Frog();
        Dog dog = new Dog();
        person.feed(dog);
        person.feed(frog);
        person.feed(sheep);
​
​
​
    }
}
​

第四题:地上有一群鸟,一声枪响,有的吓得飞走了,有的吓得跑走了

提示:创建会飞的鸟的实体类FlyBird,创建会跑的鸟 的实体类RunBird,统一继承鸟类Bird 一声枪响(对鸟类下命令,执行run(),不同的子类执行不同的行为) 测试类中:创建鸟类数组,Bird[] birds = new Bird[20]; 利用随机数,依照不同的随机数实例化不同的子类,然后统一调用run方法执行

package com.zx.beans;
​
public interface Bird {
    void run();
​
​
}
---------------------------------------------------------------------
package com.zx.beans;
​
public class FlyBird implements Bird {
    @Override
    public void run() {
        System.out.println("鸟飞了");
    }
}
----------------------------------------------------------------------------
package com.zx.beans;
​
public class RunBird implements Bird {
    @Override
    public void run() {
        System.out.println("鸟跑了");
    }
}
----------------------------------------------------------------------------
package com.zx.test;
import java.util.Random;
import com.zx.beans.Bird;
import com.zx.beans.FlyBird;
import com.zx.beans.RunBird;
​
public class Test {
    public static void main(String[] args) {
        Bird[] birds = new Bird[20];
        Random r = new Random();
        FlyBird flyBird = new FlyBird();
        RunBird runBird = new RunBird();
        for (int i = 0; i <birds.length ; i++) {
            int number = r.nextInt(2);
​
            if (number==1){
                birds[i]=flyBird;
               // flyBird.run();
            }
            else {
                birds[i]=runBird;
                //runBird.run();
            }
            birds[i].run();
        }
    }
}
​

7.16、内部类

类的内部可以定义另一个类,如果在类Outer的内部再定义一个Inner,此时Inner称为内部类,Outer称为外部类。

1)成员内部类

可以使用修饰符修饰

Ⅰ、访问方法:

外部方法中创建内部类对象,调用内部类方法

外部类.内部类 内部类对象 = 外部类实例.内部类实例

package com.Mar.beans3;
​
public class Outer01 {
    private int age;
    public void out_method(){
        System.out.println("外部类方法");
        Inner inner = new Inner();  //创建内部类对象
        inner.in_method();
    }
    public class Inner{//内部类
        private int id;
        public void in_method(){
            System.out.println("内部类方法");
        }
    }
​
    public class Inner2{
​
    }
}
​
​
package com.Mar.test;
​
import com.Mar.beans3.Outer01;
​
public class OuterTest {
    public static void main(String[] args) {
        Outer01 outer01 = new Outer01();
        //outer01.out_method();
​
        //直接找内部类:外部类.内部类 内部类对象 = 外部类实例.内部类实例;
        Outer01.Inner outerIn01 = new Outer01().new Inner();
        outerIn01.in_method();
        Outer01.Inner outerIn02 = outer01.new  Inner();
        outerIn02.in_method();
    }
}
​

Ⅱ、变量调用

成员内部类中方法中的局部变量,调用外部类或内部类中重名的成员变量:

//方法中的局部变量:变量
//内部类中的成员变量:this.变量
//外部类中的成员变量:外部类类名.this.变量
​
package com.Mar.beans3;
​
public class Outer01 {
    private int age = 30;
    public void out_method(){
        System.out.println("外部类方法");
        Inner inner = new Inner();  //创建内部类对象
        inner.in_method();
    }
    public class Inner{//内部类
        private int id;
        private int age = 20;
        public void in_method(){
            int age = 30;
            System.out.println("内部类方法" + age + " " + this.age + " " + Outer01.this.age);
            //输出顺序:30 20 18
        }
    }
​
    public class Inner2{
​
    }
}
​

2)静态内部类

Ⅰ、访问方法:

package com.Mar.beans3;
​
public class Outer02 {
    private int id;
    public void out_method(){
        System.out.println("外部类方法");
    }
    public static class Inner02{
        public void in_method(){
            System.out.println("内部类方法");
        }
    }
}
​
package com.Mar.test;
​
import com.Mar.beans3.Outer02;
​
public class Outer02Test {
    public static void main(String[] args) {
        //外部类.内部类 内部类对象= new 外部类名称.内部类名称();
        Outer02.Inner02 inner02 = new Outer02.Inner02();
        inner02.in_method();
    }
}
​

3)方法内部类(认识)

package com.Mar.beans3;
​
public class Outer03 {
    private int id;
    
    public void out_method(){
        System.out.println("外部类方法");
        class Inner03{
            private int id;
            
            public void in_method(){
                System.out.println("内部类方法");
            }
        }
    }
}

4)匿名内部类

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值