继承
class 父类 {
}
class 子类 extends 父类 {
}
继承的方式
单继承:A extends B
链条继承:A extends B; B extends C
多对一继承:A extends X; B extends X
Java 不允许多继承,但是可以多继承接口
继承的特点
子类拥有父类的属性、方法,除了private方法和属性
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展
子类可以用自己的方式实现父类的方法
super关键字
可以通过super关键字来实现对父类成员的访问。
this关键字
指向自己的引用。
final关键字
final 关键字声明类可以把类定义为不能继承的,即最终类
或者用于修饰方法,该方法不能被子类重写
封装
方法:将代码的实现隐藏起来,对外只提供接口
多态:通过抽象类或接口,对外只提供API
包和JAR:把类中所有元素的实现方式隐藏,对外只提供接口
权限:访问修饰符现方式
多态
概述
同一个行为具有多个不同表现形式的能力
程序中引用变量,指向不同的实现
举例
儿子不光有父亲的一些特性。在这个基础上,儿子又有自己的特性
在同一个事情上,儿子有父亲的处理方式,也可以有自己的处理方式
通过该引用变量,具体指向哪个对象,在写代码时并不确定
而是在程序运行期间才确定
在程序运行过程中,通过动态创建的对象的方法表,来定位方法的方式
我们叫做 动态绑定机制 也是多态的体现
在编译阶段就能够确定调用哪个方法的方式,我们叫做静态绑定机制
new一个类赋值给对象,就是静态绑定
重写(Override)
重写(Override)是子类对有权限的父类方法的实现,进行重新编写的过程
返回值和参数列表都不能改变
即外壳不变,核心重写
重写的好处在于子类可以根据需要,定义特定于自己的行为
也就是说子类能够根据需要实现父类的方法
重写的要求是:两同、两小、一大
两同:方法名、参数列表相同
两小:
1、引用类型中,子类返回值的类型,必须是父类返回值类型的子类。基本类型中,返回值类型必须完全一致
2、子类抛出的异常类型,要小于父类抛出的异常类型
一大:子类的权限修饰符,要大于等于父类的权限修饰符
抽象类
抽象类:
抽象类是不能实例化的类,必须被继承,才能被使用
用abstract修饰,目的是为了代码重写
类里面的成员变量、成员方法、构造方法和普通类一样
在Java中抽象类表示的是一种继承关系
一个类只能继承一个抽象类,而一个类却可以实现多个接口
public abstract class Animal{
}
抽象方法:
如果想设计一个类,不设定类里方法的实现
想让它的方法实现,由子类完成,那么就可以设置抽象方法
abstract 关键字同样可以用来声明抽象方法
抽象方法只包含一个方法名,而没有方法体
方法名后面直接跟一个分号,而不是大括号
public abstract class Animal{
public abstract void Say();
}
如果一个类包含抽象方法,那么该类必须是抽象类
任何子类必须重写父类的抽象方法,或者声明自身为抽象类
接口
作用在于将API的定义和代码实现进行分离
接口和类很像,但不是类
接口的写法
1、接口没有构造方法
2、接口中所有的方法必须是抽象方法,不能在接口中写实现
3、一个实现接口的类,必须实现接口内所描述的所有方法
否则就必须声明为抽象类
4、接口的变量,会被隐式的指定为public static final变量
5、接口中的方法也是隐式抽象的,声明时不需要abstract关键字
6、支持多继承,其实不是继承,而是实现
接口的特点
1、不能实例化,但是可以被实现
2、接口的字节码,也是保存在.class中
3、只能是 public abstract,其他修饰符都会报错
接口的定义
public interface Animal{
public void eat();
}
接口的实现
public class Cat implements Animal{
}
转型
向上转型
一个子类类型安全地变为父类类型的赋值,被称为向上转型(upcasting)
父类 f = new 子类();
向下转型
把一个父类类型强制转型为子类类型,就是向下转型(downcasting)
Java中的一个双目运算符,用来测试一个对象是否为一个类的实例。
Person p = new Student();
System.out.print(p instanceof Student);