抽象类
语法规则
没有实际工作的方法,我们可以把它设计成一个抽象方法(abstractmetho,包含抽象方法的类我们称为抽象类(abstractclass)。
在Shape方法前加上abstract关键字,表示这是一个抽象方法,同时抽象方法没有方法体(没有{},不能执行具体代码)。对于包含抽象方法的类,必须加上abstract关键字表示这是一个抽象类。
注意事项
抽象类不能直接实例化【Shapes=newShape();此时这种写法错误】
抽象方法不能是private的,因为抽象类存在的最大意义就是为了被继承;抽象方法要被子类重写。
抽象类中可以包含其他的非抽象方法,也可以包含字段,这个非抽象方法和普通方法的规则都是一样的,可以被重写,也可以被子类直接调用。
//示例2:对于示例1类中以下定义都是可以的
abstract class Shape{
public int age;//普通实例成员变量
public static int count;//静态成员变量
public abstract void draw();//抽象方法
public void func(){//普通成员方法
}
}
抽象类是可以被继承的,可以发生向上转型的;
//示例3:对于示例1,如下操作均可(继承、向上转型)
abstract class Shape{
public abstract void draw();
}
class Rect extends Shape{
@Override
public void draw() {
System.out.println('♦');
}
}
public class TestDemo {
public static void drawMap(Shape s){
s.draw();
}
public static void main(String[] args) {
drawMap(new Rect());
}
}
//♦
当一个普通类继承了一个抽象类,那么注意,当前这个普通类一定要重弄写抽象类中的抽象方法;
重写的注意事项:权限大小:private 当普通类继承了抽象类,但不想实现抽象类中的抽象方法时,这个普通类可被修改为抽象类,此时就可以不用实现当然也可以实现。 对于追加且与对应,如果一个普通类又继承了刚才修改为抽象类的类,此时就必须要实现这个抽象方法了。 抽象类存在的最大意义就是为了被继承。 接口 接口是抽象类的更进一步,抽象类中还可以包含非抽象方法和字段.而接口中包含的方法都是抽象方法,字段只能包含静态常量。接口的存在解决了Java多继承的问题;继承表达的含义是is-a语义,而接口表达的含义是具有xxx特性 注: 使用interface定义一个接口接口中的方法没有方法体(没有{},不能执行具体代码)。接口当中的方法,默认是:publicabstract; publicabstractvoiddraw();可直接写为voiddraw(); 接口当中的成员变量,默认是publicstaticfinal,定义时必须初始化; publicstaticfinalintage=10;可直接写为intage=10; JDK8引入新的特性。default修饰的方法即默认方法,可以有具体实现。 接口不能单独被实例化。使用implements继承接口,此时表达的含义不再是'扩展',而是'实现'在调用的时候同样可以创建一个接口的引用,对应到一个子类的实例。 有的时候我们需要让一个类同时继承自多个父类.这件事情在有些编程语言通过多继承的方式来实现的.然而Java中只支持单继承,一个类只能extends一个父类,但是可以同时实现多个接口,也能达到多继承类似的效果一个类可以实现多个接口;如:classTestimplementsA,B,C//这个普通类每次引入一个接口都要重写接口里的方法 一个类可以继承一个类同时实现多个接口。如:classTestextendsTestAbstractimplementsA,B//这个普通类每引入一个接口都要重写接口里的方法,Test类在继承抽象类TestAbstract同时实现了两个接口A,B。 接口可以扩展一个或多个接口,如: 提示:我们创建接口的时候,接口的命名一般以大写字母I开头.接口的命名一般使用'形容词'词性的单词.阿里编码规范中约定,接口中的方法和属性不要加任何修饰符号,保持代码的简洁性 注意一个错误写法: 文章为作者独立观点,不代表股票交易接口观点//示例1
interface IShape{
void draw();
int age=10;
//默认方法
default void func(){
System.out.println('❀');
}
}
//示例2:创建一个接口的引用ishape
//调用方法drawMap联系到向上转型发生动态绑定等
interface IShape{
void draw();
}
class Rect implements IShape{
@Override
public void draw() {
System.out.println('♦');
}
}
public class TestDemo {
public static void drawMap(IShape s){
s.draw();
}
public static void main(String[] args) {
IShape ishape=new Rect();//向上转型
drawMap(ishape);
}
}
//♦
interface A{
void A();
}
interface B{
void B();
}
abstract class TestAbstract{//这是一个抽象类
public abstract void funcAbstract();
}
//Test类在继承抽象类TestAbstract同时实现了两个接口A,B
//当然这个类不一定要是抽象类,普通类也可,但是注意只能继承一个类
class Test extends TestAbstract implements A,B{
@Override
public void A() {
//注意接口中的方法默认都是public ,不写的话默认是包访问权限,子类重写方法访问权限要大于等于父类
}
@Override
public void B() {
}
@Override
public void funcAbstract() {
}
}
interface A{
void A();
}
interface B{
void B();
}
interface C extends A{//接口C扩展接口A
void C();
}//此时接口C里,不仅有方法C(),也有A()
interface D extends A,B{
void D();
}//也可以扩展多个,此时接口D里有方法D(),A(),B()
//此时让一个类去implements D,就需要重写方法D(),A(),B(),也验证了接口D里有方法D(),A(),B()
class TestNormal implements D{
@Override
public void A() {
}
@Override
public void B() {
}
@Override
public void D() {
}
}
interface IShape {
void draw() ; // 即便不写public,也是public,完整为public abstract void draw()
}
class Rect implements IShape {
void draw() {
//注意接口中的方法默认都是public ,不写的话默认是包访问权限,子类重写方法访问权限要大于等于父类
}
}