以下部分内容参考博文:
https://www.runoob.com/java/java-inheritance.html
1、继承的概念
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
生活中的继承:
兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
类的继承格式
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
class 父类 {
}
class 子类 extends 父类 {
}
继承关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
- extends关键字
在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
public class Animal {
private String name;
private int id;
public Animal(String myName, int myid) {
//初始化属性值
}
public void eat() { //吃东西方法的具体实现 }
public void sleep() { //睡觉方法的具体实现 }
}
public class Penguin extends Animal{
}
- implements关键字
使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
public interface A {
public void eat();
public void sleep();
}
public interface B {
public void show();
}
public class C implements A,B {
}
super 与 this 关键字
super关键字:
- 我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
- 当子父类的成员出现同名时,可以通过super来区分
- 子类的构造方法中,通过super关键字调用父类的构造方法
this关键字:指向自己的引用。
代码简单实现
package com.youbao.jicheng;
//父类
class Person
{
String name;
int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
void eat()
{
System.out.println(name+"吃饭");
}
void Getage()
{
System.out.println("age:"+age);
}
}
class Student extends Person //extends Person 继承父类Person
{
Student(String name, int age) {
super(name, age);
// TODO Auto-generated constructor stub
}
void Gotoschool()
{
System.out.println(name+"去上学");
}
}
public class Test {
public static void main(String[] args) {
Person per = new Person("youbao",23);
per.eat();
per.Getage();
Student stu = new Student("youge",18);
stu.Gotoschool();
stu.Getage();
}
}
输出结果:
补充:
父类中的私有属性和私有方法,子类不能被继承过来。
二、方法重写
什么是方法重写
- 指子类可以根据需要对父类继承来的方法进行改写
- 当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。
- 要想调用父类中被重写的方法,则必须使用关键字 super。
方法重写注意点
- 重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值
- 重写方法不能比被重写方法有更严格的访问权限
-
父类中的私有方法,不能被重写
-
在子类重写的方法中继续调用父类被重写的方法,可以通过super.函数名获取