继承(inheritance)指从已有的类中派生出新的类,新的类能吸收已有的类的属性和方法,并能扩展新的能力。
继承的好处是可以解决编程中的代码冗余的问题,是实现代码重用的重要手段之一。
JAVA只支持单根继承,也就是一个类只能有一个直接父类。
继承的特点
继承表达的是" xxx is a xxx "的关系,如Dog is a Animal;
继承使用关键字extends,语法格式:
访问修饰符 class SubClass extends SuperClass {
}
//例如
public class Dog extends Animal{
}

Pet是父类,Dog和Cat是子类,子类继承了父类的name属性和print方法,又各有自己的属性和方法。
在JAVA中,子类可以从父类继承以下内容:
- public和protected修饰的属性和方法,不论子类和父类在不在同一个包中
- 可以继承默认访问修饰符修饰的属性和方法,但是子类和父类必须在同一个包中
- 不能继承父类的构造方法
- 不能继承父类的private属性或方法
this 和 super
super代表父类对象,this代表当前对象;
访问父类构造方法:super(参数)
访问父类属性:super.<父类属性或方法>
- super只能出现在子类的方法中(方法或是构造方法)
- super用于访问父类的成员,如父类的属性,方法,构造方法
- 具有访问权限控制,不能用super访问父类的private属性
继承条件下的构造方法:
- 子类构造方法创建对象时,没有通过super显示调用父类有参构造,也没有通过this显式调用自身其他构造方法时,默认调用父类无参构造方法。
- 子类构造方法通过super显示调用父类有参构造方法时,执行父类相应的构造方法,而不执行父类的无参构造。
- 子类调用自身其他构造方法时遵循以上两条。
示例:
class Pet { //父类Pet
private String name;//父类私有属性
private int age;
public Pet() {//父类无参构造
}
public Pet(String name, int age) {//父类有参构造
this.name = name;
this.age = age;
}
void showInfo(){ //父类中的方法,显示宠物名字和年龄
System.out.println("宠物名字是"+name+"年龄是"+age);
}
}
class Dog extends Pet{ //Dog类继承Pet类
String strain; //扩展自己的属性
public Dog() {
}
public Dog(String name, int age,String strain) {
super(name,age); //super调用父类有参构造
this.strain = strain;
}
void showDog(){
super.showInfo();//super调用父类中的方法
System.out.println("宠物是一狗狗,品种是"+strain);
}
}
class Cat extends Pet{
String sex;
public Cat() {
}
public Cat(String sex) {//没有显示调用父类有参构造,将默认调用父类无参构造
this.sex = sex;
}
//重写了父类中的同名方法,而没有用super调用父类中的同名方法,父类中的方法就被覆盖了
void showInfo(){
System.out.println("我是一只小猫");
}
}
class Tests{
public static void main(String[] args) {
//狗狗并没有继承Pet的name和age属性,而是通过父类public的构造方法间接访问
Dog dog = new Dog("旺财",3,"哈士奇");
Cat cat = new Cat("公");
dog.showInfo();
System.out.println("*********");
dog.showDog();
System.out.println("*********");
cat.showInfo();
}
}
以上代码将输出:
宠物名字是旺财年龄是3
*********
宠物名字是旺财年龄是3
宠物是一狗狗,品种是哈士奇
*********
我是一只小猫
方法的重写
在子类中根据自身需要对从父类继承来的方法进行重新编写,称为方法的重写,或是方法的覆盖(overriding)。
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写。
方法重写必须满足以下要求:
- 方法名必须相同
- 参数列表必须相同
- 返回值类型相同或是其子类
- 访问权限不能严于父类
- 父类的静态方法不能被子类重写为非静态方法
- 子类可以定义与父类同名的静态方法以隐藏父类
- 父类私有方法不能重写(都不能继承)
- 不能抛出比父类更多的异常
方法重写与方法重载的区别:
- 方法重写是在父子类中的同名方法,而且参数列表要相同,返回值类型也要相同
- 方法重载是在同一个类中,同名不同参,与返回值无关
Object类
Object类的部分方法 | 说明 |
---|---|
toString( ) | 返回当前对象的有关信息,一个字符串对象 |
equals( ) | 比较两个对象是不是同一个对象,比较的是指针当(对象的内存地址),返回boolean值 |
clone( ) | 生成当前对象的一个副本,并返回 |
hashCode( ) | 返回当前对象的哈希代码值,默认为对象的32位内存地址 |
getClass( ) | 获取当前对象的所属类的信息,返回class对象 |
Object类是所有类的父类。在JAVA中,所有的JAVA类都直接或者间的继承了java.lang.Object类。在定义一个类时,如果没有显示继承某个类,那么这个类就直接继承Object类,所有对象都继承这个类的方法。
Object类的部分方法 | 说明 |
---|---|
toString( ) | 返回当前对象的有关信息,一个字符串对象 |
equals( ) | 比较两个对象是不是同一个对象,比较的是指针当(对象的内存地址),返回boolean值 |
clone( ) | 生成当前对象的一个副本,并返回 |
hashCode( ) | 返回当前对象的哈希代码值,默认为对象的32位内存地址 |
getClass( ) | 获取当前对象的所属类的信息,返回class对象 |
注意:Object类equals( )方法比较的是两个对象的引用或者说地址,String类重写了equals( )方法,比较的是两个对象的值
网友评论