1.继承
概念:面向对象的三大特征之一,用来描述类和类的关系用的
好处:
- 可以抽取子类共性的内容,提高代码的复用性,提高代码维护性,父类中定义非私有的东西,“子类”可以直接使用的!!!
弊端:
- 子类和父类的耦合度增强,父类一旦发生变化,子类不得不一起跟着变化
格式: extends
如:public class Fu{}
public class Zi extends Fu{}
注意:
不能下使用继承,满足 is a 才可以!!!是谁的一种情况才能使用!!!
java只支持单继承,不支持多继承,支持多层继承
1.2 子类可以使用父类的也可以使用自己的
1.21子类的成员变量和父类的成员变量一样
使用的是子类的, 因为遵循了就近原则!!!!!!如果非要访问父类的成员变量,需要使用super关键字
(不重要)因为以后父类的成员变量都会私有化, 是不能直接访问的!!!!!
1.22子类的成员方法和父类的成员方法一样
使用的是子类的, 因为遵循了就近原则!!!!!!如果非要访问父类的成员方法,需要使用super关键字
这种现象称为重写
注意:
我们可以通过@Override来校验是否正确重写, 就算没有这个注解, 如果满足重写的要求也算重写!!!!
1.23子类会默认走父类的构造
系统会默认帮你调用父类的无参构造
因为:子类随时都要使用父类的东西, 所以必须保证父类的数据在堆内存中初始化好才能使用, 所有一定要走父类的构造函数, 而且父类的构造要先走!!!!!!
使用场景
- 一般我们习惯, 子类的无参调用父类的无参, 子类的满参调用父类的满参!!!!!
补充:
this用来调用本类的成员或者构造, 而super是用来调用父类的成员以及构造,当子类中没有的时候,this也能去父类中寻找
2.权限修饰符
2.1final
修饰符, 可以修饰类, 变量, 方法
修饰类
这个类是最终类, 不能在有子类!!! 所有的内容都不能被重写!!!!
修饰方法
这个方法不能重写了!!!!!
修饰变量
修饰局部变量
变量有且只能被赋值一次!!!!! 命名规范一般和普通变量命名规范一致!!!!!!
修饰成员变量
1.变量有且只能被赋值一次!!!!!
2.直接赋值(推荐的)
3.通过构造赋值(极其不推荐!!!!) 必须保证每一个构造都要对final修饰的成员变量赋值才可以!!!!!!
4.命名规范需要大家每个单词每个字母都要大写, 多个单词之间用_隔开!!! 如:int MAX_AGE = 100;
5.被final修饰的变量就是常量!!!!!!
6.使用场景 可以让普通的常量更具备可读性!!!!!!!
2.2static
修饰符 修饰成员变量成员方法
修饰成员变量
- 被这个类所有的对象所共享!!!!!
- 可以使用类名.方式访问
修饰成员方法
- 可以使用类名.方式访问
特点
- 1.随着类的字节码的加载而初始化
- 2.被所有对象所共享,属于整个类共享的数据
- 3.可以直接拿类名去使用, 不需要依附对象, 而且也建议大家通过类名的方式来访问!!!!
- 4.随着类的加载而加载, 随着类而消失, 驻留内存中时间比较长, 用慎用!!!!!!
- 5.静态的只能访问静态
2.3 abstract
抽象的,是一个修饰符 : 可以修饰类和方法
修饰类:
成为抽象类:特点:抽象类无法直接创建对象使用! 因为抽象类中可能含有抽象方法,因为抽象方法是没有方法体的,是一个残缺的方法,残缺的方法不能用!
如何使用抽象类?
- 定义抽象类的子类
- 让子类完成(重写)残缺的方法(抽象方法)
- 创建子类对象来去使用
和普通类的区别
和普通类对比,仅仅只是可以多定义一个东西,就是抽象方法,剩下的和普通类一模一样
修饰方法
抽象方法, 特点: 没有方法体。
注意:有抽象方法的类必须是抽象类
abstract和那些关键字是冲突的
private 例:private abstract void method();
典型错误, 因为private关键字不能被子类直接看到, abstract是强制子类重写, 子类不能重写父类的私有方法!!!!!
final 例:public final abstract void method();
典型错误, final不让子类重写, 而abstract必须要子类重写!!!!!冲突!!!!!
3.多态
概念:面向对象的三大特征之一
特点:
- 父类引用指向子类对象
- 父类 对象名 = new 子类(); 动物 对象名 = new 猫();
前提:
- 必须有继承或者实现关系
- 必须有方法重写 (因为多态只能看到父类的东西,也只能使用父类中定义有的东西,如果子类对方法没有重写的话,干脆创建父类对象得了,多态将毫无意义)
- 必须有父类引用指向子类对象
由于多态格式中即出现了父类也出现了子类,我们需要搞清楚访问的到底是谁?
- 如果直接访问属性,我们看到的父类属性,不能访问子类特有的属性,因为看不到(不重要,以后的父类成员变量会用private修饰)
- 如果访问的功能,我么走的是子类的功能,不能访问子类特有的功能
好处:
经常用来提高方法的扩展性,将父类定义成方法的参数,可以接收其所有的子类
弊端:
多态不能使用子类特有内容!!(方法定义者在定义的时候使用父类类型来接收,他也不知道调用传入的到底是哪个子类,所以只能使用父类中共性内容不能使用特有内容)
如何解决?
用向下转型(不常用,不如直接new子类对象调用)
格式: 子类类型 对象名 = (子类类型) 父类引用
Fu fu = new Zi();
Zi zi = (Zi) fu;
注意事项:必须是还原操作否则会出现错误,java.langClassCastException(类型转换异常)
例如: Animal a = new Cat(); Dog d = (Dog) a;
解决方案 对象instanceof 类型 得到的是一个boolean类型值,判断一个对象是否是某一个类型
4.接口
4.1如何定义接口
public interface 接口名 {
自定义常量
抽象方法(重要的)
默认方法
私有方法
静态方法
}
4.2定义接口内容
可以定义抽象方法
4.3接口的特点
1.由于里面可能含有抽象方法,所以不能直接使用!!
如何使用?
- 定义一个类去实现接口 implements
- 重写它所有的抽象方法
- 使用接口的实现类
2.接口中的成员变量默认被public static final修饰(public static final被省略)
3.接口中没有构造方法函数的概念(构造函数的作用的在堆中对成员变量进行初始化用的)
4.接口中的方法默认被public abstract
5.在jdk1.8及以后可以定义默认方法
[public] default 返回值类型 方法名(参数列表) {
方法体
return 返回值;
}
作用:
接口升级比较难受,于是在jdk1.8的时候可以这样定义默认解决接口升级的问题
使用场景: 只有当接口中的升级方法都一样的话,才会使用默认方法
6.在jdk1.8以后可以定义静态方法
[public] static 返回值类型 方法名(参数列表) {
方法体;
return 返回值;
}
有啥用?
用处非常微小, 废物点心, 我们习惯将静态方法放到类中!
注意事项 接口中的静态方法只能使用接口名访问, 不能使用实现类访问!!!!!!
7.在JDK1.9的时候可以定义私有方法
开发过程中使用的目前都是1.8
他的出现为了抽取默认方法和静态方法的共性内容出现的
4.4类和接口的关系
类和类:单继承, 不能多继承, 但是可以多层继承
类和接口:多实现 (因为接口当初设计的时候只有抽象方法, 抽象方法是没有方法体, 所有没有冲突!所以没有冲突)
接口和接口:多继承
4.5接口和抽象类
抽象类的定义规则和规范的范围是强制所有的"子类" 必须实现(重写)抽象方法
接口的定义规则和规范的范围, 所有的实现该接口的实现类,灵活比较高,可以让类选择性的实现!