一、继承的概念

继承是OOP(面向对象)的特征之一,它是从已有的类(父类或称超类)中派生出新的类(子类),子类会自动拥有父类的属性和方法,并且之类可以扩展新的属性和方法。

二、为什么使用继承

Java的继承和实现的区别 java继承的原理_子类


这是两张UML图,对于这两个不同的类存在大量代码的重复,继承就是为了减少代码量,将重复代码抽取到父类中。使用继承优化设计后:

Java的继承和实现的区别 java继承的原理_Java的继承和实现的区别_02


将公共的一些属性和方法提取到父类中,每一个子类只需要编写子类中与父类不同的属性和方法;子类其余相同的属性和方法可以通过继承父类获得。

三、如何使用继承

在java中,使用继承需要使用extends关键字,并且每个子类只能继承一个父类(单根继承)

1.语法形式
//编写父类
class 父类类名
{
    //子类公共的属性和方法
}

class 子类类名1 extends 父类类名 //子类1继承父类
{
  //子类1特有的属性和方法
}

class 子类类名2 extends 父类类名
{
  //子类2特有的属性和方法
}
2.实例
//Animal.java
public class Animal
{
	String name;
	int age;
	
	void eat()
    {
    	System.out.println("eat");
    }
}

//子类会继承父类的属性和方法
//Dog.java
public class Dog extends Animal
{
	String food;
	
	void sleep()
	{
		System.out.println("sleep");
	}
}

//Cat.java
public class Cat extends Animal
{
	String health;
	
	void play()
	{
		System.out.println("play");
	}
}

//Test.java
public class Test
{
    public static void main(String[] args)
    {
        Dog dog = new Dog();
        dog.name = "阿黄"
        dog.age = 10;
        dog.eat();
    }
}

分析:在Dog类中并没有声明name,age以及方法eat(),但在Test.java中,实例dog可以调用父类属性name,age以及调用父类方法eat(),这是因为Dog类继承了父类Animal的属性和方法

3.注意事项

有些父类的属性和方法是不能被继承的:

  • private属性和方法
  • 子类与父类不在同包时,使用默认(default)访问权限的属性和方法
  • 构造方法
  • 被static修饰的属性和方法
四、何时使用继承
1.继承与真实世界相似,符合is-a关系的设计就需要使用继承
  • 哈士奇是狗(哈士奇是子类,狗是父类)
  • 妈妈也是女人(妈妈是子类,女人是父类)
2.继承是代码复用的一种方式,所以当子类中有重复的属性和方法,就应该构建父类,将这些重复的代码放进父类中