天天看点

抽象类和接口的基本概念

       抽象类实际上也是一个类,只是与之前的普通类相比,在抽象类中多了抽象方法。

       抽象方法是只声明而未实现的方法,所有的抽象方法必须使用abstract关键字声明,包含抽象方法的类也必须使用abstract class声明。

一个抽象类的定义

abstract class A{

         private String name = "WWW" ;

         public void fun(){

                   // 此处定义了一个普通方法

                   System.out.println("Hello World!!!") ;

         }

         <b>public abstract void print() ;</b>

};

       可以发现抽象方法后面没有“{}”,则表示方法没有实现。

       如果对抽象方法直接实例化,则会出现无法实例化的错误。

         public abstract void print() ;

public class Demo01{

         public static void main(String args[]){

                   <b>A a = new A() ;</b>

<b>抽象类的使用原则:</b>

       1、  抽象类必须有子类,抽象类必须被继承

       2、  抽象类的子类如果不是抽象类的话,则必须覆写里面的全部抽象方法。

       3、  抽象类不能直接实例化,必须依靠子类完成。

进一步完善之前的程序:

class B extends A{

         // 覆写抽象方法

         public void print(){

                   System.out.println("**********************") ;

public class Demo02{

                   B b = new B() ;

                   b.print() ;

                   b.fun() ;

<b>讨论问题:</b>

       1、  能否用final修饰一个抽象类呢?

              · 因为抽象类必须被子类继承,而被final修饰的类不能有子类。所以不能

       2、  抽象类中能否有构造方法呢?可以有

abstract class Person{

         private String name ;

         private int age ;

         // 单独按一个类来说,应该可以直接在构造方法中初始化

<b>         public Person(String name,int age){</b>

<b>                   this.name = name ;</b>

<b>                   this.age = age ;</b>

<b>         }</b>

         public abstract String getInfo() ;

         public String getName(){

                   return this.name ;

         public int getAge(){

                   return this.age ;

class Student extends Person{

         private String school ;

         public Student(String name,int age,String school){

                   <b>super(name,age) ;</b>

                   this.school = school ;

         public String getInfo(){

                   return "姓名:"+super.getName()+",年龄:"+super.getAge()+",学校:"+this.school ;

public class Demo03{

                   Student stu = new Student("张三",30,"北京大学") ;

                   System.out.println(stu.getInfo()) ;

抽象类中可以有构造方法,但是要求在没有无参构造方法的时候,子类必须明确的调用父类中的构造方法。

<b>回顾:</b>子类对象的实例化过程

· 子类对象实例化的时候默认会先去调用父类中的无参构造方法,如果父类中没有无参构造,则可以通过super指定调用父类中的其他构造方法。

<b>注意:</b>

       一个类只可以继承一个抽象类,属于单继承。

<b>       </b><b>接口定义:</b>

              · 只包含抽象方法和全局常量的类称为接口。

              · 接口使用interface进行定义。

interface A{

         public static final String INFO = "HELLO" ;

}

       接口定义完之后,一个接口也必须依靠其子类使用,子类继承接口的概念称为实现。格式如下:

              class 子类 implements 接口名称{}

       接口的子类如果不是抽象类的话,则也必须覆写里面的全部抽象方法。

class B implements A{

                   System.out.println(INFO) ;

public class Demo04{

       接口与抽象类相比,有一个优点:说一个子类只能继承一个父类,但是可以同时实现多个接口,也就说是通过接口完成多继承。

       class 子类 implements 接口A,接口B

interface C{

         public static final String PARAM = "WWW" ;

         public abstract void fun() ;

class B implements A,C{

                   System.out.println(PARAM) ;

public class Demo05{

       <b>问题:</b>

既然,接口中的一切方法都是抽象方法,接口中的一切变量都是全局常量,那么实际上接口就可以简化成如下的形式定义。

         // public static final String INFO = "HELLO" ;

         String INFO = "HELLO" ;

         // public abstract void print() ;

         void print() ;     //à 此处虽然没有明确的写出权限,但实际上权限是<b>public</b>

       一定要明确:接口中的一切方法都是public访问权限,所以在子类实现方法的时候访问权限必须是public。写与不写是一样的。所以有时候为了避免此种情况,还是建议写上:public

         <b>public void print() ;</b>

       那么如果一个类继承继承一个抽象类又要实现一个接口,则必须按照以下格式完成:

       class 子类 extends 父类(一般都是抽象类) implements 接口A,接口B

         void print() ;

abstract class X{

         public String param = "hello" ;

         abstract void fun() ;

class B extends X implements A{

         void fun(){

                   System.out.println(param) ;

public class Demo07{

<b> </b>

<b>开发原则:</b>

       在开发中一定要记住,一个类往往很少去继承一个已经实现好的类,即:普通类之间不能互相继承。

<b>注意点:</b>

       1、  一个抽象类可以实现多个接口,但是一个接口不能继承一个抽象类。

<b>abstract class X implements A</b>{

       2、  一个接口可以同时继承多个接口,即:实现多继承关系

              interface 子接口 extends 父接口A,父接口B,父接口C

         public void printA() ;

interface B{

         public void printB() ;

         public void printC() ;

interface X extends A,B,C{

         public void printX() ;

class Y implements X{

         public void printA(){}

         public void printB(){}

         public void printC(){}

本文转自 李兴华 51CTO博客,原文链接:http://blog.51cto.com/lixinghua/91243,如需转载请自行联系原作者

继续阅读