final关键字
关键字final是最终的意思,可以用来修饰类、方法、变量
修饰类:该类称为最终类,特点是不能被继承了
修饰方法:该方法被称为最终方法,特点是不能被重写了
修饰变量:该变量只能被赋值一次
final修饰变量的注意:
final修饰基本数据类型的变量,变量存储的数据不能被改变
final修饰引用数据类型的变量,变量存储的地址不能被改变,但地址所指向的对象的内容是可以改变的
常量:
使用了final static 修饰的成员变量就被称为常量
作用:
通常用于记录系统的配置信息
public static final String SCHOOL_NAME = “一起来学JAVA";
注意:常量的命名规范:建议使用大写英文单词,多个单词使用下划线连接起来
使用常量记录系统配置信息的优势、执行原理:
代码可读性更好、可维护行也更好
程序编译后,常量会被“宏替换”:出现常量的地方全部会被替换成其记住的字面量,这样可以保证使用常量和直接使用字面量的性能是一样的
抽象类
什么是抽象类
在Java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法。
abstract修饰类,这个类就是抽象类;
修饰方法,这个方法就是抽象方法(抽象方法只有方法签名,不能写方法体)。
抽象类的注意事项、特点:
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
类该有的成员(成员变量、方法、构造器)抽象类都可以有
抽象类中可以有静态的main方法。可以运行
抽象类最主要的特点:
抽象类不能创建对象,仅作为一种特殊的父类,让子类继承并实现
一个类继承抽象类,必须重写完抽象类的全部抽象方法,否则这个类也必须定义成抽象类
抽象类的应用场景和好处是什么?
两种主要的应用场景,一种是:用抽象类,我们可以把子类中相同的代码,包括方法签名都抽上来,这样能更好的支持多态,以提高代码的灵活性。
一种是:反过来用,我们不知道系统未来具体的业务实现时,我们可以先定义抽象类,将来让子类去继承实现,以方便系统的扩展。
模板方法设计模式
1、定义一个抽象类。
2、在里面定义2个方法
一个是final修饰的模板方法:把相同代码放里面去。
一个是被模板方法调用的抽象方法:具体实现交给子类完成。
public abstract double discount(); public final void shopping() { System.out.println("开始购物"); System.out.println("消费" + price); System.out.println("打折后" + discount()); System.out.println("购物结束,请支付"); }
接口类
用interface修饰的类就是接口
简单的说,接口就是一种被规范的标准,只要符合这个标准都可以通用,接口的表现
在于对行为的抽象。 就好比插座,每个厂商生产的插座我们都可以用,这是因为他们
有同一个标准,这里插座就是接口。
接口没有构造器,不能创建对象,接口是用来被类实现的(implements),实现接口的类称为实现类
接口里的成员变量都是 public static final 修饰的常量
接口里的成员方法一般都是抽象方法
public final int num1=10;√
num1=20;×
int num2=10;√
num2=20;×
上面两个正确的写法等价
public abstract void method1();√
void method2();√
注意事项:
类与接口的关系——一个类可以实现多个接口
但必须重写完全部接口的全部抽象方法,否则实现类需要定义为抽象类
修饰符 class 实现类 implements 接口1, 接口2, 接口3 , ... {
}
接口与接口的关系——多继承【java是单继承、多层继承=>解决java中子类不能同时继承多个父类的问题】
接口的好处
弥补了类单继承的不足,类可以同时实现多个接口。
让程序可以面向接口编程,这样既不用关心实现的细节,也可以灵活方便的切换各种实现。
一个类我们说可以实现多个接口,同样,一个接口也可以被多个类实现的。这样做的好处是我们
程序就可以面向接口编程了,这样我们程序员就可以很方便的灵活切换各种业务实现了。
接口的其他细节
JDK8开始新增的三种方法【除私有方法默认被public修饰】
1、默认方法
使用default修饰,使用实现类的对象调用
2、静态方法
static修饰,必须为当前接口名调用
3、私有方法
private修饰,JDK9开始才有的,只能在接口内部使用
public interface A{
/**
* 1、默认方法(实例方法):使用用default修饰,默认会被加上public修饰。
* 注意:只能使用接口的实现类对象调用
*/
default void test1(){
...
}
/**
* 2、私有方法:必须用private修饰(JDK 9开始才支持)
*/
private void test2(){
...
}
/**
* 3、类方法(静态方法):使用static修饰,默认会被加上public修饰。
* 注意:只能用接口名来调用。
*/
static void test3(){
...
}
}
关于接口的多继承
一个接口可以同时继承 多个接口
public interface C extends B , A{
}
接口的其他注意事项 (了解)
1、一个接口继承多个接口,如果多个接口中存在方法签名冲突,则此时不支持多继承
2、一个类实现多个接口,如果多个接口中存在方法签名冲突,则此时不支持多实现
3、一个类继承了父类,又同时实现了接口,父类和接口中有同名的默认方法,实现类会优先用父类的
4、一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可