在千锋“逆战”学习第17天
努力的最大好处在于:你可以选择自己想过的生活
三、final
1、final可修饰的内容:
类(最终类)
方法(最终方法)
变量(最终变量)
2、final修饰类:此类不能被继承
String、Math、System均为final修饰的类,不能被继承
3、final修饰方法:此方法不能被覆盖
意为最终方法,不支持子类以覆盖的形式修改
4、final修饰变量:此变量值不能被改变(常量)
【注】所有final修饰的变量只能赋值一次,值不允许改变
package com.qf.day17.t1.finalkeyword;
public class TestFinalKeyword {
public static void main(String[] args) {
final int A=10;//最终变量-->常量
A=20;//无法为final修饰的最终变量进行二次赋值
}
}
/*final*/ class Super{//最终类
public /*final*/ void method(){//最终方法
}
}
class Sub extends Super{//不能继承Super类
public void method(){//不能覆盖method方法
}
}
5、实例常量
实例常量不再提供默认值,必须手动赋予初始值
赋值时机:显示初始化、动态代码块、构造方法
注意:如果在构造方法中为实例常量赋值,必须保证所有的构造方法都能对其正确赋值
package com.qf.day17.t1.finalkeyword;
public class TestFinalVariable {
public static void main(String[] args) {
MyClass mc=new MyClass();//deadline在对象构建完毕之前,为实例常量赋值
System.out.println(mc.num);
}
}
class MyClass{
final int num/*=10*/;//常量必须显示初始化
{
//num=20;
}
public MyClass(){
num=30;
}
public MyClass(int n){
num=n;
}
}
6、静态常量
静态常量不再提供默认值,必须手动赋予初始值
赋值时机:显示初始化、静态代码块
static final double numbers=3.5;//显示初始化
static{
//numbers=3.5;
}
7、对象常量:
final修饰基本类型:值不变
final修饰引用类型:地址不可变
package com.qf.day17.t1.finalkeyword;
public class TestFinalObject {
public static void main(String[] args) {
final int a=10;
final int[] nums=new int[]{11,22,33};
nums[0]=88;
//nums=new int[]{1,2,3,4};//Error nums中的地址不可变
final Student s1=new Student();
//s1.name ="jack";//Error
//s1=new Student();//Error
}
}
class Student{
final String name="tom";
}
课堂案例:final修饰方法形参
package com.qf.day17.t1.finalkeyword;
/*
* 课堂案例:final修饰方法形参
*/
public class TestFinalArguments {
public static void main(String[] args) {
int a=10;
m1(a);
System.out.println(a);//打印的还是main中的局部变量a
final int[] nums={11,22,33};
m2(nums);
m3(nums);
Teacher t1=new Teacher();
t1.name="tom";
m4(t1);
final Teacher[] ts={new Teacher(),new Teacher(),new Teacher()};
//teachers=m5(teachers);//Error
}
public static void m1(final int a){
//a=20;//Error
}
public static void m2(int[] nums){
nums=java.util.Arrays.copyOf(nums, nums.length*2);//Correct
}
public static void m3(final int[] nums){
nums[0]=88;//Correct
}
public static void m4(final Teacher t1){
t1.name="jack";//Correct
//t1.age=31;//Error
//t1=new Teacher();//Error
}
public static Teacher[] m5(Teacher...teachers){
for(int i=0;i<teachers.length;i++){
teachers[i].name=teachers[i].name+i;//Correct拼接字符串
//teachers[i].age+=i;//Error
}
return teachers;
}
}
class Teacher{
String name;
final int age=30;
}
第十章 接口
1、接口的语法:
接口相当于特殊的抽象类,定义方式、组成部分与抽象类类似
使用interface关键字定义接口
没有构造方法,不能创建对象
只能定义:公开静态常量、公开抽象方法
package com.qf.day17.t2.interfaces;
public class TestBasicInterface {
public static void main(String[] args) {
System.out.println(MyInterface.A);
System.out.println(MyInterface.B);
//MyInterface.A="AAA";
//MyInterface.C="CCC";
System.out.println(MyInterface.D);
}
}
interface MyInterface{
//公开静态常量(只能)
public static final String A=“aaa”;
public final String B=“bbb”;
public static String C=“ccc”;
String D=“ddd”;//public static final 隐式修饰
//公开抽象方法
public abstract void m1();
public void m2();//abstract 隐式存在
abstract void m3();//public 隐式存在
void m4();//public abstract 隐式存在
}
2、与抽象类的异同
相同:
可编译成字节码文件
不能创建对象
可以作为引用类型
具备Object类中定义的方法
不同:
所有属性都是公开静态常量,隐式使用public static final修饰
所有方法都是公开抽象方法,隐式使用public abstract修饰
没有构造方法、动态代码块、静态代码块
3、什么是接口
微观概念:接口是一种能力和约定
接口的定义:代表了某种能力
方法的定义:能力的具体要求
经验:java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类的能力
接口支持多实现,可为类扩充多种能力
4、接口的规范
任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类
实现接口中的抽象方法时,访问修饰符必须是public
//定义了一种能力:会游的
interface Swimmable{
public abstract void swim();
}
//定义了一种能力:会跑的
interface Runnable{
public abstract void run();
}
//定义了一种能力:会爬的
interface Climbable{
void climb();
}
//定义了一种能力:会飞的
interface Flyable{
void fly();
}
class Animal{
String breed;
int age;
String sex;
public void eat(){}
public void sleep(){}
}
class Dog extends Animal implements Swimmable{//实现–>落地
String furcolor;
public void run(){
System.out.println(“狗在奔跑……”);
}
public void swim(){
}
}
class Cat extends Animal implements Runnable,Climbable{
String furcolor;
public void run(){//必须用public
System.out.println(“猫在奔跑……”);
}
public void climb(){
System.out.println(“猫在爬树……”);
}
}
class Fish extends Animal{
//public void swim(){}
}
class Bird extends Animal{
//public void fly(){}
}
class Bus implements Runnable{
public void run() {
}
}
class Boat implements Swimmable{
public void swim(){
}
}
5、接口的引用:
同父类一样,接口也可声明为引用,并指向实现类对象
注意:
仅可调用接口中所声明的方法,不可调用实现类中独有的方法
可强转回实现类本身类型,进行独有方法调用
习题七(final)
7、(final属性的初始化)有以下代码:
class MyClass{
final int value;
public MyClass(){}
public MyClass(int value){
this.value=value;
}
}
public class TestMain {
public static void main(String[] args) {
MyClass mc=new MyClass(10);
System.out.println(mc.value);
}
}
选择正确答案: C
A.编译通过,输出10;
B.编译不通过,把第2行改为final int value=10;
C.编译不通过,把第三行改为public MyClass(){value=10;}
8、(final变量)有以下代码:
class MyClass{
public void printValue(final int value){
System.out.println(value);
}
public void changeValue(int value){
value=value*2;
System.out.println(value);
}
}
public class TestMain {
public static void main(String[] args) {
MyClass mc=new MyClass();
int value=5;
final int fvalue=10;
mc.printValue(value);//1
mc.printValue(fvalue);//2
mc.changeValue(value);//3
mc.changeValue(fvalue);//4
}
}
选择正确答案: A
A.编译通过
B.//1 出错
C.//2 出错
D.//3 出错
E.//4 出错
9、(final修饰引用)有以下代码:
class MyValue{
int value;
}
public class TestFinal {
public static void main(String[] args) {
final MyValue mv=new MyValue();
mv.value=100;
//1
System.out.println(mv.value );
}
}
下面说法正确的是: C
A.编译不通过
B.编译通过。在//1处加上:mv.value=200;则编译不通过
C.编译通过,在//1处加上:mv=new MyValue();则编译不通过
10、(final方法、方法覆盖)有以下代码:
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 TestMain {
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
13、(修饰符综合)下列方法声明中正确的是: DF
A.abstract final void m() //abstract 与 final不能一起。
B.public void final m() //public final void m()
C.static abstract void m() //static 与 abstract 不能一起。
D.private final void m()
E.private abstract void m() //abstract不能private。
F.public static final void m()
Chapter 08 接口
Key Point:
●接口的基本语法
●接口的作用
●解耦合
习题:
1、代码改错
package t1;
interface IA{
void m1();
int a=100;
}
class MyClass implements IA{
void m1(){} //public void m1(){}
}
public class TestInterface {
public static void main(String[] args) {
IA ia=new MyClass();
ia.m1();
System.out.println(IA.a);
}
}
2、代码填空:
interface IA{
void m1();
void m2();
}
abstract class MyClassA implements IA{
public void m1(){}
}
class MyClassB extends MyClassA{
public void m2() {}
}
中国加油!武汉加油!千锋加油!我自己加油!
来源:CSDN
作者:Y_L_Lee
链接:https://blog.csdn.net/Y_L_Lee/article/details/104494104