知识归纳
final修饰符
- final修饰类的特点,此类不能被继承(防止类中的方法被覆盖)。
- final修饰方法:此方法不能被覆盖;final修饰变量:此变量的值不能改变,只能访问,不能再次赋值。
- final修饰基本类型:值不可变;final修饰引用类型:地址不可变 。
接口
- 接口的语法:相当于特殊的抽象类,定义的方式、组成部分与抽象类相似,应用的关键字:interface;接口中只能定义公开静态的常量、公开抽象的方法(隐式存在)。
- 接口与抽象类:可编译成字节码文件;不能创建对象(接口不是类,没有模板的概念,也没有构造方法、动态代码块、静态代码块);可以作为引用类型;具备Object类中所定义的方法。
- 接口是一种能力和约定implements
接口定义:能力
方法定义:约定 - Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充多种能力、接口支持多实现,可为类扩充多种能力。
- 任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类、实现接口中的抽象方法时,修饰符必须时public
- 同父类一样,接口也可以声明为引用,并指向实现类的对象,仅可调用接口中所声明的方法,可强转实现类的本身类型,进行独有方法的调用。
今日练习
- 如下代码:
class MyClass{
final int value;
public MyClass(){}
public MyClass(int value){
this.value = value;
}
}
public class TestT7 {
public static void main(String[] args) {
MyClass mc = new MyClass(10);
System.out.println(mc.value);
}
}
选择正确的答案:
A. 编译通过,输出10
B.编译不通过,把第二行改为final int value = 10;
C.编译不通过,把第三行改为public MyClass(){value = 10;}
答案:C
- 有如下代码
class MyClass1{
public void printValue(final int value){
System.out.println(value);
}
public void changeValue(int value){
value = value * 2;
System.out.println(value);
}
}
public class TestT8 {
public static void main(String[] args) {
MyClass1 mc = new MyClass1();
int value = 5;
final int fvalue = 10;
mc.printValue(value);
mc.printValue(fvalue);
mc.changeValue(value);
mc.changeValue(fvalue);
}
}
选择正确答案
A.编译通过
B.//1出错
C.//2出错
D.//3出错
E.//4出错
答案:A
- 有如下代码
class MyValue{
int value;
}
public class TestT9 {
public static void main(String[] args) {
final MyValue mv = new MyValue();
mv.value = 100;
//1
System.out.println(mv.value);
}
}
下面说法正确的是:
A.编译不通过
B.编译通过。在//1处加上:mv.value = 200;则编译不通过
C.编译通过。如果在//1处加上:mv = new MyValue();则编译不通过
答案:C
- 有如下代码
class Super{
public final void m1(){
System.out.println("m1() in Super");
}
public void m1(int i){
System.out.println("m1(int) in Super");
}
}
class Sub extends Super{
public void m1(int i){
System.out.println("m1(int) in Sub");
}
public void m1(double d){
System.out.println("m1(double) in Sub");
}
}
public class TestT10 {
public static void main(String[] args) {
Sub s = new Sub();
s.m1();
s.m1(10);
s.m1(1.5);
}
}
以上程序是否能编译通过?如果可以,输出运行结果;如果不可以,应该怎样修改?
参考答案:
能够编译通过
结果为:
m1() in Super
m1(int) in Sub
m1(double) in Sub
-
下列方法声明中正确的是:
A.abstract final void m()
B.public void final m()
C.static abstract void m()
D.private final void m()
E.private abstract void m()
F.public static final void m()
答案:DF -
代码改错:
interface IA{
void m1();
int a = 10;
}
class MyClass3 implements IA{
void m1(){}//第六行
}
public class TestT1 {
public static void main(String[] args){
IA ia = new MyClass3();
ia.m1();
System.out.println(IA.a);
}
}
参考答案:
第六行改为public void m1(){}
- 代码填空
interface IA{
void m1();
void m2();
}
______ class MyClassA implements IA{
public void m1(){}
}
class MyClassB extends MyClassA{
_______________{}
}
参考答案:
abstract
public void m2(){}
每日一语
凡过于把幸运之事归功于自己的聪明和智谋的人多半是结局很不幸的。
Credit for all the lucky too smart and intelligent people are mostly very sad ending
千峰加油!武汉加油!