接口和抽象类
下面字段声明中哪一个在interface主体内是合法的? ()
正确答案: B 你的答案: C (错误)
A. private final static int answer = 42;
B. public static int answer = 42;
C. final static answer = 42;
D. int answer;
在接口中,属性都是默认public static final修饰的,所以:
A(错误):不能用private修饰;
B(正确):在接口中,属性默认public static final,这三个关键字可以省略;
C(错误):没写属性的类型;
D(错误):final修饰的属性必须赋值;( final修饰的属性不能说必须赋值,后面可以要么静态块里赋 要么构造器里赋值 ; 确实如此,但是在接口中没有静态块和构造器,接口中的属性是必须直接赋值的 )
接口中的属性在不提供修饰符修饰的情况下,会自动加上public static final
注意(在1.8的编译器下可试):
(1)属性不能用private,protected,default 修饰,因为默认是public
(2)如果属性是基本数据类型,需要赋初始值,若是引用类型,也需要初始化,因为默认有final修饰,必须赋初始值;
(3)接口中常规的来说不能够定义方法体,所以无法通过get和set方法获取属性值,所以属性不属于对象,属于类(接口),因为默认使用static修饰 (接口中不可以定义方法?可以定义方法,但是不可以定义方法体,JDK1.8中为了加强接口的能力,接口可以存在具体的方法,前提是方法需要被default或者static关键字修饰.)
jdk1.8之前
接口
1.多实现
2.变量类型默认且只能为为public static final
3.函数类型默认且只能为public,只能有public类型的静态成员函数
4.非静态成员函数没有方法体(public abstract),静态成员函数有方法体
5.子类必须实现所有接口函数
6.可以有main方法;可以new一个接口,需要在方法体中实现所有接口函数
7.没有构造器
抽象类
1.单继承
2.变量类型不限(静态变量+非静态变量)
3.函数类型不限(静态函数+非静态函数)
4.非静态函数包含没有方法体的抽象函数. 有方法体的普通函数
5.子类可以不覆写父类的抽象方法,但子类也要申明为抽象类;子类可以选择覆写父类的非抽象方法
6.可以有main方法;不可以new一个抽象类
7.可以有构造器
Jdk1.8
接口中可以有default类型的方法,实现类可以选择实现该方法
意义:默认方法的主要优势是提供一种拓展接口的方法,而不破坏现有代码。另一个优势为该方法是可选的,子类可以根据不同的需求Override或默认实现。
抽象类
下面哪些情况下需要使用抽象类?
正确答案: A B D 你的答案: A B D (正确)
当一个类的一个或多个方法是抽象方法时
当类是一个抽象类的子类,并且不能为任何抽象方法提供任何实现细节或方法体时
当一个类实现多个接口时
当一个类实现一个接口,并且不能为任何抽象方法提供实现细节或方法体时
A项 一个类中有抽象方法则必须申明为抽象类
B项 抽象类中的抽象方法必须由其子类实现,若子类不能实现则子类也必须定义为抽象类
D项 一个类实现一个接口就必须实现其中所有的抽象方法,若该实现类不能实现接口中的所有方法则实现类定义为抽象类