> 文档中心 > 面向对象三大特性02-继承详解

面向对象三大特性02-继承详解


2. 继承

      2.1 继承概念及代码示例

  继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。

       extends的意思是“扩展”。子类是父类的扩展。

package oop.Demon05;//子类 也叫派生类public class Student extends Person{}

       JAVA中类只有单继承,没有多继承

继承是类和类之间的一种关系除此之外,类和类之间的关系还有依赖,组合,聚合等。

继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。

代码示例:  

import oop.Demon05.Student;public class Application {    public static void main(String[] args) { Student student = new Student(); student.say();  //父类的方法 System.out.println(student.money);     }}

上述有个前提,首先都是public  如果是父类私有的子类能用么?显然私有的东西是无法继承的。

        

修饰符除了private public还有么?

*************************** 一般属性才是私有的。!---如下所示:

 也就是你无法直接操作这个money,你必须利用接口方法也就是get/set来操作money。

public class Application {    public static void main(String[] args) { Student student = new Student(); student.say(); System.out.println(student.getMoney());    }}

=======================ctrl+h快捷键

2.1 object类

 如下图所示,我们在Person类中并没有定义下述这么多方法,这是怎么回事?猜测是否有一个类,类似于无参构造一样,存在但是看不见。

         **在JAVA中,所有的类,都默认直接间接继承Object类

例如:String类

查看Object类

2.2 super  可以和之前学习的this进行对比,

        this输出的是当前这个类,而super是父类的东西,如下所示:

上述为子类调用父类的属性

那么子类调用父类的方法呢?其实也是一样的,具体如下:

那么如果父类的方法由public---->private? 私有的东西无法被继承

------------------------------

new student

 执行结果:

        

 高级用法:

super() //调用父类的构造器,必须要在子类构造器的第一行,如果不在第一行就会报错。具体如下;

 this也是一样;在子类中在定义一个有参构造,

       

 发现报错:报错信息如下;

        

意思是需要将this和 super一样也放在第一行。

具体如下:发现还是有报错,

 调用构造器的话,要么调用父类的要么调用子类的,且只能在构造器的第一行。

正常情况下,super()不写也是没事的,是默认调用父类的无参构造器,如果父类定义了有参构造,那么父类的无参构造就会被干掉,那么子类无法调用父类的无参构造,会报错。

--------------

 

super总结(注意点)

  1. super调用父类的构造方法,必须在构造方法的第一个
  2. super必须只能出现在子类的方法或构造方法中
  3. super和this 不能同时调用构造方法

和VS对比:

        代表的对象不同:

                this:本身调用的是这个对象,指代当前这个类

                super:代表父类对象的应用

        前提:

                this:,没有继承也可以使用

                super 只能在继承条件才可以使用

       构造方法:

                this():本类的构造

                super() 父类的构造

---------------------------------------------------------------------------------------------------------------------

2.3方法重写(重写都是方法的重写和属性没关系)

总结:

 首先:重写需要有继承关系,子类重写父类的方法!

1:方法名必须相同

2:参数列表必须相同

3:修饰符:范围可以扩大但不可以缩小。

        public>protected>default>private

4:抛出的异常:范围,可以被缩小,但是不能扩大:

        ClassNotFoundException---------->Exception(范围大)

重写:子类的方法和父类的方法必须要一致,方法体不同

思考:

        为什么需要重写?

        1:父类的功能,子类不一定需要,或者不一定满足,所以就存在一个需求:子类重写父类的方法。

        方法重写的快捷键  alt+insert :override       

------------------------------------------------------------------------------------------------------------------------

        都是new  A为何结果不同?

 

public class Application {    public static void main(String[] args) { //方法的调用只和左边,定义的数据类型有关 A a = new A(); A.test();// A==》test() //父类的引用指向了子类 B b =new A(); B.test(); //B==>test()    }}

将static关键字去掉:

        

 静态的方法和非静态的方法区别是很大的

静态方法  方法的调用只和左边,定义的数据类型有关

非静态方法:重写

区分重载和重写 ??

--------------------------------------