继承
继承也是来源于现实中的概念,
-
继承是一种类与类之间的关系
-
使用已存在的类的定义作为基础建立新类
父类(基类) 子类(派生类)
-
新类的定义可以增加新的属性或新的功能,也可以用父类的功能,但不能选择性的继承父类(要继承就全都要继承)
-
继承关系
满足 A is a B的关系,就可以形参继承关系
继承的实现
- 继承关键字 extends
子类xx extends 父类xxx - java中是单继承,即一个子类只能有一个父类
- 子类只能继承父类中的非private成员
- 子类可以直接访问父类的非私有成员
- 父类无法访问子类特有的成员,哪怕是public的
方法重写
- 要在有继承关系的子类中
- 方法名、参数列表、方法返回类型都要和父类相同
- 重写方法访问权限必须大于等于父类方法。访问修饰符的访问范围需要大于等于父类的范围,(注意:不写访问修饰符就是默认,在四种修饰符里排第二!)
- 与方法参数名无关
- 当子类重写了父类的方法后,子类就会调用自己重写后的方法
- 子类可以定义和父类重名的属性,当属性被调用时,优先调用子类该名字的属性
- 静态方法和最终方法不能被重写;但静态方法在子类中可以通过隐藏父类方法的方式重新实现。
- 重写方法的返回值应该与父类方法相同或者是父类方法返回值的子类;
- 在子类中可直接对继承自父类的方法进行重写操作,不必再重载一次
访问修饰符
- 私有的 private
- 只允许在本类中访问
- 默认 (什么都不写)
- 当前类可调用,
- 同包子类、非子类可调用
- 跨包不允许调用,哪怕是子类
- 受保护的 protected
- 当前类可调用
- 同包子类,非子类可调用
- 跨包子类可调用
- 共有的 public
- 允许在任意位置访问
super关键字
- 子类内如果没有重写方法,可以直接调用父类方法;
- 子类内如果有父类重写方法,想调用父类的必须要用super.;
- 子类继承了父类的属性和方法,super可以引用父类一切公开属性和成员方法;
- 父类的构造方法不允许被继承和重写的;
继承的初始化顺序
- 父类的静态成员
- 子类的静态成员
- 父类对象的构造(构造代码块,构造方法)
- 子类对象的构造
- 访问修饰符对成员加载顺序不影响
- 加载顺序与代码的前后位置有关:
- 子类构造默认调用的是父类的无参构造,如果这时父类没有无参就会报错。
可以用super关键字调用父类允许访问的其他构造方法。
【注意】super必须放在子类构造方法有效代码的第一行 - 父类中如果没有无参构造方法,则在子类的每个构造方法中都需要在第一排用super关键字指明调用父类哪个构造方法,否则就会编译报错
- -this和super不能在静态方法中使用,静态方法不能直接调用非静态成员
- 构造方法中不能同时出现this()和super(),因为都要占第一行
Object类
- Object类是所有类的父类
- 一个类没有使用extends显示标明继承关系,则默认继承Object类
- Java中所有类都可使用Object类的方法
相等与同一
如果两个对象具有相同的类型以及相同的属性值,则称这两个对象相等。如果两个引用对象指的是同一个对像,则称这两个变量同一。Object类中定义的equals 函数原型为:public boolean equals(Object);他是判断两个对象是否同一,并不是是否相等。
equals方法
由于Object 类是所有类的最高基类,所有其他类都继承类Object类的equals()方法,定义原型如下:
public boolean equals (Object x
){
return this == x;
}
在java中 “==” 是判断两个对象是否同一,而不是判断相等。因此Object类中的equals方法也是判断两个对象是否同一。要判断两个对象是否相等,就需要重写equals()方法。
- 对于引用数据类型,==和equals都是比较内存中的地址是否相等。
- String类底层重写了equals方法,所以equals比较的是他们的值是否相等。
- 自定义的类也可重写equals方法,可重载:即将参数类型由Object改为当前类的类型
toString
- 继承Object中的toString方法时,输出对象的字符串表示形式:类型信息+@+地址信息
- 子类可以通过重写toString方法的形式,改变输出的内容以及表现形式
final关键字
- 被final修饰的类不允许被继承;
- 被final修饰的方法不允许被重写;但可被正常继承使用
- 被final修饰的局部变量和成员属性初始化后不允许被修改;被final修饰的成员属性初始化方法:a. 定义时直接初始化;b. 在构造代码块中初始化;c. 在构造方法中初始化;
- final修饰的对象为引用类型时,其引用地址不能被修改,但是其属性值可以修改
- 配置信息可使用 final static修饰
- final不可以修饰构造方法
- final修饰可提高性能,但会降低可扩展性
注解
- JDK1.5引入的一个特性
- 可以声明在包、类、属性、方法、局部变量、方法参数等的前面,用来对这些元素进行说明、注释
- 按照运行机制分
- 源码注解
注解只在源码中存在,编译成.class文件就不存在了 - 编译时注解
注解在源码和.class文件中都存在 - 运行时注解
在运行阶段还起作用,甚至会影响运行逻辑
- 源码注解
- 按照来源分
- 来自JDK的注解
- 来自第三方的注解
- 我们自己定义的注解 - 元注解
对注解进行注释的