Java基础_抽象类和接口
抽象类和接口
一、抽象类(abstract)
介绍抽象类
-
什么是抽象类?
- 类和类之间具有共同特征,将这些共同特征提取出来,形成的就是抽象类。
- 类本身是不存在的,所以抽象类无法创建对象(无法实例化)
-
抽象类属于什么类型?
- 抽象类也属于引用数据类型。
-
抽象类怎么定义?
-
语法:
[修饰符列表] abstract class 类名{
类体;}
-
-
抽象类是无法实例化的,无法创建对象的,所以抽象类是用来被子类继承的。
-
final和abstract不能联合使用,这两个关键字是对立的。
-
抽象类的子类可以是抽象类,也可以是非抽象类
-
抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。
-
抽象类关联到一个概念:抽象方法。什么是抽象方法呢?
- 抽象方法表示没有实现的方法,没有方法体的方法。例如:
- public abstract void run () ;
- 抽象方法特点是:
特点1:没有方法体,以分号结尾。
特点2:前面修饰符列表中有abstract关键字。
- 抽象方法表示没有实现的方法,没有方法体的方法。例如:
-
抽象类中不一定有抽象方法,抽象方法必须出现在抽象类中。
- 抽象类中可以存在非抽象方法,即:可以有普通方法
-
一个非抽象的类,继承抽象类,必须将抽象类中的抽象方法进行覆盖/重写/实现。
- 类到对象是实例化,对象到类是抽象。
-
抽象类无法实例化,无法创建对象, why ?
- 抽象类是:类和类之间有共同特征,将这些具有共同特征的类再进一步抽象形成了 抽象类。由于类本身是不存在的,所以抽象类无法创建对象。
-
抽象类和抽象类实际上可能还会有共同特征,还可以进一步再抽象。
package com.mike.test;
public class Test {
public static void main(String[] args) {
//错误: Account是抽象的;无法实例化
//Account act = new Account();
}
}
//银行账户类
abstract class Account{
}
//子类继承抽象类,子类可以实例化对象
class CreditAccount extends Account {
}
//抽象类的子类可以是抽象类吗?可以
//abstract class CreditAccount extends Account {
//}
关于抽象类中的抽象方法重写的问题
package com.mike.test;
public class Test {
public static void main(String[] args) {
new Bird().move();//匿名内部类写法
//也可以这样new对象
// Bird bird1 = new Bird();
// bird1.move();
//能不能使用多态?
//当然是可以,父类型引用指向子类型对象。
//Animal a=new Bird();//这就是面向抽象编程。
//这就是面问抽象编程。OCP
//以后你都是调用的a.xxx
//a的类型是Animal, Animal是抽象的
//面向抽象编程,不要面向具体编程,降低程序的耦合度,提高程序的扩展力。
//这种编程思想符合OCP原则。
}
}
//动物类(抽象类)
abstract class Animal{
//抽象方法
public abstract void move();
}
//子类(非抽象类)
class Bird extends Animal{
//如果父类存在抽象方法,但是子类继承父类然后不重写父类的抽象方法,那么这个子类必须定义为抽象类
//下面这个操作是子类重写了父类中存在的抽象方法,子类就不用定义为抽象类
@Override
public void move() {
System.out.println("咕咕咕~");
}
}
面试题(判断题):
- java语言中凡是没有方法体的方法都是抽象方法。
- 不对,错误的。
- object类中就有很多方法都没有方法体,都是以“;"结尾的,但他们
都不是抽象方法,例如: - public native int hashCode () ;
- 这个方法底层调用了C++写的动态链接库程序。
- 前面修饰符列表中没有: abstract。 有一个 native。表示调用JVM本地程序。
二、接口
1、接口基础语法
- 接口也是一种''引用数据类型"。编译之后也是一个class字节码文件。
- 接口是完全抽象的。(抽象类是半抽象)或者也可以说接口是特殊的抽象类。
- 接口怎么定义,语法是什么?
[修饰符列表] interface 接口名{} - 接口支持多继承,一个接口可以继承多个接口
- 接口中只包含两部分内容,一部分是常量,一部分是抽象方法。接口中没有
其它内容了,只有以上两部分。 - 接口中所有的元素都是public修饰的。( 都是公开的。)
- 接口中的抽象方法定义时: public abstract修饰符可以省略。
- 接口中的常量的public static final可以省略。
- 接口中的方法都是抽象方法,所以接口中的方法不能有方法体。
- 类和类之间叫做继承,类和接口之间叫做实现。
- 别多想:你仍然可以将"实现"看做"继承"。
- 继承使用extends关键字完成。
- 实现使用implements关键字完成。
package com.mike.test;
public class Test {
public static void main(String[] args) {
}
}
interface A{}
interface B extends A{}
interface C extends A,B{}
interface MyMath{
//抽象方法
public abstract int sum(int a,int b);
}
2、接口在开发中的作用
-
注意:接口在开发中的作用,类似于多态在开发中的作用。
-
多态:面向抽象编程,不要面向具体编程。降低程序的耦合度。提高程序的扩展力。
-
接口在开发中的作用?
- 接口是不是完全的?是。
- 而我们以后正好要求,面向抽象编程。
- 面向抽象编程这句话以后可以修改为:面向接口编程。
- 有了接口就有了可插拔。可插拔表示扩展力很强。不是焊接死的。
主板和内存条之间有插槽,这个插槽就是接口,内存条坏了,可以重新买一个换下来。这叫做高扩展性。( 低耦合度。)
三、抽象类和接口的区别
总结:类和接口
一、面向对象(接口的概述及其特点)
-
A:接口概述
- 从狭义的角度讲就是指java中的interface
- 从广义的角度讲对外提供规则的都是接口
-
B:接口特点
- a:接口用关键字interface表示
- interface 接口名 {}
- b:类实现接口用implements表示
- class 类名 implements 接口名 {}
- a:接口用关键字interface表示
-
c:接口不能实例化,那么,接口如何实例化呢?
- 按照多态的方式来实例化。
-
d:接口的子类
- a:可以是抽象类。但是意义不大。
- b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
二、面向对象(接口的成员特点)
- 接口成员特点
- 成员变量;只能是常量,并且是静态的并公共的。 * 默认修饰符:public static final * 建议:自己手动给出。
- 构造方法:接口没有构造方法。
- 成员方法:只能是抽象方法。 * 默认修饰符:public abstract * 建议:自己手动给出。
三、面向对象(类与类,类与接口,接口与接口的关系)
- 类与类,类与接口,接口与接口的关系
- a:类与类:
- 继承关系,只能单继承,可以多层继承。
- b:类与接口:
- 实现关系,可以单实现,也可以多实现。并且还可以在继承一个类的同时实现多个接口。
- c:接口与接口:
- 继承关系,可以单继承,也可以多继承。
- a:类与类:
四、面向对象(抽象类和接口的区别)
- A:成员区别
- 抽象类:
- 成员变量:可以变量,也可以常量
- 构造方法:有
- 成员方法:可以抽象,也可以非抽象
- 接口:
- 成员变量:只可以常量
- 构造方法:没有
- 成员方法:只可以抽象
- 抽象类:
- B:关系区别
- 类与类
- 继承,单继承
- 类与接口
- 实现,单实现,多实现
- 接口与接口
- 继承,单继承,多继承
- 类与类
- C:设计理念区别
- 抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
- 接口被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。
修饰符
-
范围从大到小排序: public >protected>默 认>private
-
访问控制权限修饰符可以修饰什么?
- 属性(4个都能用)
- 方法( 4个都能用)
- 类(public和默认能用,其它不行。)
- 接口(public和默认 能用,其它不行。)