第7章 面向对象高级特性2020-02-23

继承(inheritance):

也称泛化,继承性是子类自动共享父类属性和方法的机制,在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入自己若干新的内容

继承简化了人们对事物的认识和描述,有益于软件复用,是OO技术提高软件开发效率的重要原因之一

是类之间的一种关系,一般类与特殊类之间的关系

继承关系的语义:“is a kind of”

封装(encapsulation):

所谓封装是把对象的属性和行为结合在一个独立的系统单位内部

尽可能隐蔽对象的内部细节,只向外部提供接口

降低对象间的耦合度

封装的重要意义:

使对象能够集中而完整地描述并对应一个具体事物

体现了事物的相对独立性,使对象外部不能随意存取对象的内部数据

多态(polymorphism):

指同一个命名可具有不同的语义

OO方法中,常指在一般类中定义的属性或方法被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为,对于子类,可用不同的方法替代实现父类的服务的方法


继承的含义

在Java中定义一个类时,让该类通过关键字extends继承一个已有的类,这就是类的继承(泛化)。

被继承的类称为父类(超类,基类),新的类称为子类(派生类)。

子类继承父类的所有属性和方法,同时也可以增加自己的属性和方法。

继承的语法



继承的含义

继承的规则:

Java中只支持单继承,也就是说每个类只能有一个父类,不允许有多重继承

一个父类可以有多个子类

子类继承父类所有的属性和方法 

调用构造方法:

在构造方法中,可以使用this或super调用其他的构造方法

super()

作用:调用父类的构造器

只能出现在子类的构造器中,且必须是第一行

super()中的参数,决定了调用父类哪个构造器

如果子类构造器中没有出现super,那么编译器会默认加上super(),即调用父类的空构造器,如果父类没有空构造器,编译器提示错误。

this()

作用:调用本类的构造器

只能写在构造器的第一行

在同一个构造器中super()和this()不能同时出现

类的继承

子类实例化的过程

使用默认的构造器

在子类中的创建构造器         

在子类中创建构造器时,必须调用父类的构造器

子类可以在自己的构造器中使用super关键字来调用父类的构造器


如果使用super关键字调用父类构造器,必须写在该子类构造器的第一行

如调用的是父类中无参的构造器,则可以不写super( )

如果子类中调用了父类无参的构造器,而父类中没有无参构造器则系统编译出错

示例

package com.neusoft.test7;

//子类

public class Officer extends Employee{

// 使用this()  super()  来调用 当前类 或其父类的空参构造

public Officer() {

super(5); //父类方法的空参构造

System.out.println("Officer子类的空参构造方法");

}

// public Officer(int i) {

//// super(); //父类方法的空参构造

// System.out.println("Officer子类的空参构造方法");

// }

public String type="Officer";

public  void show() {

System.out.println("儿子说:hello");

}

// 区分父与子之间 属性与方法时:

// this指的是当前类对象属性及方法

// super指的是父类的属性及方法

public void say() {

System.out.println("自己的属性类型为:"+this.type);

System.out.println("父类的属性类型为:"+super.type);

// 自己的show()

this.show();

// 父类show()

super.show();

// 子类继承父类,子类没有重写drink方法时,会将父类的drink方法继承

this.drink();

}

}

----------

package com.neusoft.test7;

//子类

public class Officer extends Employee{

// 使用this()  super()  来调用 当前类 或其父类的空参构造

public Officer() {

super(5); //父类方法的空参构造

System.out.println("Officer子类的空参构造方法");

}

// public Officer(int i) {

//// super(); //父类方法的空参构造

// System.out.println("Officer子类的空参构造方法");

// }

public String type="Officer";

public  void show() {

System.out.println("儿子说:hello");

}

// 区分父与子之间 属性与方法时:

// this指的是当前类对象属性及方法

// super指的是父类的属性及方法

public void say() {

System.out.println("自己的属性类型为:"+this.type);

System.out.println("父类的属性类型为:"+super.type);

// 自己的show()

this.show();

// 父类show()

super.show();

// 子类继承父类,子类没有重写drink方法时,会将父类的drink方法继承

this.drink();

}

}

----

测试类

package com.neusoft.test7;

public class Test1 {

public static void main(String[] args) {

// TODO Auto-generated method stub

Officer o=new Officer();

// o.say();

}

}











抽象类与接口不同点

1.书写上 抽象类 abstract class     接口是interface

2. 继承使用extends关键字    实现接口使用implements关键字

3.抽象类 可以定义普通方法与抽象方法,接口内部只能定义抽象方法和被default 关键字修饰的普通方法

4.抽象类只能被单继承  ,接口可以被多实现

5.抽象类只能单继承, 接口之间可以多继承

6.抽行类可以定义成员变量,接口 只能定义静态常量

7.设计上 属于关系的设计为抽象类      包含某一种功能 设计为接口

你可能感兴趣的:(第7章 面向对象高级特性2020-02-23)