类的继承(下)
接口
使用接口可以解决前面所说的子类继承只能满足单继承问题,而接口则可以实现多继承。格式:
public interface 接口名 extends 接口1,接口2... public static final 数据类型 常量名=常量值 //声明全局常量(final) public abstract 返回值类型 抽象方法名称 (参数列表); //声明抽象方法(解释在最下面)
接口中的变量默认用 public static final 修饰(全局常量),接口中的方法默认用pubic abstract 修饰这些修饰的内容可省略。
但是这仅仅是进行了类的多项继承,并不能执行,仍然是抽象-->抽象的继承,如果想要执行的话,那就是抽象-->具体的过程了,为了满足这一过程,我们可以采取 implements 关键字来实现:
修饰符 class 类名 implements 接口1,接口2...{ ... }
注意:如果是执行类的话,必须实现所继承接口里面的所有方法。
个人建议,虽然implements执行类看起来比extends更好用,但是个人决定可能有点不妥,说不上来的感觉,但事物存在必然会有它存在的原因,我们不妨先建一个接口1用extends继承所有的接口,再新建一个类来implements执行接口1,岂不美哉。
例子
//编写接口1 public interface Animal04 { public static String NAME="二哈"; public abstract void info(); }
//编写接口2 public interface Color04 { public static String COLOR="灰白"; public abstract void black(); }
//编写接口3用来继承接口1和接口2(里面可以写接口3自己的方法,或者啥都不写,只是继承) interface Dog04 extends Animal04, Color04 {}
//编写接口4用来执行接口3(接口3里面的所有方法,包括接口3继承的方法) class Dog004 implements Dog04{ public void info(){ System.out.println("姓名:"+NAME); } public void black(){ System.out.println("颜色:"+COLOR); } }
//测试类 public class JiCheng04 { public static void main(String[] args) { Dog004 dog004 = new Dog004(); dog004.info(); dog004.black(); } }
执行结果:
final关键字
final在java里面可以声明类,属性和方法,意在于最终。即
{
1.使用final修饰的类不能有子类
2.使用final修饰的方法不能被重写
3.使用final修饰的变量是常量,不能改变
}
抽象类和抽象方法
所谓抽象即虚无,就好比办某件事有方法,但没有操作实践。就是有但是没有完全有。
抽象类格式:
abstract class 抽象方法名{ 成员属性; 成员方法; 抽象方法; }
抽象方法
abstract 返回值类型 方法名 (参数); //不写方法体即无方法体
抽象类的定义规则:
1.包含抽象方法的类必须是抽象类。
2.抽象类和抽象方法都要用abstract声明
3.抽象方法只需声明,不需要实现(具体实现一般在执行类里面重写方法)
4.一个类继承了抽象类的话,则需实现抽象类里面的所有抽象方法(注意是抽象方法不是所有方法)
抽象类和接口的区别
Java基础之接口与抽象类的区别 - 知乎 (zhihu.com)
相同点
(1)都不能被实例化 (2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
不同点
(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口强调特定功能的实现,而抽象类强调所属关系。
(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。