一、final关键字
用于声明类、方法、属性
修饰类
不能被定义为抽象类或是接口,不可被继承
修饰方法
子类里不可重写覆盖父类中final修饰的方法。
修饰属性
定义就必须直接赋值或者在构造方法中进行赋值,并且后期都不能修改。
在声明时同时赋值,往往与static一起使用
声明时不赋值,必须在构造方法中逐一赋值
总的原则:保证创建每一个对象的时候,final属性的值是确定的
package com.ff.javaoop.lei4.finalDemo;
/*public final class Animal {*/
// public final interface class Animal { //final修饰的类不能定义为接口
// public final abstract class Animal{ //final修饰的类不能定义为抽象类
public class Animal{
/*
变量被final修饰变为常量,不能修改
*/
final static int age=10; //直接初始化赋值常量,建议static修饰,这样内存中只有一份,共享
final int num; //在创建的每一个对象中,包含一个常量,必须在构造方法中初始化赋值
public Animal(int num) { //构造方法初始化常量
this.num = num;
// this.num=5;
}
public final void eat(){} //final修饰的父类方法子类不能重写覆盖
public static void main(String[] args) {
Animal f1=new Animal(5);
Animal f2=new Animal(20);
}
}
package com.ff.javaoop.lei4.finalDemo;
/*public class Dog extends Animal{*/ //报错,因为Animal类被final修饰,不能被继承
public class Dog {
}
二、接口
从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。作为上层设计需求,设计功能。
1.接口存在的意义
java中一个类只能有一个父类,所以用接口可以实现多继承的逻辑 。
2.接口的特性
1.接口不可以被实例化
2.实现类必须重写接口的所有方法
3.实现类可以实现多个接口
4.接口中的变量都是静态常量
3.接口的定义:使用 interface 关键字用来声明一个接口。
[访问修饰符] interface 接口名称 [extends 其他的接口名1,….其他的接口名n] {
// 声明常量
// 抽象方法
}
package com.ff.javaoop.lei4.interfaceDemo;
public interface Animal {
//接口定义的成员变量是常量,默认前面为 public static final
int NUM=10;
//JDK8以后,接口中定义的抽象方法默认被 public abstract 修饰
void eat();
void sleep();
}
4.接口的使用:类使用implements关键字实现接口。
在类声明中,Implements关键字放在class声明后面。
[访问修饰符] class 类名 implements 接口名1,接口名2……{ }
结合继承:
[访问修饰符] class 类名 extends 父类名 implements 接口名1,接口名2……{ }
5.接口、类之间的关系
接口与接口之间的关系
接口可以继承接口。一个接口可以继承多个接口
package com.ff.javaoop.lei4.interfaceDemo;
public interface InterfacaseA extends Animal,InterfaceB { //一个接口可以继承多个接口
}
类与接口的关系
类可以实现接口。一个类可以实现多个接口
类与类之间的关系
一个类只能继承一个父类
package com.ff.javaoop.lei4.interfaceDemo;
public class Dog extends Animal2 implements Animal,InterfacaseA,InterfaceB{ //一个类可以实现多个接口,一个类只能继承一个父类
@Override
public void eat() {
System.out.println("狗吃肉");
}
@Override
public void sleep() {
}
}
测试类
package com.ff.javaoop.lei4.interfaceDemo;
public class TestInterface {
public static void main(String[] args) {
System.out.println(Animal.NUM);
Animal dog=new Dog();
dog.eat();
Animal animal=new Animal() {
@Override
public void eat() {
System.out.println("111");
}
@Override
public void sleep() {
System.out.println("222");
}
};
animal.eat();
animal.sleep();
}
}
运行结果
10
狗吃肉
111
222