Java抽象类和抽象方法、接口

一、抽象类、抽象方法

1、抽象类

抽象方法就是以abstract修饰的方法,这种方法只声明返回的数据类型、方法名称和参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。
1. 被abstract关键字修饰的类叫抽象类
2. 抽象类不能被实例化(无法使用new关键字创建对象实例)
3. 抽象类可以包含属性,方法,构造方法,普通方法,抽象方法,初始化块,内部类,枚举类
4. 含有抽象方法的类一定是抽象类
5. 不能全部实现抽象类里面的抽象方法的方法是抽象方法
6. abstract不能与private、static、final、native并列修饰同一个方法
7. 抽象类不能用final来修饰

2、抽象方法

抽象方法就是在类中没有方法体的方法,就是抽象方法。
1. 被abstract关键字修饰方法就叫抽象方法
2. 仅有声明而没有方法体,如abstract void f();
3. 格式:

访问修饰符 abstract <返回值类型> <方法名> (参数列表);

例子:Students类和Teacher类都继承实现抽象类Person实现抽象方法f()

abstract class Person {//抽象类
    public abstract void f();//抽象方法
}
class Students extends Person { //实现抽象方法
    public void f() {
        System.out.println("学生类实现抽象方法f()");
    }
}
class Teacher extends Person { //实现抽象方法
    public void f() {
        System.out.println("教师类实现抽象方法f()");
    }
}
public class Test3 {
    public static void main(String[] args) {
        Person s = new Students();
        Person t = new Teacher();
        s.f();
        t.f();
    }
}

二、接口

接口(Interface),在JAVA中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

  1. 成员变量会默认有public static final修饰,所以必须初始化
  2. 方法都会默认public abstract修饰,没有方法体,不能实例化
  3. 接口中只能包含public static final的成员变量和public abstract的成员方法
  4. 接口中没有构造方法,不能被实例化
  5. 一个接口不能实现另一个接口,但是可以继承其他多个接口
  6. 一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类

接口特性:

  1. 接口中的方法默认都是public abstract(只能是 public abstract,其他修饰符都会报错)
  2. 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误。
  3. 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法

重写接口中声明的方法时,需要注意以下规则:

  1. 类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。
  2. 类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
  3. 如果实现接口的类是抽象类,那么就没必要实现该接口的方法。

接口格式

[可见度] interface 接口名称 [extends 其他的类名] { 
    声明变量;
    抽象方法; 
}

接口实现

...implements 接口名称[, 其他接口, 其他接口..., ...] ...

注:类描述对象的属性和方法,接口则包含类要实现的方法。

例子

Animal.java

interface Animal {
   public void eat();
   public void travel();
}

Cat.java

public class Cat implements Animal{

   public void eat(){
      System.out.println("Cat eats");
   }

   public void travel(){
      System.out.println("Cat travels");
   } 

   public int noOfLegs(){
      return 0;
   }

   public static void main(String args[]){
      Cat cat = new Cat();
      cat.eat();
      cat.travel();
   }
}

运行结果

Cat eats
Cat travels

