面向对象共有三个特征:封装、继承、多态
一、【java继承 extends】
1. Java不支持类的多继承,但支持多重继承。(支持接口的多继承)
2. 子类拥有父类非private的属性和方法。
3. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
4. 子类可以用自己的方式来实现父类的方法 ---- 重写。
5. 提高了代码的耦合性(继承的缺点,耦合度高说明代码之间联系紧密,代码独立性差)。
6. 子类有使用子类自己的(就近原则),子类没有使用父类的。
【关键字】:
1. extends: 继承关键字。
2. super: 使用super关键字来实现对父类成员的访问。
3. this: 指向自己的引用。
4. final : (1)声明类,则这个类不能被继承,即最终类;(2)声明方法,则该方法不能被子类重写
二、【重写与重载】:
重写(override):子类中出现了和父类中一模一样的方法时(方法名相同,参数个数类型相同,返回类型相同),则子类重写了父类中的方法。
重写的规则:
(1)参数列表、返回类型必须与被重写方法的相同。
(2)访问权限不能比父类中被重写的方法的低。java四大权限由高到低(public protected default private)。
(3)父成员方法只能被它的子类重写。
(4)声明为final、static的方法不能被重写,static可以再次声明。
(5)子类、父类在同一个包中,子类可以重写父类中除声明private和final的方法;不在一个包中,只能重写父类中声明为。public、protected的非final方法。
重载(overload): 在一个类里面,方法名相同,而参数列表不同。
重载的规则:
(1)必须改变参数列表(个数或类型不一样)。
(2)可以改变返回类型、访问修饰修饰符。
重载是一个类的多态性表现。重写是子类与父类的一种多态性表现。
三、【抽象类 abstract】
一个类没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类总结
(1)抽象类不能实例化(创建对象),只有抽象类的非抽象子类才能创建对象。
(2)抽象类中不一定包含抽象方法,具有抽象方法的类必是抽象类。
(3)抽象类中的抽象方法只是声明,不包含方法体。
(4)构造方法、类方法(用staticx修饰的方法)不能声明为抽象方法。
(5)任何子类必须重写抽象类的抽象方法,除非该子类声明为抽象类。
(6)关键字abstract 不能与private 、final共存 。
四、【接口 Interface】---- 是抽象方法的集合,接口通常以interface来声明。
三种引用类型: 数组、类、接口 (接口和类是不同的概念。类描述要对象的属性和方法,接口包含类要实现的方法)
接口只描述所应具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。
接口特性:(接口不能实例化)
(1)接口中的方法会被隐式的指定为public abstract(只能是public abstract,其他修饰符都会报错),接口中方法都是抽象的
(2)接口中的变量会被隐式的指定为public static final 变量(只能是public)
(3)子类必须覆盖掉接口中的所有抽象方法,子类才可以实例化,否则子类是一个抽象类
【接口与类】
相似点
(1)一个接口可以有多个方法。
(2)接口文件保存在.java文件中,文件名使用接口名;接口的字节码文件保存在.class结尾文件中。
区别:
(1)接口不能实例化对象。
(2)没有构造方法。
(3)接口中的方法必须都是抽象方法,只能包含public static final 变量。
(4)接口不是被类继承了,而是被类实现。
(5)接口支持多继承。
【接口与抽象类的区别】
(1)抽象类中的方法可以有方法体(非抽象方法),接口中的方法都是抽象方法。
(2)抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是public static final类型的。
(3)一个类只能继承一个抽象类,而一个类可以实现多个接口。
(4)接口中不能含有静态代码块以及静态方法(用static修饰的方法),而抽象类可以有。
接口多态程序:(接口作参数)
/*
* USB接口:
* 方法: 开、关
*/
public interface USB {
public abstract void open();
public abstract void close();
}
/*
* 鼠标类 实现USB接口类
* 方法:开、关
*/
public class Mouse implements USB{
public void open(){
System.out.println("开启鼠标");
}
public void close(){
System.out.println("关闭鼠标");
}
}
/*
* 笔记本类
* 方法:开、关、使用USB设备
*/
public class Computer {
public void openComputer(){
System.out.println("笔记本打开");
}
public void closeComputer(){
System.out.println("笔记本关闭");
}
// 具体使用哪一个USB 设备不知道,需要输入设备的接口类型
// 接口当做参数, 接口的实现类 可以有很多个 只要满足接口规范,那么笔记本可以连入许多种类的设备(即可无限扩展)
public void useUSB(USB usb){
usb.open();
usb.close();
}
}
/*
* 键盘类 USB接口实现类
* 功能:重写抽象方法
*/
public class Keyboard implements USB{
public void open(){
System.out.println("开启键盘");
}
public void close(){
System.out.println("关闭键盘");
}
}
/*
* 接口使用--笔记本案例
* 1.事物
* 笔记本 USB(接口) USB设备(鼠标、键盘)
* 2.事物的属性
* 笔记本:开、关、使用USB设备
* USB接口:开、关
* USB设备:必须满足USB接口规范 开、关
* 3.事物间的联系
* 笔记本:调用外部USB设备
* USB接口:外部设备都是它的实现类
*
*/
public class Test {
public static void main(String[] args) {
// 创建Computer类型对象
Computer com = new Computer();
com.openComputer(); // 打开笔记本
// 创建Mouse 类型对象
Mouse mou = new Mouse();
com.useUSB(mou); // 连接鼠标设备 使用了接口的多态
// 创建Keyboard类型对象
Keyboard ke = new Keyboard();
com.useUSB(ke); // 连接键盘设备 使用了接口的多态
com.closeComputer(); // 关闭笔记本
}
}