抽象类

在java中,所有的对象都是通过类来描绘的,无论是变量还是函数方法,你总是能在一个类中找到它的定义和具体的值或方法。但是反过来,有一些抽象的类并不是拿来给予这个对象实体,换句话说,实例化它,而仅仅是定义,或者说是提出有这样一个对象。

抽象类用abstract class来定义。举个例子。

public abstract class Animal{
	private String id;
	public String eat();
}

这就是定义了一个抽象类,Animal。可以看到这里面有一个成员变量id还有一个成员方法eat。这个时候你如果定义了一个animal为Animal类,也就是写成

Animal animal = new Animal();

这样的时候程序会报错

那么这样的抽象类我该怎么把他用起来呢?答案是用一个子类继承它,再调用。

java 写一个抽象单例 java编写抽象类animal_java


简单的写了一点,你可以发现本身定义的两个类的内部函数都是可以调用的,只不过是前面那种写法程序不允许。也就是说,虽然我抽象类是抽象的,但是它内部的东西是实打实有的,你只要有手段把他表现出来,剩下单论用法和一般的父类子类继承,向上转型是差不多的。其实这样的说法也挺抽象的…那既然用法差不多,我为什么需要这样的抽象类呢?这个下面和接口一起说。

接口

这里的接口,单论格式表现我觉得可以当成,一个子类可以继承好多好多的父类。注意,如果只是简单的父类和子类的话,一个子类是只能有一个父类的,就像你只有一个亲生父亲对吧()。

那既然我头上有这么多“父类”,我又得用他们的方法函数,总得给他们个称呼吧,又不能都叫爸爸,所以就换一个称呼,叫做接口。就像一台小机器,你可以通过多个接口,连接得到多个其他机器的数据。

注意,这里的接口,里里外外,全部都是抽象的。用interface来定义一个接口,举个例子

interface Animal{
	public void eat();
	public void travel();
}

这里可以说有三个“对象”在。一个接口“Animal”,还有他的两个成员函数。需要注意的是,不仅仅这个接口是抽象的,里面的两个方法函数也是抽象的。虽然这里都没有abstract,但是确确实实是抽象的数据。这种写法叫做隐性抽象。所以我们可以发现,这里的两个函数只有一个名字和方法类型,内部怎么执行,有什么类型都没有说。

就像上面抽象类的说法一样,这样一堆抽象的数据你又运行不了,所以你就需要一个子类来对接这些接口,然后才可以调用这些函数方法。还需要注意一点,因为你上面只是定义或者说宣告了有这个函数在,具体要怎么运行,你就需要在你的子类里面,每一个,都重写覆盖一边掉。举个例子

interface Animal{
	public void eat();
	public void travel();
}
public class mammalint implements Animal{
	public void eat(){
		System.out.println("1");
	}
	public void travel(){
		System.out.println("2");
	}
	public static void main(String args[]){
		mammalint m = new mammalint();
		m.eat();
		m.travel();
	}
}

写了函数才发现漏讲了几个要点,对接接口的时候用 implements。接口内部可以有常量,不能有变量。以及接口里的方法,一定一定需要被public来修饰,虽然我暂时还不清楚为什么一定要这样。那么,上面讲到的可以对接许多许多接口的时候我该怎么写呢?

public class mammalint implements Animal1,Animal2

这样加逗号一直写下去就好,当然你也可以接口一个一个对接过来,比如

interface Animal2 implements Animal1
public class mammalint implements Animal2

这样依次承接下来,注意,接口对接接口的时候不需要实现该接口的方法,毕竟你也是个接口,大家都是抽象的,只要最后承接接口的子类能全部重写覆盖上面所有接口的方法就ok。(当然接口不能继承类,一般人应该都默认知道的吧)

那么剩下的问题就是,为什么需要抽象类和接口呢?

第一个要点,就是规范了定义变量名。上面的接口先把变量名定义好了,下面的程序编写的时候,你就不能随便命名了,这样对于一个较大的工程来说,是必须要注意的一点。(我个人就因为命名不规范被学长学姐老师说过了很多次了)

第二个原因是,这样很灵活。你现在已经定义了一个类,但是在之后的运行中,你发现这个类的功能较少,需要修改,增加,甚至删除。单单是这样还好,但是如果你是第一个地方需要必须用到这个类现有的功能,第二个地方需要修改更新,这样是一件非常非常麻烦的事。但是你如果把相应的模块放到接口中,之后修改的时候可以引用另外一个类,可以在维护原先框架的基础上作出边界的修改,同时又保证了程序的严谨性,是一个很强大的功能。