JAVA中继承的特点
java支持单继承,不支持多继承,java支持多层继承
单继承:一个子类只能继承一个父类(一个孩子只能有一个亲爹)
多继承:一个子类不能同时继承多个父类
多层继承:A类可以继承B类,B类可以继承C类,A类中拥有B、C类中的所有属性和方法。说明:越是顶层的类,定义的功能越是共性功能,功能和属性就越少;越是底层的类,定义的特有功能和属性就越多,就更加强大。学习一个体系的时候,先学顶层的类,共性功能学习完,学习底层特有的方法即可;使用一个类创建对象的时候,选择底层的类型,功能更多更强大。
原因:如果支持多继承,那么可能一个子类继承了两个父类,两个父类中有相同的方法声明,却拥有不同的方法实现。子类继承之后,就不知道该走哪个父类的方法实现了。(安全隐患)
代码演示:
package 继承;
public class 继承的特点 {
public static void main(String[] args) {
ErZi er = new ErZi();
er.show();
}
}
class YeYe{
public void show() {
System.out.println("我是爷爷辈");
}
}
class BaBa extends YeYe{
}
class ErZi extends BaBa{
}
//class NuEr extends YeYe BaBa{
// 这里会报错
//}
输出结果:
我是爷爷辈
所以我们可以得到上面所说特定,可以单继承、不可以多继承,但是可以多层继承。
final关键字
单词含义:最终的,最后的,表示不能再改变的。
final关键字:可以修饰类、方法、变量
修饰类:
表示一个最终类,表示不能有子类,【不能被其他类继承】
一旦一个类型不能被继承,那么其中所有的方法都不能被重写
不影响当前类的方法被调用
修饰方法:
表示一个最终方法,【该方法不能被重写】
修饰变量:
表示一个最终变量,该【变量变成了常量】,就只能赋值一次
当前项目中,常用的常量一般都定义在一个类的成员位置,甚至专门定义一个常量类
定义常量的好处:见名知意,容易理解;可维护性高
代码演示(都在注释里了):
public class final关键字 {
//这里声明了三个变量,但是用了final关键字,所以这三个变量就变成了常量,他们就各自代表着后面所赋予的值,值不会再被改变。
public static final double PI = 3.1415;
public static final int SECONDS_PER_MINITE = 60;
public static final int MINITES_PER_HOUR = 60;
public static void main(String[] args) {
//PI = 3; 这里尝试想要修改PI的值,会报错 PI被final声明了,值不能再被修改
SHU shu = new SHU();
shu.show();
shu.show2();
}
}
class YE{
public final void show() {
System.out.println("我是爷爷");
}
}
class FU extends YE{
// public void show() { //这里就会报错,提示不能被继承
// System.out.println("我是爷爷的儿子");
// }
public void show1() {
System.out.println("我是爸爸");
}
}
final class SHU extends YE{
public void show2() {
System.out.println("我是叔叔,我还要攒钱娶媳妇,不能被其他人继承");
}
}
//class ZI extends SHU{ //这里就会报错,这个类已经不能被继承了。
//
//}
输出结果:
我是爷爷
我是叔叔,我还要攒钱娶媳妇,不能被其他人继承
Final修饰成员变量的注意事项
1.final修饰成员变量,该成员变量必须在创建对象之前进行赋值,否则编译失败
2.final修饰成员变量,固定的不是成员变量拥有的默认值,如果固定的是默认值,那么将导致被final修饰的成员变量的值永远无法修改,只能是默认值,这也不符合语法规则
对被final修饰的成员变量的赋值有两种实现方式:
定义成员变量的时候手动赋值
利用构造器对成员变量进行赋值
3为什么不行?
解释:如1所描述,被final修饰的成员变量必须在对象创建之前进行赋值,如果方法3可以,那么我们知道对象创建后,才能调用方法3,也就是说成员变量利用方法3进行赋值,会导致成员变量的赋值发生在对象创建之后
5.为什么被Final修饰的成员变量必须在对象创建之前进行赋值?
理解:被final关键字修饰的东西有一个特点,那就是一旦被修饰,那么它的值也就终生不变,可见final关键字起到了固定的作用,既然起到固定那么,你就要提前告诉final固定的是谁,如果允许被final修饰的成员变量赋值发生在对象创建之后,那么对象创建完成后final固定的值还是未可知的
6.final修饰成员变量和final修饰局部变量的区别与联系:
①被final修饰的成员变量与局部变量均具有:一旦赋值,该值就终身不变
②被final修饰的成员变量必须要在创建对象之前进行赋值,否则会编译失败,
③但是局部变量可以不赋值,但是没有被赋值的局部变量不能够被使用,一旦被使用就会编译失败
.综上:一旦决定使用final关键字来修饰成员变量或者局部变量,一定要做到提前赋值