Java 第四部分 多态

2020/10/13

Java 基础知识第四部分。

文章目录

面向对象特性 - 多态

多态针对的是对象。

左父右子就是多态。

其实上面这句说的不太合适,它只是一个表象。我一直都不太懂,可能之前看的教程也是这样说的,我也就这样做了笔记。

现在是觉得接口只是各种定义和规范的集合,不参与实际的干活,真正干活的其实都是类。

多态中成员变量访问特点

在多态的代码中,成员方法访问规则:看 new 的是谁,就优先用谁,没有则向上找。

这句话没怎么懂?

使用多态的好处

对象的向上转型

向上转型就是多态的写法。

对象的向下转型

向上转型是安全的。但有一个弊端:对象一旦向上转型为父类,那么就无法调用子类原本特有的内容。

解决方案:用对象的向下转型[还原]

对象向下转型,其实是一个还原动作。

格式:子类名称 对象名 = (子类名称)父类对象

含义:将父类对象还原成为本来的子类对象(类似强制转换!!!!!!!)

instanceof 关键字

如何知道一个父类引用的对象是什么子类?

格式:对象 instanceof 类名称

这将得到一个 boolean 值结果,判断前面的对象能不能当作后面类的实例。

向下转型一定要进行 instanceof 判断,否则可能会发生类转换异常。

一个案例

  1. 接口的基本使用
  2. 对象的上下转型
  3. 使用接口作为方法参数

final 关键字

  1. final 修饰类

    public final class 类名称 {
        // ...
    }
    

    含义:当前类不能有任何子类(太监类)

    注意:一个类如果是 final 的,那么其中所有的成员方法都无法覆盖重写(因为没有儿子,无法继承)

  2. final 修饰成员方法

  3. final 修饰局部变量

  4. final 修饰成员变量

四种权限修饰符

内部类

内部类概念

成员内部类定义

成员内部类使用

  1. 间接方式:在外部类的方法中,使用内部类;然后 main 方法只是调用外部类的方法。

  2. 直接方式

    外部类名称内部类名称 对象名 = new 外部类名称 ().new 内部类名称 (); 
    

内部类的同名变量访问

如果出现重名现象,格式为:外部类名称.this.外部类成员变量

public class Outer {
    int num = 10;

    public class Inner {
        int num = 30;
        public void method() {
            int num = 20;
            System.out.println(num);集合
            System.out.println(this.num);
            System.out.println(Outer.this.num);
        }
    }
} 

局部内部类定义

局部内部类 final 问题

局部内部类,如果希望访问所在方法的局部变量,这个变量必须是有效 final 的

public class MyOuter {
    public void method() {
        final int num = 10;
        class MyInner {
            public void methodInner() {
                System.out.println(num);
            }
        }
    }
}

生命周期不一样。

匿名内部类(重要!)

类作为成员变量类型

String 也是一个类,自己定义的类当然也可以使用。

当然用的时候需要创建对象。