Java 继承意义/特性/实例,接口作用意义

目录

为什么需要继承

继承类型

 继承的特性

继承关键字extends,implements,super,this,final

extends关键字

implements关键字

super 与 this 关键字

final表示不能被继承

子类是不继承父类的构造器(构造方法或者构造函数)

接口(待补充)


一、为什么需要继承

如果这几类有许多共同的方法和变量。比如初一类,初二类,均有数学、语文英语变量,有得出平均值、得出最高分,得出最低分的方法。

代码存在重复了,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个父类。

二、继承类型

需要注意的是 Java 不支持多继承,但支持多重继承。多继承即一个类继承不同的类;

 三、继承的特性

  • 子类拥有父类非 private 的属性、方法。

  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。

  • 子类可以用自己的方式实现父类的方法,例如重写。

  • Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。

  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。

四、继承关键字extends,implements,super,this,final

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关键字来实现对父类成员的访问,用来引用当前对象的父类。

this关键字:指向自己的引用。

class Animal {
  void eat() {
    System.out.println("animal : eat");
  }
}
 
class Dog extends Animal {
  void eat() {
    System.out.println("dog : eat");
  }
  void eatTest() {
    this.eat();   // this 调用自己的方法
    super.eat();  // super 调用父类方法

  }
}
 
public class Test {
  public static void main(String[] args) {
    Animal a = new Animal();
    a.eat();
    Dog d = new Dog();
    d.eatTest();
  }
}

animal : eat(animal对象)
dog : eat(子类的对象)
animal : eat

final表示不能被继承

可以用来修饰变量(包括类属性、对象属性、局部变量和形参)、方法(包括类方法和对象方法)和类。

final 含义为 "最终的"。

使用 final 关键字声明类,就是把类定义定义为最终类,不能被继承,或者用于修饰方法,该方法不能被子类重写:

五、子类是不继承父类的构造器(构造方法或者构造函数)

  • 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)
    • 如果父类的构造器带有参数:则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。
    • 如果父类构造器没有参数:则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。
    • 子类的所有构造方法内部, 第一行会(隐式)自动先调用父类的无参构造函数super();如果子类构造方法第一行显式调用了父类构造方法,系统就不再调用无参的super()了。

注意:如果父类没有无参构造函数,创建子类时,不能编译,除非在构造函数代码体中的第一行显式调用父类有参构造函数。

六、接口

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。

接口是指一个类所具有的方法的声明,但是没有具体的实现。接口可以看作是定义一组规范,所有实现该接口的类都必须遵从这些规范。Java中的接口通过interface关键字来定义,一个类可以实现多个接口,但只能继承一个类。

接口的作用

  1. 多继承:Java中不支持多继承,但是接口可以实现多个接口,这样就可以实现多继承的效果。这种特性可以使得我们的代码更加模块化,降低代码的耦合度。
  2. 规范方法的实现:接口是一种抽象类型,它不关心实现的细节,只规定了方法的签名和返回值类型,这种特性使得接口成为一种规范方法实现的方式。所有实现该接口的类都必须实现接口规定的方法。
  3. 统一的方法接口:接口可以为所有实现接口的类提供统一的方法接口,使得我们可以更方便的调用方法,这也是Java中很多框架都采用接口编程的原因。

接口特性

  1. 接口不能用于实例化对象,但是可以被实现:一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
  2. 方法:接口没有构造方法,接口中所有的方法必须是抽象方法。接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
  3. 变量:接口不能包含成员变量,除了 static 和 final 变量。接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
  4. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

接口的声明及实现

接口的继承

 一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。

在Java中,类的多继承是不合法,但接口允许多继承。在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口。 

// 文件名: Sports.java
public interface Sports
{
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}
 
// 文件名: Football.java
public interface Football extends Sports
{
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}
 
// 文件名: Hockey.java
public interface Hockey extends Sports
{
   public void homeGoalScored();
   public void visitingGoalScored();
   public void endOfPeriod(int period);
   public void overtimePeriod(int ot);
}

//多继承

public interface Hockey extends Sports, Event

标记接口:没有包含任何方法的接口

标识接口是没有任何方法和属性的接口。标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型。

标记接口作用:简单形象的说就是给某个对象打个标(盖个戳),使对象拥有某个或某些特权。

标记接口主要用于以下两种目的:

  • 建立一个公共的父接口:

    正如EventListener接口,这是由几十个其他接口扩展的Java API,你可以使用一个标记接口来建立一组接口的父接口。例如:当一个接口继承了EventListener接口,Java虚拟机(JVM)就知道该接口将要被用于一个事件的代理方案。

  • 向一个类添加数据类型:

    这种情况是标记接口最初的目的,实现标记接口的类不需要定义任何接口方法(因为标记接口根本就没有方法),但是该类通过多态性变成一个接口类型。

标识接口的作用

  • 19
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值