一.继承:
1.关键字:extends
2.语法:
修饰符 子类 extends 父类{
// 类定义部分
}
3.示例代码
public class Dog extends Pet{
//类定义部分
}
在java中只支持单继承,即每个类只能有一个直接父类;定义一个类时,如果没有使用extends关键字那么这个类直接继承Object类,Object类是所有java类的祖先。
java中,子类可以继承父类的什么东西?
1.继承public 和protected修饰的属性和方法,无论子类和父类是否在同一个包里。
2.继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里。
3.无法继承private 修饰的属性和方法。
4.无法继承父类的构造方法;构造方法不能被继承,因此不能被重写。
二.方法重写(方法的覆盖)
1.定义:在子类中可以根据需求对从父类继承的方法进行重新编写,称为方法的重写或方法的覆盖。
2满足方法重写的要求:
a.重写方法和被重写方法必须具有相同的方法名。
b.重写方法和被重写方法必须具有相同的参数列表。
c.重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类
d.重写方法不能缩小被重写方法的访问权限。
3.继承中,构造方法的调用规则
a.如果子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,写不写“super();”语句,效果是一样的;
b.如果子类的构造方法中通过super显式调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法;
c.如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应用以上两条规则;
d.特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止;
4.方法重写示例代码
public abstract class Pet {
private String name;
private int love;
private int health;
//无参构造方法
public Pet(){
}
//有参构造方法
public Pet(String name, int love, int health) {
this.name = name;
this.love = love;
this.health = health;
}
public String getName() {
return name;
}
public int getLove() {
return love;
}
public int getHealth() {
return health;
}
public void print(){
System.out.println("宠物的自白:\n我的名字叫"+this.name
+",健康值是"+this.health+",和主人的亲密度是"+this.love+"。");
}
}
上面是Pet类,下面我们写一个Dog类来继承Pet类,并重写print()方法。
public class Dog extends Pet{
private String strain;
public String getStrain() {
return strain;
}
public Dog(String strain,String name,int love,int health) {
super(name, love, health);
this.strain = strain;
}
public void print() {
super.print();
System.out.println("我是一只"+this.strain);
}
}
细心的童鞋会发现代码中出现了super关键字,那它是什么?有什么用呢?
1. super 代表对当前对象的直接父类对象的默认引用。在子类中可以通过super 关键字来访问父类的成员。
2.注意:
1.super 必须出现在子类(子类的方法和构造方法)中,而不是其他位置。
2.可以访问父类的成员,如父类的属性、方法、构造方法。
3.注意访问权限的限制,如无法通过super访问private成员。
3.例如,在Dog 类中可以通过如下语句来访问父类成员(假设父类成员都是public权限)。
super.name; //访问直接父类的name 属性
super.print( ) //访问直接父类的print( )方法
super (name ); //访问直接父类对应的构造方法,只能出现在构造方法中
三、抽象类
1.关键字-------abstract
2.抽象类示例代码:
public abstract class Pet {
//类定义部分
}
3.抽象方法示例代码:
public abstract class Pet {
//类定义部分
public abstract void print();//这一行就是抽象方法,必须出现在出现类中。
}
4.抽象类和抽象方法特点:
(2) 抽象类不能实例化。抽象类中可以没有、有一个或多个抽象方法,甚至全部方法都可以是抽象方法。
(3) 抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类。