继承那些事?!!

在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:

class 父类{

}

class子类 extends父类{

}

一,继承的最大好处就是为了实现代码的复用。那么,子类到底从父类得到的什么呢?

1.继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

注意:(java中只支持单继承,不支持多重继承,如果想实现多继承可以通过接口的方式实现。)

2.作为父类:可以有无数个子类。       作为子类:只能有一个直接父类。

二,子类继承了父类,是否意味着子类可以继承父类的所有成员?(答案是否定的!!

1.父类的私有成员,子类无法继承。

2.子类不能从父类继承构造方法.

3.父子类不在同一个包中,但是成员没有通过任何的访问修饰符。

三,super与this关键字

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类,类似于C#中我们学过的base关键字。

this关键字:指向自己引用,本来的成员属性

要讲super就不能不提this,下面从4个角度讲解一下super(需要对比的时候拿this对比一下,加深理解)
1. super关键字表示超(父)类的意思。this变量代表对象本身。
2. super访问父类被子类隐藏的变量或覆盖的方法。当前类如果是从超类继承而来的,当调用super.XX()就是调用基类版本的XX()方法。其中超类是最近的父类。
3.调用super() 父类构造函数的时候只能调用在子类构造函数的第一行
4.this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this。并且this只和特定的对象关联,而不和类关联,同一个类的不同对象有不同的this
例如:
    class Person {  
        protected void print() {  
           System.out.println("The print() in class Person.");  
        }  
    }         
    public class DemoSuper extends Person {        
        public DemoSuper(){        
           super(); //调用父类的构造方法,而且放第一行,如果不写,系统自动加  
        }  
        public void print() {  
           System.out.println("The print() in class DemoSuper.");  
           super.print();// 调用父类的方法  
        }         
        public static void main(String[] args) {  
           DemoSuper ds = new DemoSuper();  
           ds.print();  
        }  
    }

四,重写override

一个继承链中,父类的方法对于子类来说具有相同的语义,但是不同的细节操作,因此子类需要override父类的这个方法以满足自己的需求。

注意的点:

1、方法名,参数表一定和父类中的相同,返回类型相同,或者是子类。

1、访问权限一定不低于父类的实例方法

2、抛出的异常一定是父类方法抛出的异常相同,或者子类。

总结

方法的重写(Overriding)和重载(Overloading)是java多态性的不同表现,重写是父类与子类之间多态性的一种表现,重载可以理解成多态的具体表现形式。

  • (1)方法重载是一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同,则称为方法的重载(Overloading)。
  • (2)方法重写是在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一样,返回值也一样的方法,就称为重写(Overriding)。
  • (3)方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。

五,构造函数:

构造函数不能继承,但是子类一定可以(也必须)借用父类的构造函数。java保证:除了Object类对象,每一个类的实例在构造时,先去调用父类的构造函数。

我们自定义类的构造函数的第一句一定是super(xx,...),如果不是,那么第一句就一定是this(xx,...)去调用本类的另一个构造函数。

如果子类构造函数不显式的调用super(),那么,javac会自动插入super(),也就是父类无参数的构造函数。 

对于构造函数,其实类中所有构造函数都是隐式static的。很明显的例证就是 构造函数無需通過实例就可以调用。

六.构造方法:

1.构造方法是生成实例对象的唯一方法。
2.子类不能从父类继承构造方法
3.好程序一定是子类的构造方法调用父类的构造方法
4.如果子类没调用父类方法,系统回默认的调用父类无参构造方法。
七,抽象类和抽象方法的精华所在!!
1.抽象类用abstract修饰。
2.抽象方法不能有方法体,甚至连{}都不能有。
3.抽象方法必须在抽象类中
4.抽象类不能实例化,
5.抽象类可以有构造函数
6.抽象类可以有普通方法。
7.抽象方法必须被子类重写,除非子类也是一个抽象类。
八,final的应用
1.用final修饰的类,不能在被继承,
public final class pet{
  class pet extends pett{//次行出现错误

}
}

2.用final修饰的方法不能被子类重写。

3.用final修饰的变量,只能赋值一次!!

 
 
 
 
原文地址:https://www.cnblogs.com/www-yang-com/p/8995116.html