多态、内部类知识点总结。

多态

定义:同一个类实例的相同方法在不同的情形下有不同的表现形式。

  • 方法多态:

方法覆写

方法重载

对象多态性

  • 向上转型(90%):天然发生(认爹)

应用场景:参数统一化

父类 父类引用=子类实例//以物换物
test(new Person());
//per=new Studnet();//子类指向父类
test(new Student());

Person per=new Student();//子类一定可以变成父类 向上转型
per.fun();
  • 向下转型(1%)://剩下1%不转(认儿)
子类 子类引用=(子类)父类实例
Student stu=(Student)per;//向下转型

需要强转,发生向下转型之前,一定首先发生向上转型

否则会抛出一个ClassCastException运行时异常,类型转换异常,发生在两个毫无关系的类之间强转时

引用对象 instanceof类:

定义:表示该引用能否指向该类,返回true可以指向,返回false不能指向

标准格式:

if(!(per  instanceof Student)){//没有指向该类
per=new Student();
}
Student stu =(Student)per;

应用场景:发生在父类引用需要调用子类扩充的方法时,才发生向下转型变为子类引用调用其扩充方法

无论是向上转型还是向下转型,本质在于发生了方法覆写(多态的本质)

内部类

将内部类视为属性来看待(本质)

定义:所谓的内部类就是在类的内部进行了类结构的嵌套操作

  • 内部类优点:

1.内部类与外部类可以访问彼此的私有属性(内部类直接访问,外部类通过内部类对象访问)

2.使用内部类可以实现多继承的概念

 

class A{}

class B{}

class C{

class D extends A{}

class E extends B{}

}

  • 内部类可以对外部完全隐藏(内部类的保护性)私有内部类
class Outter{  
  //Inner类只能在Outter中使用,并且在Outter外部完全隐藏   
 private class Inner{
} } 
  • 内外部类的关系

1.成员内部类的创建需要依赖外部类对象,先有外部类对象才可以产生成员内部类

2.内部类是一个相对独立的个体,与外部类不是is-a关系

3.内部类可以直接访问外部类的元素(所有属性和方法),外部类可以通过访问内部类对象间接访问内部类元素

eg.人和心脏的关系——

  • 分类

根据内部类的定义的位置以及关键字一共分为以下四种内部类

成员内部类(普通内部类)

——类比普通属性/方法

定义:直接定义在外部类之中,不加static修饰符

  • 外部类的外部创建成员内部类语法:
外部类.内部类 内部类名称=new 外部类().new 内部类();
 Outter.Inner in=new Outter().new Inner(); 

成员内部类的限制:

  • 成员内部类可以访问外部类的静态属性
  • 成员内部类不能拥有静态域(静态方法和属性都不行)-能访问不能拥有

静态内部类

——类比静态属性/方法

定义:直接定义在外部类之中,加static修饰符

静态内部类只是包在外部类内部而已,除此之外和普通类没有任何区别,不再需要外部类对象。

static public int age=20; 
  • 在外部类外部创建静态内部类语法:
外部类.内部类 内部类名称=new 外部类.内部类();
 Outter.Inner in=new Outter .Inner(); 

静态内部类限制:

静态内部类能否拥有普通属性?能拥有普通,但是不能访问外部类的普通属性(没有外部类对象)

方法内部类

定义在外部类的方法中,不加任何修饰符,与普通内部类基本一致,只是作用域不同。

class Outter{
    private int num=0;
    public void test(int data){
        class Inner{
            public void fun(){
                num++;
                System.out.println(num);
                System.out.prinln(data);
            }
        }
    }
}

方法中若存在内部类,方法形参使用隐式final声明(JDK8后)JDK8之前用显式,因此方法内部类只使用形参而无法修改方法形参的值

方法内部类不能使用任何权限修饰符 public private protected

匿名内部类(抽象类)//简化代码

匿名内部类等同于方法内部类,就是没名字而已,除此之外和方法内部类完全一致

但是匿名内部类必须继承一个抽象类,或者实现一个接口。

abstact class Person{
    public abstract void print();
    //抽象类内部提供了一个很好的子类
    public static Person getInstance(){
        //匿名内部类
        //等同于class extends Person
        return new Person(){
            public void print(){
                
            };
        }
    }
}

 

    原文作者:一粒种子。
    原文地址: https://blog.csdn.net/weixin_42645168/article/details/88363426
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