java中的抽象类与接口

1.抽象类

1.1抽象类定义规则如下:

(1)抽象类和抽象方法都必须用abstract关键字来修饰;

(2)抽象类不能直接实例化,也就是不能直接用new关键字去产生对象;

Book book=new Book();  //若Book是抽象的,则语法错误,因为无法被实例化

(3)抽象类定义时抽象方法只需声明,而不需要实现

abstract class Book{

  private String title=”java”;

  public void print(){

  System.out.println(title);

}

public abstract void fun();  //没有方法体,是一个抽象方法

}

(4)含有抽象方法的类必须被声明为抽象类,抽象类的子类必须实现所有的抽象方法(覆写所有抽象方法)后才能被实例化,否则这个子类还是抽象类。

 

1.2抽象类的使用原则:

(1)抽象类通常专门用来做父类,因此抽象类必须有子类,子类使用extends继承抽象类,一个子类只能继承一个抽象类;

(2)子类必须实现抽象类之中的全部抽象方法

(3)如果想要实例化抽象类的对象,则可以使用子类进行对象的向上转型类完成。

abstract class Person{

  String name;

  int age;

public abstract string talk();  //声明一个抽象方法talk()

}

class Student extends Person(){

  public Student (String name,int age){

  this.name=name;

  this.age=age;

}

public String talk(){  //实现抽象方法talk()

return “学生->姓名:”+this.name”,年龄:”+this.age;

}

}

class AbstractDemo{

  public static void main(String[] args){

    Student s=new Student(“张三”,20);

    System.out.println(s.talk());  //调用被实现过得方法

}

}

 

1.3抽象类的特征:

(1)抽象类也可以有构造方法,但这些构造方法必须在子类中被调用,并且子类实例化对象的时候依然满足类继承的关系,先默认调用父类的构造方法,再调用子类的构造方法。抽象类的构造方法不能被外部类实例化对象调用。

abstract class Person{

  String name;

  int age;

public Person(String name,int age){  //定义构造方法

  this.name=name;

  this.age=age;

}

public abstract string talk();

}

class Student extends Person(){

  public Student (String name,int age){

    super(name,age);  //必须明确调用抽象类的构造方法

}

public String talk(){

return “学生->姓名:”+this.name”,年龄:”+this.age;

}

}

(2)抽象类不能够使用final定义。因为使用final定义的类不能有子类,而抽象类使用的时候必须有子类,这是一个矛盾的问题。

(3)Static声明,抽象类内外不同。在外部抽象类上无法使用static声明,但是内部抽象类却可以使用static定义,使用static定义的内部抽象类就可以表示一个外部类

abstract class Book{

  public abstract void print();  //定义抽象方法

  static abstract class CD{  //静态内部抽象类

  Public abstract void get();  //抽象方法

}

}

class JavaCD extends Book.CD{  //继承抽象方法

  public void get(){

  System.out,println(“java”);

}

}

public class StaticInnerAbstractClass{

  public static void main(String args[]){

  Book.CD cd=new JavaCD();

  cd.get();

}

}

(4)抽象类中可以没有抽象方法,但即便没有抽象方法,也不能在外部通过new实例化。

 

2.接口

2.1接口的基本概念

接口的宗旨在于定义由多个继承类共同遵守的“契约”。接口的所有成员访问类型都必须为public,接口里的方法默认为abstract类,即接口中的方法为“抽象方法”。接口允许定义默认方法(default方法)。

带默认方法的接口定义例:

interface A{

  public static final String INFO=”hello world”;  //全局常量

  public abstract void print();  //抽象方法

default public void otherprint(){  //带方法体的默认方法

  System.out.println(“default methods!”);  //默认方法的方法体

}

}

 

接口必须遵守的原则:

  1. 接口必须有子类,子类依靠implement关键字可以同时实现多个接口
  2. 接口的子类必须实现接口之中的全部抽象方法;
  3. 接口可以利用对象多态性,利用子类实现对象的实例化

 

PS:接口的数据成员必须赋初值,且不能再被更改,所以声明数据成员的关键字final可省略,抽象方法声明的关键字abstract也可以省略

 

3.抽象类和接口对比

抽象类与接口相同点

  1. 都是抽象类型;
  2. 都可以有实现方法;
  3. 都可以不需要实现类或者继承者去实现所有方法;

 

抽象类和接口不同点

  1. 抽象类不可以多重继承,接口可以;
  2. 抽象类和接口所反映出的设计理念不同。抽象类属于“模板设计模式”,表示的是“is-a”关系;接口属于“代理设计模式”,表示的是“like-a”关系;
  3. 接口中定义的变量默认为public static final型,且必须给初值,所以实现类中不能重新定义,也不能改变其值;抽象类中的变量值可以在子类中重新定义,也可以重新赋值。

 

4.继承抽象类和继承普通类最大的区别

(1)在普通类中所有的方法都是有方法体的,如果有一些方法希望由子类来实现的时候,子类即使不实现也不会出现错误;

(2)抽象类中的抽象方法在语法上就必须要求子类进行实现,这样就可以强制子类做一些固定操作。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值