Java三兄弟之继承

Java的三大特征:封装、继承、多态

继承

继承的概念

就像我们实际生活中的继承,孩子继承了爸爸的才华,继承了妈妈的样貌。我们Java中也同样有继承的关系,子类继承父类的一些成员变量和方法。
多个类中存在相同属性和行为,那么会显得代码的冗余。这时我们可以将这些相同的部分进行抽取,放到一个单独的类中。那么多个类中无需再定义这些属性和行为,只需要和抽取出来的类构成某种关系。
这些被抽取的多个类可以称为子类,也叫派生类;多个类抽取出来的这个类称为父类超类(superclass)或者基类

继承描述的是事物之间的所属关系,这种关系是:is-a 的关系。可见,父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。

继承的优点

  • 提高代码的复用性
  • 提高代码的扩展性
  • 类与类之间产生了关系,多态的前提

注意:同时也增加了一些弊端,那就是累与泪之间的耦合度增高了。

继承的格式

可以通过关键字extends继承一个父类(超类、基类)。

class 父类{
   }

class 子类 extends 父类{
   }

例如:

class Pet{
   
	String petType;
}

class Dog extends Pet{
   
	String name;

	public void eat(){
   
		System.out.println(petType+":"+name+"在吃东西");
	}
}

public class Test{
   
	public static void main(String[] args) {
   
        // 创建一个狗类对象
		Dog dog = new Dog ();
      
        //为狗类对象的petType属性赋值
      	dog.petType = "狗";
      	
        // 为该狗类对象的name属性进行赋值
		dog .name = "Tom";
  
      	// 调用该狗的eat()方法
      	dog.eat();
	}
}

结果:
狗:Tom在吃东西

继承的特点

1、子类会继承父类所有的成员变量和方法

从类的定义来看,类是一类具有相同特性的事物的抽象描述。父类是所有子类共同特征的抽象描述。而实例变量和实例方法就是事物的特征,那么父类中声明的实例变量和实例方法代表子类事物也有这个特征。

  • 当子类对象被创建时,在堆中给对象申请内存时,就要看子类和父类都声明了什么实例变量,这些实例变量都要分配内存。
  • 当子类对象调用方法时,编译器会先在子类模板中看该类是否有这个方法,如果没找到,会看它的父类甚至父类的父类是否声明了这个方法,遵循从下往上找的顺序,找到了就停止,一直到根父类都没有找到,就会报编译错误。

所以继承意味着子类的对象除了看子类的类模板还要看父类的类模板。

2、子类无法直接使用父类的私有成员

子类会继承父类私有(private)的成员变量,但子类不能对继承的私有成员变量直接进行访问(也可以理解为私有的属性没有被继承,官方文档中的说法),可通过继承的公共的get/set方法进行访问。如图所示:

子类获取父类私有成员

父类代码:

public class Person {
   
    private String name;

    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }
}

子类代码:

public class Student extends Person {
   
    private int score;

    public int getScore() {
   
        return score;
    }

    public void setScore(int score) {
   
        this.score = score;
    }

    public String getInfo(){
   
        //在子类中不能直接使用父类私有的name
        return "姓名:" + getName() + ",分数:" + getScore();
    }
}

测试类代码:

public class TestStudent {
   
    public static void main(String[] args) {
   
        Student student = new Student();

        student.setName("张三");
        student.setScore(89);

        System.out.println(student.getInfo());
    }
}
3、Java只支持单继承,但可以被多个类继承

单继承

public class A{
   }
class B extends A{
   }

//一个类只能有一个父类,不可以有多个直接父类。
class C extends B{
   } 	//ok
class C extends AB{
   }	//error

被多个子类继承

class A{
   }
class B extends A{
   }
class D extends A{
   }
...
4、Java支持多层继承

类似于传递性

class A{
   }

class B extends A{
   
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑妖问路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值