三、抽象类和接口区别

    1. 一个类可以实现多个接口,但只能继承一个抽象类
    2. 一个抽象类可以有若干个抽象方法(>=1),而接口的所有方法都是抽象的,无论是否将它的方法显示地声明为抽象的
    3. 一个抽象类可以有其他的东西,接口不能有static静态代码块以及静态方法和构造方法
    4. 一个抽象类可以声明实例变量,其子类可以继承这些实例变量。而一个接口不能声明实例变量,接口可以声明static和final变量
    5. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的

    四、练习题

    2、下面说法正确的是()

    1. A instanceof这个关键字是用来判定某个类是否为抽象类
      B final关键字修饰的成员变量我们不需要初始化
      C 接口的方法都是抽象方法(jdk1.8之前),并且没有方法体
      D 当我们继承一个抽象类是我们必须实现抽象类的抽象方法
      E 在向上转型的过程中,如果父类和子类拥有相同的名字的成员方法(非静态),则访问的是子类的该方法,如果父类和子类拥有相同名字的成员变量时,则访问的是子类的成员变量
      F 内部类访问外部类的方法时,不用创建外部类的对象直接访问外部类的方法
      G 内部类的变量不能设置为static,也不能设置为final
      H 多态通常用来作为参数传入或者作为返回值返回

    答案:CH
    解析:A instanceof用来判断内存中实际对象A是不是B类型,B常量要初始化,D 抽象类可以不用全部实现继承的抽象类中的抽象方法,E 如果父类和子类拥有相同名字的成员变量时,则访问的是父类的成员变量 F 局部内部类需要创建一个外部类对象才能访问外部类方法,G 静态的内部类的变量和方法都可以设置为static

    3、下面不正确的是()

    1. A 不能和abstract一起使用的修饰符有static,final,public
      B 抽象类之间是继承关系,接口之间也是
      C 接口不能存在普通方法和常量
      D 局部内部类可以用public、private修饰符修饰
      E 接口不可以直接实例化,抽象类可以

    答案:ACDE
    解析:A abstract不能与private、static、final、native并列修饰同一个方法,C 接口中可以存在常量,D 局部内部类前不加修饰符public或private,其范围为定义它的所在代码块,E 接口中和抽象类都是不能被实例化的

    4、下面哪些选项是正确的()

    1. A instanceof是一个二元操作符,作用时来判断左边的对象是否是右边的类的实例,返回的是布尔类型
      B private protected static 都不可以修饰interface
      C this.属性名访问的是本类中的属性,如果本类中没有就从父类中继续查找
      D 对象是对类的抽象化
      E 接口中可以有常量

    答案:BCE
    解析:

    8、以下说法正确的是()

    1. A 抽象方法是一种功能契约,不实现抽象方法就无法构造对象
      B 接口中的抽象方法只能是public的,而抽象类中的抽象方法可以用其他权限修饰
      C类是对象的构造模型,刻画了对象中的所有信息
      D抽象方法不能final来修饰,可以用static修饰
      E 对计算公式已不需要改的数学函数,常用public static final修饰
      F 若类中有final abstract修饰的方法,必须实现该方法才能构造对象
      G 引用是对象的名字,引用值是对象的起始地址

    答案:ABCEG
    解析:D 抽象方法要被实现,所以不能是fianl的,因为他没有方法体所以不能是static,F final不能修饰abstract方法

    9、下列说法错误的是()

    1. A 抽象类必须被子类继承,子类在某些情况下可以不必覆写抽象类中的全部方法
      B 对象向上转型以后,拥有相同名字的普通成员变量(静态变量)时,访问的是子类里面的
      C super的主要功能是完成子类调用父类的内容,并且只能放在子类构造方法的第一行
      D 接口的方法必须定义为public访问权限,并且方法只能是抽象方法(不考虑JDK1.8)

    答案:B
    解析:对象向上转型以后,拥有相同名字的普通成员变量(静态变量)时,访问的是父类里面的

    11、下列定义正确的有哪些()

    1. A 接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
      B 抽象类中抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){};
      C 抽象方法要被实现,所以不能是静态的,也不能是私有的
      D 接口内只能有公共方法,1.8后也可有普通方法和成员变量
      E 类实现接口,利用关键字implement完成

    答案:ABC
    解析:D 接口里面不能有public static的公共方法,E 是用implements关键字

    12、以下说法不正确的是()

    1. A 拥有抽象方法的类为抽象类
      B 抽象类的方法是抽象方法
      C 继承抽象类的子类为抽象类
      D 实现接口的类为抽象类

    答案:ABCD
    解析:A 接口中的方法都是抽象方法,B抽象类中可以有普通方法和构造方法,C继承抽象类并全部实现抽象类中的方法的是普通类,D实现接口中的全部抽象方法的类是普通类。

    20、在Java中,下面关于抽象类的描述正确的是()

    1. A 抽象类可以被实例化
      B 如果一个类中有一个方法被声明为抽象的,那么这个类必须是抽象类
      C 抽象类的方法都必须是抽象的
      D 声明抽象类必须带有关键字abstract

    答案:D
    解析:A抽象类和接口都不能被实例化 B 接口中的方法都是抽象方法 C抽象类的方法可以是抽象方法,也可以是构造方法,普通方法

    • 1
      点赞
    • 6
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值