首页 > 试题广场 >

Java特性中,abstract class和interfa

[不定项选择题]
Java1.8版本之前的前提,Java特性中,abstract class和interface有什么区别()
  • 抽象类可以有构造方法,接口中不能有构造方法
  • 抽象类中可以有普通成员变量,接口中没有普通成员变量
  • 抽象类中不可以包含静态方法,接口中可以包含静态方法
  • 一个类可以实现多个接口,但只能继承一个抽象类。
A B D显然都是对的。主要说C选项:
在JDK1.8之前的版本(不包括JDK1.8),接口中不能有静态方法,抽象类中因为有普通方法,故也可以有静态方法。
在JDK1.8后(包括JDK1.8),在抽象类中依旧可以有静态方法,同时在接口中也可以定义静态方法了。
以下代码在JDK1.8之后是没有问题的(可以通过接口名来调用静态方法  :Main.prinf(); ):
public interface Demo{
    public static void print() {         
      System.out.println("Hello World!");      }
}

PS:
在JDK1.7,接口中只包含抽象方法,使用public abstract  修饰。
public interface Demo{
    public abstract void method();
}
在JDK1.8,接口中新加了默认方法和静态方法:
        默认方法:使用default修饰,在接口的实现类中,可以直接调用该方法,也可以重写该方法。
        静态方法:使用static修饰,通过接口直接调用。
public interface Demo{
    //默认方法
    public default void method(){
        System.out.println("default method...");
    }

    //静态方法
    public static void print(){
        System.out.println("static method...");
    }
}
在JDK1.9,接口中新加了私有方法,使用private修饰,私有方法供接口内的默认方法调用。
public interface Demo{
    private void method() {
        System.out.println("Hello World!");
    }
} 

编辑于 2021-04-01 16:00:50 回复(20)
接口和抽象类的区别:
1.接口的方法默认为public abstract ,接口中的变量默认为public static final,在java8之前所有的方法不能有实现
抽象类中可以有非抽象方法
2.一个类可以实现多个接口,但只能继承一个抽象类
3.一个类实现接口,要实现该接口的所有抽象方法。
4.接口不能被实例化,但可以声明,但是必须引用一个实现该接口的对象。
抽象类可以有构造方法,但是不能被直接通过new进行实例化。但可以通过子类继承,实例化子类的时候抽象类也会被实例化。
这其实用到了多态,向上转型。父类引用指向子类对象。
5.从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
发表于 2019-10-19 18:08:34 回复(6)

