面向对象(02)

来源:互联网 发布:网络连接器主要 编辑:程序博客网 时间:2024/05/01 21:19
——我是LGM_Hakka,请多多指教。

继承、多态

继承

1、格式

A extends B(){}

2、什么时候应该定义继承呢? 

当两个类中有大量的相同代码,那么这个时候我们可以把这些相同的代码抽取出来,定义出一个类让这两个类去继承它。如果类与类之间存在【类 is 类】的关系。就可以考虑继承。但不要为了得到某些方法,而去继承某类。

从设计角度来说:什么时候把类的关系定义为继承呢?

  由于继承体现了一种关系:is a的关系。xxx is yyy 的一种。

  以后,你在定义类(A,B)的时候:

  如果他们有关系:A is a B 的一种。或者B is a A。

  那么,他们之间就存在继承关系。前者A是子类,后者B是子类。

定义继承:使用关键字extends:

  例如:
class A extends B{}

表示:A继承B

A:子类,派生类

B:父类、基类、超类

子类不可以直接访问父类私有的成员。

若想访问父类私有成员,子类需要通过父类公共的方法调用父类的私有成员。 set及get等方法。

3、继承的特点 

在Java中类支持单继承,不支持多继承。但支持多层(重)继承;且一个类可以被多个类继承。在Java中,接口既支持单继承,也支持多继承

4、好处

提高代码的复用性

让类与类之间产生关系,是多态的前提。

5、this和super关键字的区别

super代表父类的存储空间标识符。

super和this的用法

成员变量

this.变量 ------------- 调用本类中的成员变量

super.变量 ----------- 调用父类中的成员变量 

构造方法

this(...); ----------- 调用本类中的构造方法

super(...); ----------- 调用父类的构造方法

成员方法

this.方法名(......); -------- 调用本类中的成员方法

super.方法名(.......); ------ 调用父类中的成员方法

6、子父类中成员变量的用法

A.  名称不同,直接找;

B.  名称相同,子类对象在使用的时候:

C.  先找子类局部范围

D.  再找子类成员范围

E.  最后找父类成员范围(不会去找父类的局部变量);

F.  都没有找到的话,就报错。

7、子父类中的成员方法的用法

名称不同,直接找

名称相同时,子类对象在使用的时候:

先找子类的的

再找父类的;都没找到的话,就报错。

8、方法重写

在子类中,方法声明(修饰符,返回值,方法名,参数列表)相同的情况下。

注意事项:

父类中的私有方法不能被重写

子类方法的访问权限一定要大于等于父类的的访问权限

静态只能重写静态。

什么时候需要重写父类的方法

当子类需要父类的功能,而子类又有自己特有的方法时,可以重写父类的方法。这样既可以使用父类的功能有可以定义子类特有的内容。

9、子父类中的构造方法的用法

子类的初始化过程中,首先回去执行父类的初始化动作

因为子类的构造方法中默认有一个super();

因为子类要使用父类的成员变量,这个初始化,必须在子类初始化之前完成。所以子类的初始化过程中,会先执行父类的初始化。

如果父类没有无参构造方法时:

A. 使用super调用父类的带参结构。

使用this调用本身的其他构造(不建议使用)

10、实例

class Person {// 封装姓名属性private String name;// 封装年龄属性private int age;// 对外提供,设置name的方法public void setName(String name) {this.name = name;}// 对外提供,获取name的方法public String getName() {return name;}// 对外提供,设置age的方法public void setAge(int age) {this.age = age;}// 对外提供,获取age的方法public int getAge() {return age;}// 父类Person的doing方法public void doing() {System.out.println("Person类中的doing()方法");}// 父类Person的study方法public void study() {System.out.println("Person类中的study()方法");}}// 创建一个Student类,继承Person类class Student extends Person {// 重写---父类Person的doing方法public void doing() {System.out.println("Student类...重写---父类Person的doing方法");}// 重写---父类Person的study方法public void study() {System.out.println("Student类...重写---父类Person的study方法");}public void show() {// 通过super关键字,调用父类的doing方法super.doing();// 通过this关键字,调用本类的doing方法this.doing();// 通过super关键字,调用父类的study方法super.study();// 通过this关键字,调用本类的study方法this.study();}}// 测试类public class Demo {public static void main(String[] args) {// 创建Student对象Student s = new Student();// 通过Student对象调用Student类的show方法s.show();}}

多态

1、多态的前提条件

  • 要有继承关系或实现关系
  • 要有方法的重写(没有也可以,但是如果没有方法重写,这个多态是没有意义的);
  • 要有父类引用指向子类对象【例如:Fu f = new Zi();】

2、使用多态的注意事项

  • 成员变量的使用规则:编译看左边,执行也看左边
  • 成员方法的使用规则:编译看左边,执行看右边

假如说子父类中符合了上述三点多态前提:那么Fu f =new Zi();在用f对象调用成员的时候

如果调用的是成员变量那么打印出来的是父类的成员变量;

如果调用的是成员方法那么打印出来的是子类的成员方法。

  • 原因是:方法有重写而变量没有。

3、多态的弊端

  • 可能会遇到类型转换异常, 如果遇到了规则如下:

在对一个对象进行转型的时候只可以把他转换成它原本的类型,或者是其父类的类型。

如:
Fu f = new Zi(); //向上转型    把小类型转换成到大类型Zi z = (Zi)f; //向下转型       把大类型转换成到小类型

父类引用无法使用子类的特有功能。

    • 解决的方法:将父类向下转型

4、多态的好处

  • 提高代码的拓展性和可维护性。

5、多态的类型转换问题

  • 在多态中,出现类型转换异常的根本原因是多态没有继承关系.
    • 类型转换异常:java.lang.ClassCastException,如果遇到这个异常。如果两个类没有任何关系就不能互相转换(关系指的是继承或者实现)

6、实例

//创建Animal类class Animal {// Animal类中的show方法public void show() {System.out.println("Animal show");}}// 创建Cat类,使其继承Animal类class Cat extends Animal {// 重写Animal类中的show方法public void show() {System.out.println("Cat show");}}// 创建Dog类,使其继承Animal类class Dog extends Animal {// 重写Animal类中的show方法public void show() {System.out.println("Dog show");}}class DuoTaiDemo02 {public static void main(String[] args) {// 多态:向上转型Animal a = new Cat();a.show();// Cat show// 向下转型Cat c = (Cat) a;c.show();// Cat show// 因为a被强转为Cat类型,所以不能再次被强转成其他类型// 产生类型转换异常:java.lang.ClassCastExceptionDog d = (Dog) a;d.show();}}
0 0
原创粉丝点击