面向对象三大特征:封装继承多态
面向对象三大特征:
1. 封装: 属性 方法 私有化 get set 人妖 : 男 女
2. 继承 :(多态,抽象,接口,匿名内部内)
3. 多态
继承:
目前存在的问题:
1. 目前没有把动物类与鸟类的继承关系描述清楚。
2. 动物类与鸟类的代码重复。
继承的格式:
class 类名1 extends 类名2{
}
继承要注意的细节:
1. 子类可以继承父类的成员,但是千万不要为了减少重复代码而且继承,只有
真正存在继承关系的情况下才去继承。
2. 父类私有的成员是不能被继承的。
3. 父类的构造方法也是不能被继承的。
4. 创建子类对象时默认会先调用父类的无参的构造函数。
super关键字:
super关键字代表的是父类的引用空间。
super关键字的作用:
1. 如果子父类存在着同名的成员时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员。
2. 创建子类对象时,默认会先调用父类无参的构造函数, 通过super关键字可以在子类的构造函数中指定调用父类的构造函数。
super调用父类的构造函数要注意的细节:
1. super关键字调用构造函数的时候,必须是构造函数中的第一个语句。
2. super、this关键字调用调用构造函数的时候,不能同时出现在同一个构造函数。(因为两个都需要是第一个语句)
父类的功能无法满足了子类的需求,这时候我们需要进行方法 的重写。
方法重写的前提: 必须存在继承的关系。
方法的重写:子父类存在着同名的函数称作为方法的重写。
方法重写要求:
1. 方法重写时,子父类的函数名与形参列表必须一致。
2. 方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。
3. 方法重写时,子类的返回值类型必须小于或者等于父类 的返回值类型。
4. 方法重写时, 子类抛出的异常类型必须小于或者等于父类抛出的异常类型。
方法重载: 在一个类中存在两个或者两个以上的同名函数称作为方法重载。
方法的重载要求:
1. 函数名一致,
2. 形参列表不一致(形参的个数或者是形参对应的类型不一致)
3. 与返回值类型无关。
instanceof关键字: 判断一个对象是否属于指定的类型。
instanceof关键字的使用前提: 判断的对象与指定的类型必须存在继承的关系,或者是实现的关系。
instanceof关键字的使用格式:
对象 instanceof 类名
instanceof关键字的作用: 学习完多态之后才有作用。做类型转换 之前先判断,否则容易报错。
instanceof:不是同级的
final(最终)
final关键字要注意的细节 :
1. final关键字修饰一个基本类型变量时, 该变量不能重新赋值。
2. final关键字修饰一个引用类型变量时,其引用重新指向新的对象。
3. final修饰一个方法时,该方法不能被重写。
4. final修饰一个类的时候,该类不能被继承。
常量的修饰符: public static final.
常量命名规范: 所有字母大写,单词与单词之间使用下划线分隔 。
abstract(抽象)
需求:描述一个动物、狗、鸟三个类。
问题:
1. 动物类的run方法描述得有问题。
2. 要重写run方法。
没有强制子类一定
抽象类的应用场景:
描述一类事物的时候,发现该事物确实存在着某种行为,但是目前该行为是不具体的,
那么这时候我们应该抽取该方法的声明,不去实现该方法,这时候我们应该使用抽象类。
抽象类要注意的细节:
1. 如果一个方法没有方法体,那么该方法必须使用abstract修饰。
2. 如果一个类有抽象的方法,那么该类也必须使用abstract修饰。
3. 非抽象类继承抽象类的时候,必须要把抽象类中的所有抽象方法全部实现。
4. 抽象类可以定义抽象方法以及非抽象方法。
5. 抽象类是可以不存在抽象方法的。
6. 抽象类不能创建对象。
疑问: 为什么抽象类不能创建对象呢?
因为抽象类一旦创建了对象就可以使用对象去调用方法了,一旦调用了抽象方法就没有任何的意义了。
7. 抽象类是存在构造方法的。
疑问:既然抽象类不能创建对象,那么存在构造方法的意义在那?
抽象类的构造方法是留给子类调用初始化从父类继续下去的成员变量的。
abstract不能与以下关键字配合使用:
1. abstract 不能与private配合使用。
2. abstract 不能与final关键字配合使用。
3. abstract 不能与static关键字配合使用。static修饰的方法可以通过类名调用
接口?? usb接口...
拓展功能..
接口的定义格式:
interface 接口名{
}
实现接口的格式:
class 类名 implements 接口{
}
接口要注意的细节:
1. 接口其实是一个特殊的类。
2. 接口中的成员变量都是属于常量,默认的修饰符 public static final.
3. 接口中的方法都是抽象 的方法, 默认的修饰符: public abstract 。
4. 接口是不能用于创建对象。
5. 接口是没有构造方法的,因为接口中的变量都是常量,接口中方法都是抽象 的方法。
6. 一个非抽象类实现一个接口时,必须实现接口中的所有方法。
接口与类之间的关系:实现关系.
要注意的细节:
1. 非抽象类实现一个接口时,必须要把接口中所有方法实现。
2. 一个类可以实现多个接口。
疑问: java支持多实现,为什么不支持多继承呢?
因为如果支持多继承的话,假设多个父类中有相同的成员,那么其子类就不搞清楚到底使用哪个父类的同名成员了.
3. 抽象类实现接口的时候, 可以实现接口中的方法,也可以不实现接口中的方法。
接口与接口之间关系:
面向对象三大特征:
1. 封装
2. 继承
3. 多态.
多态: 父类引用类型变量指向了子类的对象
或者是接口的引用类型变量指向了接口实现类的对象。
(一个对象具备多种形态)
多态的前提: 必须存在继承或者实现关系。
多态要注意的细节:
1. 多态情况下,子父类存在着同名的成员变量时,默认会访问父类的成员变量。
2. 多态情况下,子父类存在着同名的非静态函数时,默认是访问子类的成员函数。
3. 多态情况下,子父类存在着同名的静态函数时,默认是访问父类的成员函数。
4. 多态情况下,不能访问子类特有的成员。
总结: 多态情况下,子父类存在同名的成员时, 默认都会访问父类的成员.只有存在非静态的
同名函数时,才是访问子类的成员。
多态: 父类的引用类型变量指向了子类的对象 或者是接口的引用类型变量指向了接口实现类对象。
多态的前提: 必须存在继承或者实现关系。
多态要注意的细节:
1. 多态情况下,子父类存在同名的成员变量时,默认是访问父类的成员变量。
2. 多态情况下,子父类存在同名的非静态成员函数时,默认是访问子类的成员函数。
3. 多态情况下,子父类存在同名的静态成员函数时,默认是访问父类的成员函数
4. 多态情况下,不能访问子类特有的成员。
多态情况下,不能访问子类特有的成员。
多态情况下如果需要调用到子类特有的成员,那么需要进行强制类型转换。
基本数据类型:
小数据类型----->大数据类型 自动类型转换
大数据类型----->小数据类型 强制类型转换。
引用数据类型转换:
小数据类型----->大数据类型 自动类型转换
大数据类型----->小数据类型 强制类型转换
实现关系下 的多态 : 接口的引用类型变量指向了接口实现类的对象。
多态的前提: 存在继承或者实现的关系。