继承(extend)
一.理解继承的作用**
继承是Java中实现代码重用的重要手段之一,也是面向对象的三大特性之一。
在两个类实现了继承之后,会产生子类和父类的概念,而子类可以拥有父类中的属性和方法,子类还可以对这些方法进行重写。
Java 中继承是根继承,一个类有且仅有一个亲爹。
二.掌握继承的基本使用**
1、将多个类(子类)抽取公共代码(属性,方法)到父类中。
public class pet{
// 公共代码
}
例如:
/* 狗类 */
public class Dog{
private String name;
private int health;
private int love;
private String strain;
public void print(){
syso(name health love);
}
}
/* 猫类 */
public class Cat{
private String name;
private int health;
private int love;
private char gender;
public void print(){
syso(name health love);
}
}
/* 狗类和猫类共有的属性,
这些属性可以抽调出来建立一个宠物类(父类)*/
private String name;
private int health;
private int love;
2、使用子类去继承父类,即可拥有父类中的公共代码
public class Dog extends Pet{
// 自己特有的
// 继承了父类中公共的
}
继承注意事项:
1、子类和父类之间要有is a的关系。
// 父类
public class Pet{
// 公有代码
}
// 子类继承
// 必须是在子类名后加写【extends 父类类名】extends 父类类名
public class Dog extends Pet{
// 继承了公有代码
// 特有的代码
}
2、子类不是无限继承父类中的内容,它只能继承父类中非私有化(非private修饰符)的代码,也不能继承构造方法,也不能继承不同包中,默认修饰的内容。
只能继承父类中非私有(非private修饰符)的代码:private修饰的内容是私有的,只能在本类中使用。
使用方法:给父类中的所有类声明提供 一对getxxx与setxxx方法。如下
/*1、定义动物类,有名称和年龄两个属性,且属性私有化,提供相应的getxxx与setxxx方法。
*/
public class Animal { // Animal 就是父类
private String name;// 类声明
private int age;// 类声明
// 关键字 super
public Animal() {
super();
}
// getName和setName
// 就是name获取的一对getxxx与setxxx方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 同理Age的一对getxxx与setxxx方法
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//无参有返的方法
public String animal() {
System.out.println("吃饭");
// 必须使用return来返回值
return("吃饭");
}
public void animal1() {
System.out.println("动物自白:\n我的字:"+getName()+"\t我的年龄:"+getAge());
}
}
/*1、定义测试类,创建狗对象,并给父类对象中的名称和年龄属性赋值
5、使用狗对象获取名称和年龄的属性值并打印在控制台上
6、使用狗对象调用吃饭方法*/
public class Animal2 {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("金毛");
dog.setAge(6);
dog.animal1();
// 狗对象调用吃饭方法
dog.animal();
不能继承构造方法:构造方法是用来初始化对象(对象创建),它是给父类创建对象用的。
不能继承不同包中,默认修饰的内容。
三.掌握super关键字的使用
类似与this ,this表示当前类的某个对象,谁在调用谁就是当前对象。
super表示当前类的父类的对象
。
this可以调用自己的属性(this.XX)、自己的方法(this.XXX())、自己的构造(this())。
super可以调用父类的属性(super.XXX)、父类的方法(super.XX())、父类的构造(super())。
this和super在构造中调用其他构造时,只能出现在有效代码的第一行。
子类继承父类之后,子类的构造方法中会自动添加父类构造的调用代码。
/* super调用构造方法 */
public Dog(){
super();// super只能出现在有效代码的第一行
}
4.继承之后 加载顺序
父类静态代码块 、 父类构造代码块、父类的构造方法、子类的静态代码块、子类的构造代码块、子类的构造方法
父类静态代码块 -> 子类的静态代码块 -> 【 父类的构造代码块 -> 父类的构造方法 -> 子类的构造代码块 -> 子类的构造方法 】