继承(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.设计上 属于关系的设计为抽象类 包含某一种功能 设计为接口