一、继承的概念
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
子类在具有父类的一般特性也会具有自身的特性。
下图就是动物类的继承
1、继承的格式
class 父类{
}
class 子类 extends 父类{
}
2、为什么需要继承
当我们写一个项目时,会遇到几个不同的类,他们类里的一些方法以及变量会出现重复。这样导致的后果就是代码量臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多代码,容易出现错误)。因此为了解决这个问题,我们提出了继承,将这些类中相同的部分提取出来组成一个父类。
接下来我们举一个例子来说明一下不使用父类时代码块的重复
//Dog 类,属性(姓名,id),方法(吃,睡,自我介绍
public class Dog{
private String name;
private int id;
public Dod(){
}
public Dog(String name,int id){
this.name=name;
this.id=id;
}
public void eat(){
System.out.println(name+"吃饭饭");
}
public void sleep(){
System.out.println(name+"睡觉觉")
}
public void introduction(){
System.out.println("我是"+id+"我的名字是"+name);
}
}
//Cat 类,属性(姓名,id),方法(吃,睡,自我介绍
public class Cat{
private String name;
private int id;
public Cat(){
}
public Cat(String name,int id){
this.name=name;
this.id=id;
}
public void eat(){
System.out.println(name+"吃饭饭");
}
public void sleep(){
System.out.println(name+"睡觉觉")
}
public void introduction(){
System.out.println("我是"+id+"我的名字是"+name);
}
}
相信大家已经看出来代码存在大量重复了吧(虽然是刻意写出来的重复,但是在实际项目中也会遇到,哈哈哈)
那么接下来我们提取上边两个类相同的部分组成一个父类
//Animal 父类
public class Animal{
private String name;
private int id;
public Animal(){
}
public Animal(String name,int id){
this.name=name;
this.id=id;
}
public void eat(){
System.out.println(name+"吃饭饭");
}
public void sleep(){
System.out.println(name+"睡觉觉")
}
public void introduction(){
System.out.println("我是"+id+"我的名字是"+name);
}
}
//Dog 类
public class Dog extends Animal{
public Dog(String name,int id){
super(name,id);
}
}
//Cat 类
public class Cat extends Animal{
public Cat(String name,int id){
super(name,id);
}
}
3、继承类型
Java不支持多继承,但支持多重继承
单继承:class B ----> class A
多重继承:class C ----> class B ----> class A
不同类继承同一个类:class B ----> class A || class C ----> class A
4、继承的特性
子类拥有父类非 private 的属性和方法
子类可以拥有自己的属性和方法,即子类对父类的扩展
子类可以用自己的方式实现父类的方法
Java 的继承是单继承,但是可以多重继承
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性差)
5、继承关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,所有的类都是继承于java.lang.Object,当一个类没有继承的两个关键字,则默认继承 Object(这个类在java.lang包中,所以不需要import)。
首先来看 extends 关键字:单一继承
public class Animal{
}
public class Dog extends Animal{
}
implements 关键字:类继承接口,可以同时继承多个接口(变相使 Java具有多继承的特性)
//定义接口 A
public interface A{
public void play(){
}
public void eat(){
}
}
//定义接口 B
public interface B{
public void palygame(){
}
}
//继承接口 A B
public class C implements A,B{
}
二、super和this 关键字
super: 通过super关键字来实现对父类成员的访问,用来引用当前对象的父类
this: 指向自己的引用。
class Animal{
void eat(){
System.out.println("animal:eat");
}
}
class Dog extends Animal{
void eat(){
System.out.println("dog:eat");
}
void testEat(){
//this 调用自己的方法
this.eat();
//super 调用父类的方法
super.eat();
}
}
public class Test{
public static void main(String [] args){
Animal ani=new Animal();
ani.eat();
Dog dog=new Dog();
dog.testEat();
}
}
输出为:
animal : eat
dog : eat
animal : eat
三、final 关键字
final 可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(类方法和对象方法)和类
使用 final 关键字声明类,则此类不能被继承;用来修饰方法,此方法不能被子类重写
声明类:final class 类名{ }
声明方法:修饰符 final 返回值类型 方法名(){ }