final关键字
1.final意为常量、不可变得,是java中的关键字。
2.final可以修饰属性、方法和类。
finla修饰属性
1.静态变量:被static修饰静态变量不能被final修饰用构造方法赋值。被static修饰的静态变量进入了方法区,在方法区里只的静态变量只会运行一次,所以每实例化对象就要给静态变量赋值。final是修饰常量,所以会报错
所以,final在修饰静态变量的时候,只能在声明的时候就给他赋定制;
static final int a = 10;
2.修饰成员变量:被final修饰的成员变量可以在声明时赋值,也可以先创建,再用构造方法为其赋值,每实例化次对象就为其赋值一次,且在这个对象使用时不能被改变
final int num;
public Demo7(int num){
this.num =num;
}
public static void main(String[] args) {
Demo7 d1 = new Demo7(10);
Demo7 d2 = new Demo7(20);
}
finla修饰方法
1.被final修饰的成员方法不能被重写
2.在形式参数前加final,形参在赋值后不被改变
public void m2(final int a){//不会被改变
System.out.println(a);
//a++;方法体中会改变a值的语句都会报错
}
finla修饰类
用final修饰类:不能被定义为抽象类,也不能被继承。所以用final修饰的类只能作为子孙类。因为集成父类就相当于父类的扩展,final是常量,当然不不允许自己修饰的类被改变。所以会报错
接口(interface)
在实现一个项目的时候,有时必须从几个类中派生出一个子类,来继承父类的属性、方法。但是java不支持多继承,所以,java开发者设计了接口,用来弥补不能实现多继承的缺点。那什么是接口呢?从本质上讲,接口是一种特殊的抽象类,这种抽象类在JDK8之前只包含常量和抽象方法的定义。在JDK之后,更新了接口,现在在接口里面可以定义常量和抽象方法、默认方法和静态方法,而且接口可以多继承。
接口的定义:使用 interface 关键字用来声明一个接口。
[访问修饰符] interface 接口名称 [extends 其他的接口名1,….其他的接口名n] {
// 声明常量 抽象方法 静态方法 默认方法
}
接口的使用:类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
[访问修饰符] class 类名 implements 接口名1,接口名2……{ }
结合继承:
[访问修饰符] class 类名 extends 父类名 implements 接口名1,接口名2……{ }
接口的特性:
与继承关系类似,接口与实现类之间存在多态性,而且接口不能实例化对象(无构造方法),但可以声明对象的引用(多态性)。接口不是被类继承了,而是要被类实现。
如果实现接口的类中没有实现接口中的全部方法,必须将此类定义为抽象类。
代码演示(接口的定义):
public interface MyInterface{
//接口不能实例化对象,不能有构造方法
//所以有默认方法,让子类来实例化对象
//接口可以声明成员变量
//public static final int num =10;
//public static final 都默认不写
public static final int num1 =15;
int num = 10;
//接口可以声明抽象方法
//public 可以默认不写
public void m1();
void m2();
//在JDK8之前,接口只能声明前两种类型,但是在8以后,又多了两种
//默认方法
default void m3(){
System.out.println("默认方法m3");
}
//静态方法
static void m4(){
System.out.println("静态方法m4");
}
}
接口的多继承即接口的实现
//接口可以实现多继承,interface
public interface MyInterfaceA {
}
public interface MyInterfaceB {
}
public interface MyInterface extends MyInterfaceA,MyInterfaceB{
//接口可以多继承,当一个类实现这个接口时,要重写所有继承接口的抽象方法
public static final int num1 =15;
int num = 10;
//接口可以声明抽象方法
//public 可以默认不写
public void m1();
void m2();
//默认方法
default void m3(){
System.out.println("默认方法m3");
}
//静态方法
static void m4(){
System.out.println("静态方法m4");
}
}
//定义类
//实现接口
//因为接口里面有抽象方法,所以
//要么给这个类加abstract使这个类称为抽象类
//要么重写接口里面的所有抽象方法
//public class abstract MyInterfacement implements MyInterface{
public class MyInterfacement implements MyInterface {
//implements来实现类继承接口
public void m1(){
System.out.println("重写后的m1方法");
}
public void m2(){
System.out.println("重写后的m2方法");
}
//可以直接用类名调用接口的成员变量
public static void main(String[] args) {
System.out.println(MyInterface.num);
System.out.println(MyInterface.num1);
//子类来实例化对象,调用父类的方法
MyInterfacement my = new MyInterfacement();
my.m1();
my.m2();
my.m3();
MyInterface.m4();//静态的
}
}