Java面向对象的四个特征
Java面向对象具有以下四个主要特征:抽象(abstract)、继承(inherutance)、封装(Encapsulation)、多态(Polimorphism)。
抽象(abstract)
抽象是从众多的事物中抽取其共同的、本性的特征,而忽略其非本质的特征的过程。
抽象把对象的属性和方法罗列出来,忽略具体的代码实现,只关注对象的本质特征。
- 在方法前加上 abstract 关键字,去掉大括号,直接分号结束,就成了抽象方法。
- 抽象方法所在的类,必须是抽象类。
- 在class前面写上 abstract 就是抽象类。
- 不能创建抽象类对象,只能创建其子类且非抽象的对象。
- 抽象类可以有构造方法,是提供子类创建对象时,初始化父类成员使用的,例如super()。
- 抽象类不一定包含抽象方法,但是有抽象方法的类必须是抽象类。
- 抽象类的子类必须重写抽象父类中所有的抽象方法,除非子类也是抽象类。
封装(Encapsulation)
- 封装隐藏实现细节,对外提供方法或接口,防止内部代码和数据被外部访问,实现代码的高内聚和低耦合。
- 外部只需要调用需要的方法或接口,无须关注其具体的实现过程,其实现过程发生改变也不会印象外部使用。
- 通常用 private 修饰屏蔽外层无须关注的变量和方法,用 public 修饰开放外层可调用的变量和方法。(访问权限可查看 Java修饰符)
继承(inheritance)
基于父类(基类、超类)创造子类(派生类),子类拥有可从父类继承下来的内容。
继承主要解决的问题就是共性抽取。
访问成员变量的两种方式
直接通过对象名称访问成员变量:看等号左边是谁,优先用谁,没有则向上找。
// 个人简写笔记,并非代码格式 父类:{num:10} 子类:{num:20,age:18} 父类 f = new 子类(); f.num:10 f.age: 报错间接通过成员方法范文成员变量:看该方法属于谁,优先用谁,没有则向上找。
// 个人简写笔记,并非代码格式 父类:{num:10,getNum->num} 子类:{num:20,getNum->num} 父类 f = new 子类(); f.getNum:20 // 如果子类没有覆盖重写getNum方法,则返回父属性=10
区分成员变量的三种调用方式
- 局部变量:直接写成员变量名
- 本类的成员变量:this.成员变量名
- 父类的成员变量:super.成员变量名
访问成员方法的规则
- 创建的对象是谁(等号左边),优先用谁,如果没有则向上找。
重写(Override):父子类方法的名称一样,参数列表页一样。覆盖父类方法。
- 必须保证父子类之间的方法名称相同,参数列表页相同。
- @Override:写在方法前面,用来检测是不是有效的覆盖重写。
- @Override 这个注解就算不写,只要满足要求,也是有效的覆盖重写。
- 子类方法的返回值必须小于或等于父类方法的返回值范围。
- 例如父类返回 Object,子类返回 String,String 是 Object 的子类。
- 子类方法的权限必须大于或等于父类方法权限修饰符。
- 修饰符权限:public > protected > (default) > private。
- (default) 不是关键字 default,而是什么都不写。
- 必须保证父子类之间的方法名称相同,参数列表页相同。
重载(Overload):方法的名称一样,参数列表不一样。
父子类构造方法的访问特点
- 子类构造方法当中有一个默认隐含的 "super()" 调用,所以一定是先调用父类构造,后执行子类构造。
- 子类可以通过 super 关键字来调用父类重载构造。
- 子类构造方法中 super 的父类构造调用,必须是第一行语句。
- 子类构造方法不能调用多次 super 构造。
多态(Polimorphizm)
一个对象拥有多种形态,这就是对象的多态性。
例如:人类(父类),学生(子类),小明同学是一个学生,同时也是一个人,小明这个对象拥有 “学生” 和 “人” 这两种形态。
extends(继承)或者implements(实现),是多态性得前提。
代码体现格式:
* 父类名称 对象名 = new 子类名称(); * 接口名称 对象名 = new 实现类名称();
对象的向上转型格式:父类名称 对象名 = new 子类名称();
对象的向下转型格式:子类名称 对象名 = (子类名称)父类对象;
可用 instanceof 判断对象属于什么子类。"对象 instanceof 类" 会返回boolean值,如果对象属于指定类则返回true。
