1.为什么需要抽象类abstract?
在Java语言中, abstract class 和 interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。
抽象类是对类的抽象,是一种模板设计;接口是行为的抽象,是一种行为的规范。
抽象类是用来捕捉子类的通用特性的;接口是抽象方法的集合。
抽象类主要用于当做基础类使用,即基类(抽象类 用于被继承的子类使用的)。如果想拥有一些方法,并且这些方法有默认实现,那么使用抽象类。
接口主要用于模块与模块之间的调用。主要用接口来实现多继承,因为Java不支持类的多继承,只能用接口。
通常 某类 没有实例对象,但我们有时需要某类的引用 指向 它的子类实例(单单只需某类的引用(用作于基类或父类),并不需要其实例化)。
抽象类abstract
含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。
含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。
格式:
抽象类:修饰符 abstract class 类名{}
抽象方法:修饰符 abstract 返回值类型 方法名(参数列表){方法体;}
特点:
1)抽象类不一定有抽象方法,但是有抽象方法的类一定是抽象类
2)抽象类不可以实例化(不能用new关键字创建抽象类实例)
3)抽象类的子类,可以是抽象类,也可以是具体类。如果子类是具体类,需要重写抽象类里面所有抽象方法
组成:
1)成员变量:可以是变量,可以是常量
2)构造方法:抽象类不可以实例化,子类会调用父类的构造方法,对属性进行初始化赋值
3)成员方法:可以是抽象方法,也可以是具体方法
抽象类为什么有构造方法?抽象方法不是不能实例化吗?
抽象类的构造类不是自己使用的,而是给被继承的类使用的。
子类继承抽象类的构造方法是用于初始化。
抽象类与普通类的区别?
(1)普通类可以直接实例化;抽象类不能被实例化,因为它是存在于一种概念而不非具体。
(2)普通类和抽象类都可以被继承,但是抽象类被继承后子类必须重写继承的方法,除非自类也是抽象类。(普通类不能包含抽象方法,抽象类可以包含抽象方法。)
2.为什么需要接口Interface?
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。
接口是Java语言中的一种引用类型,主要是用来存储方法的(是抽象方法的集合)。
接口被用来描述一种抽象。
接口也被用来实现解耦。
接口被用来实现抽象,而抽象类也被用来实现抽象。
接口支持多继承(接口和接口继承关系:可以单继承,多继承,多级继承)。
接口Interface
接口(interface),是Java语言中的一种引用类型,也可以说成是抽象类的一种特例,主要是用来存储方法的(接口中的所有方法都必须是抽象的,是抽象方法的集合)。
接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
实现接口的类叫做实现类,实现类如果是普通类必须重写接口中所有的抽象方法,否则实现类是一个抽象类。
接口与类的区别?
接口与类相似点:
一个接口可以有多个方法。
接口文件保存在 .java 结尾的文件中,文件名使用接口名。
接口的字节码文件保存在 .class 结尾的文件中。
接口相应的字节码文件必须在与包名称相匹配的目录结构中。
接口与类的区别:
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承(接口和接口继承关系:可以单继承,多继承,多级继承)。
3. 抽象类abstract 和 接口Interface 的区别?
抽象类abstract |
接口Interface | |
0声明 | 抽象类使用 abstract 关键字声明 | 接口使用 interface 关键字声明 |
1构造器 | 抽象类中可以定义构造器 | 接口中不能定义构造器 |
2成员变量(字段声明) | 抽象类中可以定义成员变量 | 接口中定义的成员变量实际上都是常量(只能有常量) |
3静态方法 |
抽象类中可以可以有静态代码块和静态方法 (可以被static修饰) | 接口中不能有静态方法(不可以被static修饰) |
4抽象方法 | 抽象类中可以有普通方法和抽象方法 | 接口中的方法全是抽象方法 |
5访问修饰符 | 抽象类中的方法可以是任意访问修饰符(private、默认、protected、public) |
接口方法默认修饰符是 public (并且不允许 定义为 private 或者 protected) |
6多继承 | 一个类只能继承一个抽象类 | 一个类可以实现多个接口 |
7 | 有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法 |
相同 |
抽象类abstract 和 接口Interface |
1 | 不能够实例化 |
2 | 可以将抽象类和接口类型作为引用类型 |
3 | 一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要 被声明为抽象类 |
抽象(abstract)不能与哪些关键字共存?
1).private :因为一个abstract方法需要被重写,所以不能修饰为private;
2).final:因为一个abstract方法需要被重写。被final修饰的方法是不能被重写的,所以不能同final共存;
3).static:因为一个abstract方法没有方法体。静态方法需要对方法体执行内容分配空间,所以不能同static共存;(abstract是没有实现 的,不能产生对象,而是static是属于类的,类本身是已经存在的对象)
4).synchronized: 是同步的,然而同步需要具体的操作才能同步,但, abstract是只有声明没有实现的(即,使用synchronized关键字的是需要有具体的实现同步的操作的,但是使用abstract是只有声明而没有实现的,这样就产生了冲突)
5).native:他们本身的定义就是冲突的,native声明的方法是移交本地操作系统实现的,而abstract是移交子类对象实现的,同时修饰的话,导致不知道谁实现声明的方法