java--多态,内部类

*多态

1.* 多态的前提是向上造型
向上造型即父类型引用 指向 子类型对象
例如: MyInterfaceA a = new MyInterfaceAImpl();
Object o = new MyInterfaceAImpl()
2.编译器编译时看等号左边类型,JVM运行时看等号右边类型
3.ClassCastException: 类型转换异常
解决方案: 转换之前先判断引用 实际上是不是要转换的类型对象
引用a instanceof 子类型 => boolean

例如:判断b是否为Dog,若果是,执行下面语句,不是,就不执行

if (b instanceof Dog) {
    Dog dog = (Dog) b;
    dog.watchHouse();
}

问 a 实际上是不是子类型对象
## 内部类
1. 种类: 成员内部类,静态内部类,局部内部类[匿名内部类]
匿名内部类也是局部内部类中的一种
2.成员内部类:权限 public,protected,(default),private
语法: public class Outer{
// …
public class Inner{
//…
}
}
3.使用:
内部类中, 可以随意使用外部类成员
外部类中, 使用内部类成员时需要创建内部类对象

public class Body {
        //定义一个私有的整型变量a
        private int a = 1;
        //创建一个公共方法walk
        public void walk () {
            System.out.println("走路走的累死了");
          //在外部类当中创建内部类对象Heart,引用heart来调用内部类当中的方法beat
            Heart heart = new Heart();
            heart.beat();
        }
        //在外部类当中创建一个内部类
        public class Heart {
            //在内部类中定义整型变量b
            int b;
            //定义了整型变量a并初始化
            int a = 2;
         //创建内部类的方法beat
            public void beat() {
                System.out.println("心脏跳动剧烈了起来");
                 System.out.println(Body.this.a);
            }
            

无关类中, 使用内部类成员
1.间接调用, 在外部类方法中调用内部类方法
main方法中, 调用外部类方法
2.直接调用, 需要创建内部类对象
外部类.内部类 a = new 外部类().new 内部类();

public static void main(String[] args) {
    //在无关类当中新建外部类的对象
     Body body=new Body();
     //用引用body直接调用外部类中的方法walk,这样间接调用了内部类的方法beat
      body.walk();
      
      //下面两句是直在无关类当中
      Body.Heart heart=body.new Heart();
      heart.beat();

内部类和外部类有同名成员变量
外部类的成员变量: 外部类.this.变量
内部类的成员变量: this.变量
(同第一张图下边可见)
4.局部内部类: 在方法内部定义类, 只在方法中有效
在局部内部类中, 使用局部变量, 必须是final的
JDK8 后, 局部变量事实上没有发生改变, 那么final可以省略
一次性的类, 只能用一次
而且不能使用权限修饰符
5.局部内部类,需要类只使用一次,优化之后就是匿名内部类了
6.匿名内部类:作用就是继承抽象类或实现接口
语法: new 接口/抽象类() {
int a;
// 实现的所有抽象方法
}
匿名内部类, 只能用一次, new一个对象
匿名对象, 只能使用一次, 只能调用一次方法
注意: 匿名内部类 和 匿名对象 不是一回事 ! ! !
7.实现匿名内部类

//实现了一个匿名内部类
public static void main(String[] args){
    Demo06 impl  = new Demo06() {
        @Override
        public void method1() {
            System.out.println("内部类实现1");
        }

        @Override
        public void method() {
            System.out.println("内部类实现2");
        }

    };
    //引用impl去调用两个方法
    impl.method1();
    impl.method();
}

接口当中定义抽象方法

public interface IntearfaceB {
    //在接口中定义两个抽象方法
    void method1();
    void method();
}

8.静态内部类

public class Outer {
    //定义一个外部类的成员变量
    int a=10;
    //定义一个外部类的静态成员变量
    static int b=20;
    //创建公共方法m1
    public void m1(){
        //输出成员变量a
        System.out.println(a);
    }
     //创建一个静态内部类
    public  static  class Inner{
        //定义一个静态内部类的成员变量c
        int c=1;
        //创建公共方法m2
        public void m2(){
            System.out.println(c);
            //由于a是在外部类中定义出来的成员变量,而b是定义的静态成员变量,所以a是属于对象,b是属于类的。
            //System.out.println(a);
            System.out.println(b);

        }

9.父类可以作为返回值或者参数
用Animal举例

//Animal作为返回值类型,该方法可以返回多种不同的参数
public Animal salePet() {
    //
    return null;
}

//Animal作为参数,可以传递多种不同的对象
public static void giveMePet(Animal b) {
    //把参数b传递给了dog
      //用dog去调用watchHouse方法
        //Dog dog = (Dog) b;
        //dog.watchHouse();
     //上面两句合并成一句
        ((Dog)b).watchHouse();


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值