类的继承是Java面向对象的一个重点,想要Java入门就必须掌握继承这个知识点,下面由我来分享一下类的继承这个内容,本文章仅代表个人想法,仅供参考。
类的继承的含义
类的继承举个例子就像儿子可以继承父亲的财产,基因等,儿子就像类里面的子类,父亲就相当于类里面的父类,财产、基因就是代表类里面的属性和方法。简单的来说就是子类可以继承父类的属性和方法。
对于没有写要继承的类的话,默认父类为java.lang包下面的Object。
类的继承的用法
语法:
[访问修饰符] class 子类名字 extends 父类名字{
}
1)宠物类pet是父类,猫Cat类是子类,子类可以调用父类的属性和方法。
//父类
public class Pet{
String name;
private int heath;
public void eat(){
System.out.print("我在吃东西");
}
}
//子类
public class Cat extends Pet{
}
public class Test{
public static void main(String[] args){
Cat cat = new Cat();
cat.name = "喵喵";
System.out.println(cat.name); //这里会打印出喵喵,就说明子类调用了父类的name属性;
cat.heath = 100; //这里程序编译会报错,因为heath属性在父类用private修饰了,因此这个只能在父类中使用,子类使用不了
cat.eat();//这里会打印出文字我在吃东西,说明子类调用了父类的eat()方法
}
}
2)java的继承不支持多继承,只能单继承
//如下例子在编译的时候会报错,Java继承只能单继承
public class Cat extends Animal,Pet{
}
3)java继承支持多层继承
public class Animal{
}
public class Pet extends Animal{
}
public class Cat extends Pet{
}
Java子类的实例化过程
1)初始化父类的属性
2)执行父类的构造
3)初始化子类的属性
4)执行子类的构造方法
下边代码序号是代表子类实例化的过程;
public class Pet{
String name; (1)父类进行初始化 name = null;health = 0;
private int heath;
public Pet(){ (2)运行父类的构造方法
System.out.println("父类的构造方法");
}
}
//子类
public class Cat extends Pet{
String kind; (3)子类进行初始化 kind = null;
public Cat(){ (4)运行子类的构造方法
System.out.println("子类的构造方法");
}
}
public class Test{
public static void main(String[] args){
Cat cat = new Cat();
}
}
上面的例子运行结果是:
父类的构造方法
子类的构造方法
super关键字
(1)super.
super是表示当前类的父类对象,可以通过super.父类属性
名或者super.父类的方法名()
来访问父类的属性和方法。
不是说子类已经继承了父类的属性和方法了,用super关键字会不会显得多余?
其实并不多余的,当子类重写父类的方法的时候,jvm虚拟机会就近原则,先执行本类的方法,如果加super关键字jvm虚拟机就会去调用父类的方法。
//父类
public class Pet{
String name;
private int heath;
public void eat(){
System.out.print("动物在吃东西");
}
}
//子类
public class Cat extends Pet{
public void eat(){
System.out.print("小猫在吃东西");
}
public void doto(){
eat();
}
}
public class Test{
public static void main(String[] args){
Cat cat = New Cat();
cat.todo();
}
}
上面代码输出的是:小猫在吃东西,由此可见它调用的是子类的eat() 方法
那我们改一下Cat类加个super关键字效果会如何
public class Cat extends Pet{
public void eat(){
System.out.print("小猫在吃东西");
}
public void doto(){
super.eat();
}
}
输出的结果是:动物在吃东西 所以加关键字super调用的是父类的eat方法
(2)super()
子类继承父类是继承不到父类的构造方法的,当我们想要调用父类的构造方法的时候可以使用super();
来调用构造方法。super();
方法调用的是父类的无参数构造方法,它也可以不写,jvm虚拟会在你没有super();
的时候会自动帮你添加,写上了jvm虚拟机也不会自动帮你添加。
需要注意的是:
super();
只能运用在子类的构造方法,并且要放在子类构造函数的第一行
public class Cat extends Pet{
public Pet(){
super(); //super();可以省略
}
}
public class Cat extends Pet{
public Pet(){
System.out.print("构造函数!")
super(); //在编译的时候报错,因为super();要放在第一行
}
public void eat(){
super(); //在编译的时候报错,因为super只能放在子类的构造函数里
}
}
super(),里面也可以加参数,加参数就是调用父类的有参构造方法
//父类
public class Pet{
private String name;
public Pet(String name){
this.name = name;
}
}
//子类
public class Cat extends Pet{
public Cat(String name){
super(name);
}
}
如上面的例子Cat类的构造方法调用了父类的有参构造方法。