JAVA基础语法10 多态 下

JAVA基础语法10

笔记 多态 下

  • 问题
    • java只支持单继承
    • 如何解决一个类型中拥有多个不同类型特征

在这里插入图片描述

//接口访问修饰符:public 默认
public interface INet {
	/*接口中抽象方法可以不写abstract关键字
    /*访问修饰符默认public
     * 当类实现接口时,需要去实现接口中的所有抽象方法,否则需要将该类设置为抽象类
     */
	void network();
	
	
	//接口中可以包含常量,默认public static final
	int TEMP=20;
	
    //default:默认方法 可以带方法体 jdk1.8后新增
	//可以在实现类中重写,并可以通过接口的引用调用(Inet.super.connection)
	default void connection(){
		System.out.println("我是接口中的默认链接");
	}
	
	//static:静态方法 可以带方法体 jdk1.8后新增
	//不可以在实现类中重写,可以同接口名调用
	static void stop(){
		System.out.println("我是接口中的静态方法");
	}
  • 当接口中的常量与类中常量重名 如果是接口指向类的实例化,则调用接口中的常量。如果是类指向类实例化则调用类中的常量。
  • 当一个类 继承父类与多个接口的同时有相同的方法名的方法,则调用父类方法不需要重写。但是常量类不占优势 需要指定调用或者重写

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 内部类

在这里插入图片描述

在这里插入图片描述

  • 内部类的分类

    • 成员内部类
    • 静态内部类
    • 方法内部类
    • 匿名内部类
  • 成员内部类

在这里插入图片描述

  • Person
package com.zzh.People;

public class Person {
    int age;

    public Heart getHeart() {

        new Heart().eat();
        return new Heart();
    }

    public void eat() {
        System.out.println("外部类吃东西");
    }

    /*
     * 1、内部类在外部使用时,无法直接实例化,需要借由外部类信息才能完成实例化
     * 2、默认访问权限:只限本包下调用  public:外部包可以调用
     * 3、内部类可以直接访问外部类的成员;如果出现同名属性,优先访问内部类中定义的
     * 4、可以使用外部类.this.成员的方式,访问外部类中同名的信息
     * 5、外部类访问内部类信息,需要通过内部类实例,无法直接访问
     * 6、内部类编译后.class文件命名:外部类$内部类.class
     * 7、内部类中是否可以包含与外部类相同方法签名的方法?以及如何调用?
     * 7、方法:可以拥有相同的方法。同样内部类优先自己的方法,访问外部需要外部类.this.成员的方式
     * 外部访问内部一样需要 Person.Heart myHeart = new Heart().eat();Person person = new Persom()
     * 同时在主函数定义的内部类函数调用的还是内部类的方法。
     *
     */
    class Heart {
        public String beat() {
            Person.this.eat();
            return "心脏在跳动!";
        }
        public void eat() {
            System.out.println("内部类吃东西");
        }
    }
}


  • Test
package com.zzh.People;

public class Test {
    public static void main(String[] args) {
        // 方法一
        Person.Heart person = new Person().getHeart();
        System.out.println(person.beat());
        System.out.println("=======================");

        //方法二
        Person.Heart person1 = new Person().new Heart();
        System.out.println(person1.beat());
        System.out.println("=======================");

        //方法三
        Person person2 = new Person();
        person = person2.new Heart();
        System.out.println(person.beat());
        // 调用的是内部类的eat()
        person.eat();
        System.out.println("=======================");
        // 访问还是内部类的eat()
        Person person3 = new Person();
        person.eat();

    }
}

在这里插入图片描述

  • 静态内部类

在这里插入图片描述

Person

package com.zzh.People;

public class Person {
    int age;

    public Heart getHeart() {
        eat();
        new Heart().eat();
        return new Heart();
    }
    public  void eat() {
        System.out.println("外部类吃东西");
    }
    /**
     * 静态内部类
     * 1、静态内部类中,只能直接访问外部类的静态成员,如果需要调用非静态成员,可以通过对象实例
     * 2、静态内部类对象实例时,可以不依赖于外部类对象 Person.Heart myHeart = new Person.Heart();
     * 3、可以通过外部类.内部类.静态成员的方式,访问内部类中的静态成员
     * 4、当内部类属性与外部类属性同名时,默认直接调用内部类中的成员;
     * 如果需要访问外部类中的静态属性,则可以通过 外部类.属性 的方式;Person.eat();
     * 如果需要访问外部类中的非静态属性,则可以通过 new 外部类().属性的方式;new Person().eat();
     */
    public static class Heart {
        public String beat() {
            new Person().eat();
            return "心脏在跳动!";
        }
        public void eat() {
            System.out.println("内部类吃东西");
        }
    }
}

Test

package com.zzh.People;

public class Test {
    public static void main(String[] args) {
        // 获取静态内部类的对象实例
        Person.Heart myHeart = new Person.Heart();
        System.out.println(myHeart.beat());
    }
}

  • 方法内部类

在这里插入图片描述

在这里插入图片描述

    /**
     * 方法内部类
     * @return
     */
    // 因为Heart 在方法里面,作用范围也在方法内。所有无法使用内部类方法
    public Object getHeart() {
        class Heart {
            public String beat() {
                new Person().eat();
                return "心脏在跳动!";
            }

            public void eat() {
                System.out.println("内部类吃东西");
            }
        }
        // 需要在内部调用,外部无法调用内部类的方法
        return new Heart().beat();
    }
    public  void eat() {
        System.out.println("外部类吃东西");
    }

  • 匿名内部类

在这里插入图片描述

    //根据不同的人 调用不同的方法
    // 方案1:
    public void getRead(Person person){
        person.read();
    }

    public static void main(String[] args){
        PersonTest personTest = new PersonTest();
        // 匿名内部类:没有类型名称以及实例对象名称 
        personTest.getRead(new Person() {
            @Override
            public void read() {
                //。。。
            }
        });
    }

在这里插入图片描述

在这里插入图片描述


  • 在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值