内部类


1、多态
1)、两种表现形式:
a、一个对象,多种形态。
同一个对象,在不同场合下,
表现出不同的形态,能完成不同的功能。

    在java中,往往使用implements关键字,实现多个接口。

    //同一个人
    CC peo = new CC();
    
    //同一个人,在不同的场合,表现出不同的形态
    //不同角色,表现的行为也不一样。
    Teacher teacher = peo;
    teacher.teach();//老师可以讲课
    
    Father father = peo;
    father.talkToSon();//父亲教育孩子
    
    Husband husband = peo;
    husband.giveMySalary();//丈夫上交工资

b、多个对象,同一形态。
    不同对象,向上造型成同一种类型。
    实现相同的功能。
    
    在java中,往往使用extends关键字,继承同一个父类。

    Tiger tiger = new Tiger();
    tiger.name = "小王";
    
    Snake snake = new Snake();
    snake.name = "莽山烙铁头";
    
    Lion lion = new Lion();
    lion.name = "东北狮王";
    
    //不同对象,表现出同一种形态。
    Animal animal1 = tiger;
    Animal animal2 = snake;
    Animal animal3 = lion;

2、引用类型强制类型转换
回顾:基本类型强制类型转换
long l = 1000;
int i = (int)l;
byte b = (byte)i;//溢出

Animal animal = new Tiger();
animal.name = "小王";
    
//引用类型强制类型转换
Lion lion = (Lion)animal;//错误,会导致类型转换异常ClassCastException

instanceof关键字:
可用于在引用类型转换之前,实现类型判断。
符合转换匹配的类型,方能实现强制类型转换。

有效的避免了引用类型转换异常的发生。

语法:
大类型 大类型引用 = new 小类型();

if(大类型引用 instanceof 小类型){//类型判断
    //类型匹配
    小类型 小类型引用 = (小类型)大类型引用;
}
    
//引用类型强制类型转换
Lion lion = (Lion)animal;//错误
改造成
if(animal instanceof Lion){
    //只有匹配才能进来
    Lion lion = (Lion)animal;
}

3、方法重写要求:
a、发生在子父类之间
b、方法名相同、参数列表相同
c、访问权限不能变小
d、抛出异常不能变大
e、返回值类型可以是本类或其子类

********************** pm ************************
1、内部类
class:类
class:实体类
abstract class:抽象类

1)、内部类
定义在类内部的类,称为内部类。
类内部:
类体、方法体。

2)、内部类定义
外部类:定义了内部类的类。
内部类:定义在外部类中的类。

class Outer{//外部类
    class Inner{//内部类

    }
}
只要是类,类中可定义:成员变量、方法、静态块。

3)、内部类的使用
a:创建内部类对象
step1:先创建外部类对象。
step2:再通过外部类创建内部类对象。

b、在外部类外面
对内部类属性使用、方法调用
与普通类的属性使用、方法调用一致。
通过引用.属性,引用.方法

c、内部类中(**注意)
调用内部类属性:this.属性;
调用外部类属性:外部类名.this.属性;

4)、内部类意义
封装在内部类的中代码,不可以直接访问,必须先创建
外部类对象,通过外部类对象创建内部类对象,才能访问。
一定程度上,起到了代码保护效果。

PS:普通内部类很少使用。

2、匿名内部类
1)、匿名内部类

    class Outer{//外部类
        class {//匿名内部类??????
}
    }
上述定义是错误的。

2)、匿名内部类定义
某个类的匿名内部类,并非直接在类中定义。
在外部类对象创建的时候定义。
step1:先创建外部类对象
OuterClass outer = new OuterClass();
step2:在外部类创建对象的()与;中间,
添加一对{},则{}即为匿名内部类类体。
step3:匿名内部类中可以定义属性、方法。

3)、匿名内部的使用。
匿名内部类属性,只能在匿名内部类中使用。

匿名内部类的方法,无法直接“调用”。
   只能通过匿名内部类重写外部类的方法,才能调用。

4)、****什么时候使用匿名内部类?
抽象类、接口都是无法实例化的。

抽象类 引用 = new 抽象类();//不可以
接口 引用 = new 接口();//不可以

如何实现抽象类、接口的“实例化”?
    都是先让实体类继承抽象类,实现类实现接口,
    然后通过向上造型方式,完成抽象类、接口的“实例化”。
    抽象类 引用 = new 实体类();//可以
    接口 引用 = new 实现类();//可以
    
如果抽象类的实体类、接口的实现类,极少使用,
那作为单独一个类出现就没有多大意义。

实体类、实现类就可以通过匿名内部类方式来实现。

2、封装
封装不是单纯的知识点,而是一种思想。
方法:对特定功能代码的封装
类:对具有相似特征,相同行为的对象群体的封装。
对象特征 → 类的属性
对象行为 → 类的方法

子父类:对继承、公有代码的封装。
抽象方法:对没有具体实现的方法进行封装。
抽象类:对具有抽象方法的类、对代码需要保护的类的封装。
接口:对规范、标准的封装。
内部类:对代码保护封装
匿名内部类:对抽象类的实体类、接口的实现类的封装。

单独“封装知识点”:
对于私有属性、私有方法,进行封装。

step1:采用private访问权限修饰。
    对属性、方法,起到只能在本类中才能使用。

step2:属性赋值
      方式一:
    通过构造方法,创建对象的同时,
    给私有属性赋值。

      方式二:
    当属性添加private访问权限时,则需要
    对外提供统一的赋值、取值的方法入口。

    赋值:set方法
    取值:get方法

step3:编写set、get方法
    a、set方法:
    private String name;

    public void setName(String name){
        this.name = name;
    }

    b、get方法:
    public String getName(){
        return this.name;
    }


步骤:
1、对私有属性进行private私有化操作。
2、对私有属性向外提供统一的入口方法:set、get方法

为什么要私有化操作:
    提高代码的安全性。

你可能感兴趣的:(内部类)