面向对象三大特征之 继承
java面型对象三大特征之继承
重点速览:
- 使用extends.父类名,实现javadji继承,如果没有则默认为继承了java.lang.object;
- java中只允许单继承,如果想实现多继承的效果就要用到接口
- 子类可以通过继承来获得父类属性为public 、protected、default的成员变量,成员方法,但不可以继承private的方法和变量
- 用final修饰的类不能被继承,用final修饰的常量值不能被改变,用final修饰的方法不能被重写(慎用,好坏皆有)
- this and super关键字使用
一 .如何实现继承
java中只支持单一继承,子类只能继承非private修饰的成员
1.单一继承
- 继承外部类
public class Teacher extends people {
private String course;
}
继承内部类
public class Book {
class science{
public void intro(){
System.out.println("这本书属于科学类");
}}
class physic extends Book.science {
public void intro(){
super.intro();
System.out.println("这本书是物理书");
}
}
public static void main(String[] args){
Book b=new Book();
science s=b.new physic();
s.intro();
}
}
这本书属于科学类
这本书是物理书
2.多继承关系
这里所讲的多继承实际上使用的是接口,实现了多继承关系,java中类的继承只能是单继承
public class Teacher extends people implements a{
private String course;
public void worktime(){
System.out.println("星期一9:00-10:00");
}
}
interface a{
public void worktime();
}
二.抽象类
java中比较特殊的类,类中包含有方法的声明而没有方法的实现。当然抽象类中也可以包含已经实现的方法,在使用中不能实例化抽象类,但可以实例化继承抽象类的子类
public class Book extends knowledge {
public void pass(){
System.out.println("以纸为载体进行传播");
}
public static void main(String[] args){
Book b=new Book();
b.price();
b.pass();
}
}
abstract class knowledge{//这是我们定义的抽象类
public void price(){
System.out.println("知识是无价的");
}
public void pass();
}
知识是无价的
以纸为载体进行传播
三.final关键字
用final修饰常量
变量用final修饰后变为常量,常量的值不能改变
public class Main {
public static void main(String[] args) {
final int a=10;
System.out.println(a);
a=23;
}
}
这时候虚拟机就抛出异常,提示:
The final local variable a cannot be assigned. It must be blank and not using a compound assignment
final修饰方法
方法经过final修饰后,这个方法就不可以被重载了------也就失去了面向对象的特点
public class Final {
//定义fnal修饰的方法
public final void display() {
System.out.println("这是父类的final方法");
}
}
class SonFinal extends Final{
public void display() {
System.out.println("这是子类重写父类的方法");
}
}
这样经过Main()方法调试之后就抛出异常了,这是异常:
class Fl.SonFinal overrides final method display.()
他说我们重写了final方法,总之在父类中写final方法有很多的限制,方法重写就受限制了。final修饰类
用final修饰该类后,该类就不能被继承了
public final class Final {
//定义fnal修饰的方法
public void display() {
System.out.println("这是父类的final方法");
}
}
class SonFinal extends Final{
public void display() {
System.out.println("这是子类重写父类的方法");
}
}
类似的代码,这样之后又会显示异常了:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from SonFinal to Final
at Fl.Main.main(Main.java:5)
关键信息:cannot convert(变换)from SonFinal(自定义的子类) to Final(父类)