java面向对象的三大特性——继承
继承
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率。
class Son extends Super{ ... }
继承父类的子类可以进行以下操作:
- 1、子类可以不受到限制调用父类非private的属性和方法
- 2、子类可以拥有自己属性和方法,即子类可以对父类进行扩展
- 3、子类可以用自己的方式实现父类的方法(父类方法的重写)
继承中需要理解的三个点:构造器、protected关键字、向上转型。
注意点:
当子类的属性与父类的属性名(非private 和 default 修饰的要是同包下)相同时,子类中要调用父类的该属性时,可以使用 super.'属性名'。
当子类将父类的方法重写了,而在子类中需要调用父类的该被重写的方法时,可以使用 super.'方法'。
class SuperClass{
private int age;
public String name="aa";
public void show(){
System.out.println("SuperClass");
}
}
class SonClass extends SuperClass{
private String name="SonClass ";
public void show(){
super.show();
System.out.println("SonClass " + name + super.name);
}
}
构造器
子类会默认调用父类的构造器,但是如果没有默认的父类构造器,子类必须要显示的指定父类的构造器,而且必须是在子类构造器中做的第一件事(第一行代码)。
1、如果父类不主动创建构造函数或者父类有无参的构造函数则子类可以不考虑父类的构造函数。
2、如果子类需要继承父类的含参构造函数则需要使用super命令(如果父类包含多个含参构造函数则依据参数使用super命令)
3、如果父类建立了构造函数且都含有参数,则子类必须使用super命令。
protected
对于protected而言,它指明就类用户而言,他是private,但是对于任何继承与此类的子类而言或者其他任何位于同一个包的类而言,他却是可以访问的。
- public (对任何人都是可用的)
- protect (继承的类可以访问以及和private一样的权限)
- default (包访问权限,即在整个包内均可被访问)
- private (除类型创建者和类型的内部方法之外的任何人都不能访问的元素)
向上转型
向上转型:子类引用的对象转换为父类类型称为向上转型。通俗地说就是是将子类对象转为父类对象。此处父类对象可以是接口
向下转型:父类引用的对象转换为子类类型称为向下转型。
转型需要注意的问题:
向上转型时,父类指向子类引用对象会遗失除与父类对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译时,系统会提供找不到方法的错误。
在向下转型过程中,分为两种情况:
情况一:如果父类引用的对象如果引用的是指向的子类对象,那么在向下转型的过程中是安全的。也就是编译是不会出错误的。
情况二:如果父类引用的对象是父类本身,那么在向下转型的过程中是不安全的,编译不会出错,但是运行时会出现java.lang.ClassCastException错误。它可以使用instanceof来避免出错此类错误。实例如下:
class AA{
private int age;
public void show(){
System.out.println("AA");
}
}
class BB extends AA{
private String name;
public void show(){
System.out.println("BB");
}
public void print(){
System.out.println("BBBBBBBBBB");
}
}
public class ExtendsDemo {
public static void main(String[] args) {
BB b = new BB();
//向上转型
AA ab = (AA)b;
//不可以调用BB的独有的方法
ab.show();
AA a = new AA();
//向下转型
//BB ba = (BB)a;//直接报错ClassCastException
if(a instanceof BB){
BB ba = (BB)a;
System.out.println("向下");
}
}
}
子类与父类之间的转型总结:
1、父类引用可以指向子类对象,子类引用不能指向父类对象。
2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。
如Father father = new Son();
3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。
如father就是一个指向子类对象的父类引用,把father赋给子类引用son 即Son son =(Son)father;
其中father前面的(Son)必须添加,进行强制转换。
4、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效
5、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。体现了JAVA的抽象编程思想。
慎用继承
继承存在如下缺陷:
1、父类变,子类就必须变。
2、继承破坏了封装,对于父类而言,它的实现细节对与子类来说都是透明的。
3、继承是一种强耦合关系。
问一问自己是否需要从子类向父类进行向上转型。如果必须向上转型,则继承是必要的,但是如果不需要,则应当好好考虑自己是否需要继承。