千锋逆战班
在千锋"逆战”学习第17天,
每个人生阶段都需要努力去扮好自己的角色,越努力越轻松,越坚强越幸运!
加油!
final练习
1(final属性的初始化)有如下代码
class MyClass7{
final int value;
public MyClass7() { }
public MyClass7(int value) {
this.value=value;
}
}
public class Test7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyClass7 mc=new MyClass7(10);
System.out.println(mc.value);
}
}
选择正确答案:
A. 编译通过,输出 10
B. 编译不通过,把第 2 行改为 final int value = 10;
C. 编译不通过,把第 3 行改为 public MyClass(){ value = 10; }
答案选择 C
2(final变量)有如下代码
class MyClass8{
public void printValue(final int value) { \\局部定义一个final 类型变量
System.out.println(value);
}
public void changeValue(int value) {局部定义一个int 类型变量
value=value*2;
System.out.println(value);
}
}
public class Test8 {
public static void main(String[] args) {
MyClass8 mc=new MyClass8();
int value=5;
final int fvalue=10;
mc.printValue(value);//1
mc.changeValue(fvalue);//2
mc.changeValue(value);//3
mc.changeValue(fvalue);//4
}
}
选择正确答案
A. 编译通过
B. //1 出错
C. //2 出错
D. //3 出错
E. //4 出错
答案选择 A
3( final 修饰引用)有如下代码
class MyValue{
int value;
}
public class Test9 {
public static void main(String[] args) {
// TODO Auto-generated method stub
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
4
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 Test {
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
5(修饰符综合)
下列方法声明中正确的是:
A. abstract final void m() f
B. public void final m() f
C. static abstract void m() f
D. private final void m() t
E. private abstract void m() f
F. public static final void m()t
答案:D F
A中abstract 与final冲突
B中void 和final位置放反
C中static与abstract冲突
E中private与abstract冲突
interface练习(一)
1 代码改错
interface IA{
void m1(); \\默认为 publlic abstract修饰
int a=100;
}
class MyClass implements IA{
void m1() {} \\实现接口中的抽象方法时,访问修饰符必须是public
}
public class TestInterface {
public static void main(String[] args) {
// TODO Auto-generated method stub
IA ia=new MyClass();
ia.m1();
System.out.println(IA.a);
}
}
将MyClass类中m1()权限方法改为public
2 代码填空
interface IA{
void m1();
void m2();
}
_________ class MyClassA implements IA{
public void m1() {}
}
class MyClassB extends MyClassA{
_________________{}
}
答案
abstract
public void m2()
今日总结
final:
I. 修饰类:此类不能被继承
II. 修饰方法:此方法不能被覆盖
III. 修饰变量:此变量值不可改变–常量(无初始值、只允许赋值一次)
1). 局部常量:显示初始化
2). 实例常量的赋值:显示初始化、动态代码块、构造方法。
要求:
a).实例常量赋值deadline:在构造方法完成之前,为实例常量赋值即可。
b).如果在构造方法中为实例常量赋值,必须保证所有的构造方法都可正确赋值。
3). 静态常量的赋值:显示初始化、静态代码块。
要求:
a). 静态常量赋值deadline:在类加载完成之前(通过类名调用之前),为静态常量赋值即可。
IV. 不同常量类型的特点:
1). 基本数据类型常量:值不可变。
2). 引用数据类型常量:地址不可变。
接口:
1. 接口的语法:
I. 相当于特殊的抽象类,定义方式、组成部分,与抽象类类似。
II. 接口中只能定义公开静态常量(变量)
III. 接口中只能定义公开抽象方法(方法)
IV. 接口不是类
2. 接口与抽象类的异同:
I. 相同:
1). 可以编译成字节码文件
2). 不能创建对象。(接口不是类,不是模板的概念,也没有构造方法)
3). 可以声明引用。
4). 具备Object定义的方法。
II.不同:
1). 接口中的属性只能是公开静态常量(隐式使用public static final修饰)
2). 接口中的方法只能是公开抽象方法(隐式使用public abstract修饰)
3). 没有构造方法、没有动态代码块、没有静态代码块
3. 接口的概念:
I. 接口是种能力和约定
1). 接口的定义:能力
2). 方法的定义:约定
II. 经验:Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类能力。
III.接口支持多实现,可为类扩充多种能力。
4. 接口的规范:
I. 任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类。
II. 实现接口中的抽象方法时,访问修饰符必须是public。
5. 接口引用:
I. 同父类一样,接口也可声明为引用,并指向实现类对象。
II. 注意:
1). 仅可调用接口中所声明的方法,而不可调用实现类中独有的方法。
2). 可强转回实现类的本身类型,进行独有的属性和方法的调用。(强转前通过instanceof判断)