天天看点

浅谈面向对象思维面向对象:三:多态:

面向对象的三大特性:封装性、继承性、多态性

1.方法就是一种封装

2.关键字private也是一种封装

封装就是将一些细节信息隐藏起来,对于外界不可见

一旦使用了private进行修饰,那么本类中可以随意访问,但是超出了本类的范围就不能再访问了

可以通过间接访问的方式,自定义一对儿Getter/Setter方法,必须叫 setXxx 或者是 getXxx

对于Getter来说,不能有参数,返回值类型和成员变量对应

对于Setter来说,不能有返回值,参数类型和成员变量对应

布尔类型的特殊情况

当方法的局部变量和类的成员变量重名的时候,根据就近原则,优先使用局部变量,如果需要访问 本类当中的成员变量,需要使用格式:this.成员变量

通过谁调用的方法,谁就是this

构造方法是专门用来创建对象的方法,当我们使用关键字new来创建对象的时候,其实就是在调用构造方法

注意事项:

一个标准的类通常拥有下面的四个部分:

继承是多态的前提,如果没有继承,就没有多态

继承解决的主要问题就是:共性抽取

定义类时的两个注意事项:

成员变量时直接定义在类当中的,在方法外面

成员方法不要写static关键字

直接通过子类对象访问成员变量

等号左边是谁,就优先使用谁,没有则向上找

间接通过成员方法访问成员变量

直接使用的方法中的变量

this.变量名:调用本类中的成员变量

super.变量名:调用父类中的成员变量

在父子类的继承关系当中,创建子类对象,访问成员方法的规则:创建的对象是谁,就优先使用谁,如果没有则向上找

注意:无论是成员方法还是成员变量,如果没有都是向上找父类u,绝不会向下找子类

重写:方法的名称一样,参数列表也一样,覆盖、覆写

重载:方法的名称一样,参数列表不一样

方法的覆盖重写特点:创建的是子类对象,则优先用子类方法

方法覆盖重写的注意事项:

必须保证父子类之间的方法名称相同、参数列表也相同

@Override:写在方法前面,用来检测是不是有效的正确覆盖重写,这个注释就算不写,只要满足要求,也是正确的覆盖重写

子类方法的返回值必须小于等于父类方法的返回值范围。Object类是所有类的父类

子类方法的权限必须大于等于父类方法的权限修饰符。public > protected > (default) > private 注意:(default)不是关键字default,而是什么都不写,留空

继承中方法的覆盖重写应用场景

子类构造方法当中有一个默认隐含的 "super()" 调用,所以一定是先调用的父类构造,后执行的子类构造

子类构造可以通过super关键字来调用父类重载构造

super的父类构造调用,只能是第一个语句 ,不能一个子类构造调用多次super构造

子类必须调用父类构造方法,不写赠送super() 写了则用写的指定该的super调用,super只能有一个,还必须是第一个

在子类的成员方法中,访问父类的成员变量

在子类的成员方法中,访问父类的成员方法

在子类的构造方法中,访问父类的构造方法

在本类的成员方法中,访问本类的成员变量

在本类的成员方法中访问本类的另一个成员方法

在本类的构造方法中,访问本类的另一个构造方法

注意:

在第三种用法中要注意:this(..)调用必须是构造方法的一个语句,唯一一个

super和this两种构造调用,不能同时使用

Java语言继承的三个特点:

一个类的 直接父类只能有唯一一个

Java语言可以多继承

一个子类的直接父类是唯一的,但是一个父类可以拥有很多个子类

浅谈面向对象思维面向对象:三:多态:

extends继承或者implements实现,是多态的前提。

小明这个对象既有学生形态,也有人类形态。一个对象拥有多种形态,这就是:对象的多态性

浅谈面向对象思维面向对象:三:多态:

代码当中体现多态性,其实就是一句话:父类引用指向子类对象

格式:

父类名称 对象名 = new 子类名称()

接口名称 对象名 = new 实现类名称()

访问成员变量的两种方式:

直接通过对象名称访问成员变量,看等号左边是谁,优先用谁,没有则向上找

间接通过成员方法访问成员变量,看该方法属于谁,优先用谁,没有则像上找

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

注意:编译看左边,运行看右边

对比一下

成员变量:编译看左边,运行还看左边

成员方法:编译看左边,运行看右边

浅谈面向对象思维面向对象:三:多态:

对象的向上转型,其实就是多态写法

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

含义:右侧创建一个子类对象,把它当作父类来看待使用

向上转型一定是安全的,从小范围转到了大范围

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

类似于:double num = 100 正确 int----double 自动类型转换

浅谈面向对象思维面向对象:三:多态:

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

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

含义:将父类对象,还原成为原本的子类对象

必须保证对象本来创建的时候,就是猫,才能向下转型成为猫

如果对象创建的时候本来不是猫,现在非要向下转型成为猫,就会报错

类似于:int num = (int) 10.0 正确 int num = (int) 10.5 错误,发生精度损失

浅谈面向对象思维面向对象:三:多态: