《Java程序设计》第6周学习总结

201711671201《Java程序设计》第6周学习总结

教材学习内容总结

第5章:子类与继承

5.1 子类与父类

继承是一种由已有的类创建新类的机制。先定义一个共有属性的一般类,再定义具有特殊属性的子类。

由继承得到的类称为子类,被继承的类称为父类(超类)。

Java不支持多重继承,即子类只能有一个父类

5.1.1 子类

在类的声明中,通过使用关键字extends来定义一个类的子类,格式如下:

class 子类名 extends 父类名 {
…
}

5.1.2 类的树形结构

Java的类按继承关系形成树形结构(将类看作树上的结点),在这个树形结构中,根结点是Object类(Object是java.lang包中的类),即Object是所有类的祖先类

扫描二维码关注公众号,回复: 3933620 查看本文章

如果一个类(除了Object类)的声明中没有使用extends关键字,这个类被系统默认为是Object的子类

5.2 子类的继承性

子类的成员中有一部分是子类自己声明、定义的,另一部分是从它的父类继承的。

5.2.1 子类和父类在同一包中的继承性

如果子类和父类在同一个包中,子类继承了其父类中不是private的成员变量和方法作为自己的成员变量和方法,继承的成员变量或方法的访问权限保持不变

5.2.2 子类和父类不在同一包中的继承性

当子类和父类不在同一个包中,子类只继承父类中的protected和public成员变量和方法作为自己的成员变量和方法。

5.2.3 继承关系的UML图:

实线的起始端是子类,终点端是父类,终点端使用一个空心三角形表示实线的结束。

5.3 子类与对象

5.3.1 子类对象的特点

子类创建对象时,子类的构造方法总是先调用父类的某个构造方法,此时不仅子类中声明的成员变量被分配了内存,父类的成员变量也都分配了内存空间,但子类只能操作继承的那部分成员变量

5.3.2 关于instanceof运算符

是Java独有的双目运算符左面的操作元是对象右面的操作元是类,当左面的操作元右面的类或其子类所创建的对象时,instanceof运算的结果是true否则是false

5.4 成员变量的隐藏和方法重写

5.4.1 成员变量的隐藏

子类所声明的成员变量的名字和从父类继承来的成员变量的名字相同(声明的类型可以不同),子类就会隐藏所继承的成员变量。

特点:1.子类对象以及子类自己定义的方法操作与父类同名的成员变量是指子类重新声明的这个成员变量

2.子类对象仍然可以调用从父类继承的方法操作被子类隐藏的成员变量,也就是说,子类继承的方法所操作的成员变量一定是被子类继承或隐藏的成员变量。

注:子类继承的方法只能操作子类继承和隐藏的成员变量。

子类新定义的方法可以操作子类继承和子类新声明的成员变量,但无法操作子类隐藏的成员变量(需使用super关键字操作子类隐藏的成员变量)。

5.4.2 方法重写

子类通过重写可以隐藏已继承的方法(方法重写称为方法覆盖)。

1、重写的语法规则:所谓方法重写,是指子类中定义一个方法,这个方法的类型和父类的方法的类型一致或者是父类的方法的类型的子类型(所谓子类型,是指如果父类的方法的类型是“类”,那么允许子类的重写方法的类型是“子类”),并且这个方法的名字参数个数参数的类型和父类的方法完全相同。(重写方法的类型可以是父类方法类型的子类型,即不必完全一致。)

2、重写的目的隐藏继承的方法

重写方法既可以操作继承的成员变量、调用继承的方法也可以操作子类新声明的成员变量、调用新定义的其他方法,但无法操作被子类隐藏的成员变量和方法。(如果子类想使用被隐藏的方法或成员变量,必须使用关键字super。)

3、重写的注意事项不允许降低方法的访问权限,但可以提高访问权限(访问权限从高到低public、protected、友好的、private)。

5.5 super关键字

5.5.1 用super操作被隐藏的成员变量和方法

在子类中想使用被隐藏的成员变量或方法,使用关键字super。例如super.xsuper.play()就是访问和调用被子类隐藏的成员变量x方法play()

5.5.2 使用super调用父类的构造方法

如果子类的构造方法没有明显地指明使用父类的哪个构造方法,子类就调用父类的不带参数的构造方法。

子类不继承父类的构造方法,子类在其构造方法中需使用super来调用父类的构造方法,而且super必须是子类构造方法中的头一条语句,即如果在子类的构造方法中,没有明显地写出super关键字来调用父类的某个构造方法,那么默认地有:

super();

当在父类定义多个构造方法时,应当包括一个不带参数构造方法以防子类省略super时出现错误

5.6 final关键字

final关键字可以修饰类、成员变量和方法中的局部变量。

5.6.1 final类不能被继承,即不能有子类

5.6.2 final方法

如果用final修饰父类中的一个方法,那么这个方法不允许子类重写,也就是说,不允许子类隐藏可以继承的final方法(老老实实继承,不许做任何篡改)。

5.6.3 常量

如果成员变量或局部变量修饰为final,那它就是常量。由于常量在运行期间不允许再发生变化,所以常量在声明时没有默认值,这就要求程序在声明常量时必须指定该常量的值

5.7 对象的上转型对象(子类的对象赋给父类的对象。)

当用子类创建一个对象,并把这个对象的引用放到父类的对象中时,称对象a是对象b的上转型对象,例如:

A a;
a=new B();

或

A a;
B b=new B();
a=b;

(1)上转型对象不能操作子类新增成员变量(失掉了这部分属性),不能调用子类新增方法(失掉了一些行为)。

(2)上转型对象可以访问子类继承或隐藏成员变量,也可以调用子类继承方法或子类重写实例方法

如果子类重写了父类的某个实例方法后,当对象的上转型对象调用这个实例方法时一定调用了子类重写实例方法

如果子类重写了父类的静态方法,那么子类对象的上转型对象不能调用子类重写的静态方法只能调用父类的静态方法

5.8 继承与多态

多态性就是指父类的某个方法被其子类重写时可以各自产生自己的功能行为

上转型是多态的表现形式,通过子类对父类方法的重写来实现。

5.9 abstract类abstract方法

关键字abstract修饰的类称为abstract类(抽象类),例如:

abstract class A {
…
}

关键字abstract修饰的方法称为abstract方法(抽象方法),例如:

abstract int min(int x,int y);

对于abstract方法,只允许声明,不允许实现(没有方法体),而且不允许使用final和abstract同时修饰一个方法或类,也不允许使用static修饰abstract方法,即abstract方法必须是实例方法

1、abstract类中可以有abstract方法(非abstract类中不可以有abstract方法),也可以有非abstract方法

注:abstract类里也可以没有abstract方法。

2、abstract类不能使用new运算符创建对象,如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的抽象方法给出方法体

3、abstract类的子类:如果一个abstract类abstract类子类,它可以重写父类的abstract方法,也可以继承父类的abstract方法。

4、abstract类的对象作上转型对象:abstract类的对象可以成为其子类对象的上转型对象,该对象可以调用子类重写方法

5、理解abstract类

理解的关键点是:

1、抽象类可以抽象出重要的行为标准,该行为标准用抽象方法来表示。即抽象类封装了子类必须要有的行为标准

2、抽象类声明的对象可以成为其子类的对象的上转型对象,调用子类重写的方法,即体现子类根据抽象类里的行为标准给出的具体行为

抽象方法(没有方法体的方法)

5.10 面向抽象编程

所谓面向抽象编程,是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象

面向抽象编程目的是为了应对用户需求的变化,将某个类中经常因需求变化而需要改动的代码从该类中分离出去。

面向抽象编程核心是让类中每种可能的变化对应地交给抽象类的一个子类去负责,从而让该类的设计者不去关心具体实现,避免所设计的类依赖于具体的实现。

5.11 开-闭原则

所谓“开-闭原则”,就是让设计的系统对扩展开放对修改关闭。这句话的本质是指当系统中增加新的模块时,不需要修改现有的模块。

如果系统的设计遵守了“开-闭原则”,那么这个系统一定是易维护的,因为在系统中增加新的模块时,不必去修改系统中的核心模块。

5.13 小结

子类继承过程中可以实现变量隐藏方法重写

教材学习中的问题和解决过程

无。

代码调试中的问题和解决过程

无。

感悟

课后要及时复习,不然会忘掉一些知识。

学习进度条

  代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时  
第六周 30/400 0/5 2/20  

猜你喜欢

转载自blog.csdn.net/zhifafenfang_CAI/article/details/83508611