版权声明:本文为CSDN博主「鹿与森呀」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38207722/article/details/96422920
发表于 2020-01-22 20:34:40 回复(4)
修饰字符static与abstract不能够同时修饰。
抽象类中可以存在普通方法,所以能够使用static修饰。
接口中方法都为抽象方法,所以不能够使用static修饰。
发表于 2019-05-31 11:27:14 回复(0)
抽象类的构造方法是用来初始化的,不是用于实例化的
发表于 2020-02-25 17:14:58 回复(0)
A 和D是对的,B错在抽象类和接口都可以定义成员变量,C错在它说反了,抽象类可以有静态方法而接口不可定义静态方法
发表于 2019-05-28 10:01:17 回复(3)
抽象类和接口的定义: 抽象类(abstract cla***abstract修饰符修饰的类。(如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类。) 实际点来说,一个抽象类不能实例化,因为“没有包含足够多的信息来描述一个具体的对象”。但仍然拥有普通类一样的定义。依然可以在类的实体(直白点就是能在{}里面)定义成员变量,成员方法,构造方法等。 抽象方法:只声明,不实现。具体的实现由继承它的子类来实现。实际点就是:被abstract修饰的方法,只有方法名没有方法实现,具体的实现要由子类实现。方法名后面直接跟一个分号,而不是花括号。例如:public abstract int A(); 一个类中含有抽象方法(被abstract修饰),那么这个类必须被声明为抽象类(被abstract修饰)。   接口(interface): 定义:接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而继承接口的抽象方法。从定义上看,接口是个集合,并不是类。类描述了属性和方法,而接口只包含方法(未实现的方法)。 接口和抽象类一样不能被实例化,因为不是类。但是接口可以被实现(使用 implements 关键字)。实现某个接口的类必须在类中实现该接口的全部方法。虽然接口内的方法都是抽象的(和抽象方法很像,没有实现)但是不需要abstract关键字。 接口中没有构造方式(因为接口不是类) 接口中的方法必须是抽象的(不能实现) 接口中除了static、final变量,不能有其他变量 接口支持多继承(一个类可以实现多个接口)   抽象类和接口的区别:   1.默认的实现方法: (1)抽象类可以有默认的方法实现完全是抽象的。 抽象类中可以有已经实现了的方法,也可以有被abstract修饰的方法(抽象方法),因为存在抽象方法,所以该类必须是抽象类。 (2)接口根本不存在方法的实现。 但是接口要求只能包含抽象方法,抽象方法是指没有实现的方法。接口就根本不能存在方法的实现。   2.子类使用的关键词不一样: (1)实现抽象类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 抽象类虽然不能实例化来使用,但是可以被继承,让子类来具体实现父类的所有抽象方法。但是如果子类将抽象方法没有全部实现,就必须把自己也修饰成抽象类,交于继承它的子类来完成实现。以此类推,直到没有抽象函数。 (2)子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现。 接口的实现,通过implements关键字。实现该接口的类,必须把接口中的所有方法给实现。不能再推给下一代。(和抽象类相比,抽象类是将梦想传给家族,一代一代去完成。那么接口就是掌门人找大师兄来完成帮派的鸿星伟业,这时候就只有一次希望,要么有能力就实现,没能力就不要接。)   3.是否有构造器: (1)抽象类可以有构造器 抽象类是属于类,享有类的所有特性(但是不能实例化),当然包括类的构造方法,也就是构造器。 (2)接口不能有构造器 接口是所有抽象方法的集合,注意,是集合,不是类。当然没有构造方法一说,更别提什么构造器了。   4.可使用的修饰符: (1)抽象方法可以有public、protected和default这些修饰符  抽象类的目的就是被继承,抽象方法就是为了被重写,所以肯定不能用private修饰符,肯定是可以用public的。但是protected和default也是可以的。   (2)接口方法默认修饰符是public。你不可以使用其它修饰符。 接口就有且只有一个public修饰。(感觉抽象类像小儿子各种耍无赖,接口就像私生子,说什么只能是什么)   5.速度方面: (1)抽象方法比接口速度要快(抽象方法是小儿子,从小吃的好所以跑的快) (2)接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。(接口是私生子,从小日子苦,营养不良)   6.增加新方法对子类的影响: (1)如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 抽象类可以有一些非抽象方法的存在,这些方法被称为默认实现。如果添加一个默认实现方法(不能是抽象方法),就不需要在子类中去实现,所以继承这个抽象类的子类无须改动。 如果你往接口中添加方法,那么你必须改变实现该接口的类。 (2)接口中只能添加抽象方法,当你添加了抽象方法,实现该接口的类就必须实现这个新添加的方法。 因为,定义中说的很清楚,接口的实现必须实现所有的方法。所有,当然包括新添加的方法。   7.子类能继承的数量: 抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。 java在类的继承上并没有多继承。抽象类属于类,所以可以被继承。但子类只能继承一个父类。 java为了实现多继承,使用了接口。一个类可以实现多个接口。继承就好比生了孩子,只能有一个爹,但是这个孩子可以学语文,学数学,学英语等等很多东西,而语文、数学、英语就相当于接口。   总的来说,因为java中抽象类只有单继承,接口就可以实现多继承。
发表于 2021-12-20 09:07:30 回复(0)
接口中的成员变量被隐式的声明为public static final 
jdk1.8后接口中可以有静态方法而且存在方法体
发表于 2019-06-18 19:50:27 回复(3)
接口中没有普通成员变量,默认是public static final修饰,是常量,不是普通成员变量
发表于 2021-11-17 22:16:49 回复(0)
抽象类和接口的区别:
1、一个类可以实现多个接口,但只能继承一个抽象类。接口本身可以通过extends关键字扩展多个接口。
2、 抽象类可以有构造方法,接口中不能有构造方法。
3、抽象类中不一定都是抽象方法,也可以全是具体方法(非抽象方法)。在Java8之前,接口中的所有方法必须是抽象的。但Java8的时候,接口可以有默认方法和静态方法。
4、接口中只能有public static final变量,没有普通的成员变量,而抽象类中均可拥有。
5、接口中的方法和变量默认修饰符为public(写不写都是public),而抽象类中的方法可以是public,protected和默认类型(抽象方法就是为了被重写所以不能是private修饰)

解析:
A:参照2,A正确;
B:参照4,B正确;
C:参照3,C错误;
D:参照1,D正确。
发表于 2021-06-19 15:39:29 回复(0)
A 抽象类中可以使用构造方法 只不过不能实例化抽象类而已 但是可以实例化它的实现类,接口是没有构造方法的,接口本身也不是类
B 抽象类的要求不高 可以有普通成员变量 但是对于接口来说 他的成员变量默认是public static final的 只能是静态的成员变量 静态的不能让实现类随便修改的!
C 说反了 jdk1.8之前是不允许接口中包含静态方法的 抽象类中可以 要求不严格
D 不用多说了抽象类是is-a关系 接口是like-a的关系 定义一个人类用抽象类 定义吃饭睡觉的细节用接口实现
编辑于 2021-04-23 11:05:50 回复(0)
抽象类可以有构造方法,只是不能通过new实例化。 jdk1.8之后接口和抽象类都可以有静态方法
发表于 2022-04-02 14:43:42 回复(0)
接口和抽象类的区别: 1.接口的方法默认为public abstract ,接口中的变量默认为public static final,在java8之前所有的方法不能有实现 抽象类中可以有非抽象方法 2.一个类可以实现多个接口,但只能继承一个抽象类 3.一个类实现接口,要实现该接口的所有抽象方法。 4.接口不能被实例化,但可以声明,但是必须引用一个实现该接口的对象。 抽象类可以有构造方法,但是不能被直接通过new进行实例化。但可以通过子类继承,实例化子类的时候抽象类也会被实例化。 这其实用到了多态,向上转型。父类引用指向子类对象。 5.从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
发表于 2021-11-06 11:20:45 回复(0)
抽象类可以有静态方法,接口不能定义静态方法。
发表于 2021-08-27 18:45:08 回复(0)
个人认为D选项的描述不是很准确 一个类只能继承一个抽象类 说的好像 类不能继承普通类.......
发表于 2021-08-02 11:09:19 回复(1)
接口中默认为public static final 修饰,所以是定义常量
发表于 2020-04-29 20:17:47 回复(0)
速记: 1、抽象类除了不能被实例化,以及可以拥有抽象方法(不能是private权限),以及继承的类必须是抽象类,其他与普通类一致。 2、接口不能有构造方法。 jdk8之前,接口定义成员变量,只能用public 、static、final三个关键字修饰,此外都不行,如果不用上述三个关键字,也是默认public static final。定义成员方法只能用public 和abstract两个关键字修饰,此外都不行,且不能有方法体,如果不用上述两个关键字,也是默认public abstract。 或者更简单的记:接口不能使用private和protected,其中方法不能使用static和final。 jdk8之后,接口方法可以使用static、default
发表于 2020-01-25 15:11:20 回复(0)
A B D显然都是对的。主要说C选项:
在JDK1.8之前的版本(不包括JDK1.8),接口中不能有静态方法,抽象类中因为有普通方法,故也可以有静态方法。
在JDK1.8后(包括JDK1.8),在抽象类中依旧可以有静态方法,同时在接口中也可以定义静态方法了。
以下代码在JDK1.8之后是没有问题的(可以通过接口名来调用静态方法  :Main.prinf(); ):
1
2
3
4
publicinterfaceDemo{
    publicstaticvoidprint() {         
      System.out.println("Hello World!");      }
}

PS:
在JDK1.7,接口中只包含抽象方法,使用public abstract  修饰。
1
2
3
publicinterfaceDemo{
    publicabstractvoidmethod();
}
在JDK1.8,接口中新加了默认方法和静态方法:
        默认方法:使用default修饰,在接口的实现类中,可以直接调用该方法,也可以重写该方法。
        静态方法:使用static修饰,通过接口直接调用。
1
2
3
4
5
6
7
8
9
10
11
publicinterfaceDemo{
    //默认方法
    publicdefaultvoidmethod(){
        System.out.println("default method...");
    }
 
    //静态方法
    publicstaticvoidprint(){
        System.out.println("static method...");
    }
}
在JDK1.9,接口中新加了私有方法,使用private修饰,私有方法供接口内的默认方法调用。
1
2
3
4
5
publicinterfaceDemo{
    privatevoidmethod() {
        System.out.println("Hello World!");
    }
}
发表于 2022-10-29 16:00:14 回复(0)
抽象类 特点: 1.抽象类中可以构造方法 2.抽象类中可以存在普通属性,方法,静态属性和方法。 3.抽象类中可以存在抽象方法。 4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。 5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。 6,抽象类不能被实例化,抽象类和抽象方法必须被abstract修饰 关键字使用注意: 抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native访问修饰符修饰。 接口 1.在接口中只有方法的声明,没有方法体。 2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上public static final 3.在接口中的方法,永远都被public来修饰。 4.接口中没有构造方法,也不能实例化接口的对象。(所以接口不能继承类) 5.接口可以实现多继承 6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类。 7,接口可以继承接口,用extends
发表于 2022-08-23 11:32:28 回复(0)

A、抽象类和接口都不能实例化,但由于抽象类有子类,而子类实例化时,总会直接或间接地调用父类的构造器,因此抽象类可以有构造器。

C、反过来了,抽象类可以有静态方法,接口在jdk8之前是只有抽象方法,在jdk8可以声明静态方法和普通方法,jdk9可以声明私有方法。

发表于 2024-02-25 17:41:53 回复(0)