在Java语言中,abstract class
和interface
是支持抽象类定义的两种机制
抽象类
1.概念
-
我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
-
我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式,这个抽象描述就是抽象类。
-
抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
2.抽象方法
-
如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。抽象方法只包含一个方法名,而没有方法体。
-
声明抽象方法会造成以下两个结果:1.如果一个类包含抽象方法,那么该类必须是抽象类。2.任何子类必须重写父类的抽象方法,或者声明自身为抽象类。
3.总结
-
抽象类不能被实例化,如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
-
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
-
抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
-
构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
-
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
4.代码例子
//定义一个抽象类 管理学习Android
//抽象类-模板
//抽象类里面定义使用这个功能就必须实现的方法或者属性
abstract class BaseAndroidStudy{
//准备工作
{
System.out.println("锻炼身体");
}
//定义一个静态的常量
public final String cBook = "C Primier";
//定义一个属性,用于保存数据
public String javaBook;
//定义一个变量保存内部类
public Dream dream;
//为了安全,通常定义一个无参的构造方法
public BaseAndroidStudy(){
}
public BaseAndroidStudy(String javaBook,String dream){
this.javaBook = javaBook;
this.dream = new Dream();
this.dream.name = dream;
}
//定义一个抽象方法 不需要实现 子类来实现
public abstract void studyC();
//定义了一个普通方法,已经确定了方法的具体实现
public void studyJava(){
System.out.println("参加培训班");
}
//定义一个内部类,用于管理每个人的梦想
private class Dream{
public String name;
public void show(){
System.out.println("梦想是:"+name);
}
}
}
//使用extends来继承一个抽象类
//如果继承一个抽象类,就必须实现抽象类里面的抽象方法
//如果不实现抽象方法,也可以把这个类定义为抽象类
class Student extends BaseAndroidStudy{
public String name;
@Override
public void studyC() {
System.out.println("看书 看视频");
}
public Student(String name,String bookName,String dream){
super(bookName,dream);
this.name = name;
}
}
package swu.xl.day6;
public class MyClass {
public static void main(String[] args){
//1.显示的创建一个类来继承于抽象类 创建这个类的对象
Student xw = new Student("小王","java编程思想","拿offer");
//2.匿名类 只使用一次
BaseAndroidStudy zs = new BaseAndroidStudy("java编程思想","拿offer") {
@Override
public void studyC() {
System.out.println("培训");
}
};
}
}
接口
1.概念
-
在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。
-
接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。
2.特性
-
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错),不需要写访问控制符。
-
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误),不需要写访问控制符。
-
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
-
接口里面不能定义构造方法,不可以添加普通/对象/实例方法,但是可以在接口里面可以定义内部类。
-
接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。(JDK 1.8 以后,接口里可以有静态方法和方法体了。)
interface testInterface{
//public static final int COUNT = 100;
int COUNT = 10;
//public void test2();
//public abstract void test3();
void test1();
/*public static class inner{
int count;
public void show(){
System.out.println("你好啊");
}
}*/
class inner{
int count;
public void show() {
System.out.println("你好啊");
}
}
}
3.接口的实现
类使用implements关键字实现接口,可以用implements实现多个接口,接口与接口之间用,隔开。
class XLClass implements testInterface{
@Override
public void test1() {
inner in = new inner();
in.show();
}
}
4.接口的继承
一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。不同的是可以继承多个接口。
public interface Interface extends Interface1, Interface2{
//自己的抽象方法
}
5.标记接口
-
标记接口是没有任何方法和属性的接口.它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情。
-
两个目的:1.建立一个公共的父接口;2.向一个类添加数据类型
6.接口中方法的实现
- 利用Default
- 系统内部的例子
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> var1) {
Objects.requireNonNull(var1);
Iterator var2 = this.iterator();
while(var2.hasNext()) {
Object var3 = var2.next();
var1.accept(var3);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(this.iterator(), 0);
}
}
网友评论