Java之抽象类与接口

一、抽象类

1.定义

在普通类的基础上扩充了一些抽象方法。

2.抽象方法

只有方法声明,没有方法体。

3.关键字abstract

所有的抽象方法必须用abstract关键字来定义。并且抽象方法所在的类也要用abstract修饰,表示抽象类。

4.抽象类的使用说明

1)子类

所有的抽象类必须有子类。如果子类不是抽象类,子类必须覆盖所有的抽象方法。

2)实例化

抽象类的对象可以通过对象多态性利用子类为其实例化。

即使抽象类中没有定义任何抽象方法,此时抽象类仍然无法直接创建实例化对象。

抽象类不能直接产生实例化对象。必须由其子类(实现了所有抽象方法的子类)实例化。

子类实例化时,会默认调用父类的无参构造;如果没有调用父类的其它构造方法而且父类也没有无参构造时,就会报错。

3)关于修饰符

private与abstract不能同时使用。

因为被final修饰的类不能有子类,而抽象类必须有子类,因此抽象类不能被final修饰。

因为抽象方法必须能被覆写,所以抽象方法不能被private修饰。

4)抽象方法与抽象类的关系

抽象类中可以没有抽象方法,但是抽象方法所在的类一定是抽象类。

注意:如果构造方法中没有设置属性的值,那么对象中的属性为其对应数据类型的默认值。

5)抽象类的分类

外部抽象类  内部抽象类

注意: 外部抽象类不能用static修饰,但是内部抽象类可以用static修饰。

5.代码示例

package com.xunpu.abstrctClass;

abstract class B{
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //    private void fun();//编译出错
    public abstract void test();

}
class C extends B{

    @Override
    public void test() {
        System.out.println("C类继承自抽象类B 年龄为:"+this.getAge());//父类中的属性,如果没有被赋值,则为默认值
    }
}
public class A {
    public static void main(String[] args) {
        B b=new C();//使用抽象类的子类实例化对象   向上转型
//        B b2=new B();//编译出错,抽象类不能实例化对象
        b.test();
        b.setAge(3);
        if(b instanceof C){
            C c=(C)b;
            System.out.println(c.getAge());//通过父类给age赋值  3
        }
    }
}

结果:

二、接口

1.接口的作用

解决抽象类的单继承权限。实现多继承(继承多个接口)

2.接口的概念

1)声明:使用interface关键字。  如:interface IMessage

2)定义:抽象方法和全局变量的集合。即接口中所有的方法默认用public abstract修饰,所有的属性默认用public static final修饰。

3.使用说明

1)实例化

通过其子类实例化,然后再向上转型。这个子类必须覆写接口的全部抽象方法。

2)子类

用implements实现接口。  如:class A implements IMessage

一个子类可以实现多个接口,接口间用逗号分开。如:class A implements B,C,D  类A继承了接口B,C,D。

当一个类既继承抽象类,又要实现接口时,先使用extends继承抽象类,然后再用implements实现接口。 如:class M extends A implements B,C{}。

3)使用权限

接口中的属性和方法只允许是public权限。

阿里编码规约:接口中的方法和属性不要加任何修饰符号,public也不要加,保持代码的简洁性。

一般不在接口中定义属性。

4.接口的内部结构

接口中的内部结构可以是:内部普通类、内部接口。使用static继承的内部接口相当于一个外部接口。

5.接口的应用

定义操作标准

表示能力

在分布式开发中暴露远程服务方法。

package com.xunpu.abstrctClass;


interface IA{
    String message="hello Interface!";
    void print();
}
interface IFun{
    boolean fun();
}
class Ib implements IA,IFun {
    @Override
    public void print() {
        System.out.println(message);
    }

    @Override
    public boolean fun() {
        return message==null?true:false;
    }
}
public class MyInterface {
    public static void main(String[] args) {
        Ib impleDouble=new Ib();
        System.out.println(impleDouble.fun());
        impleDouble.print();
    }
}

三、抽象类与接口的继承关系和区别

1.开发中应遵循“接口优先”的原则。

在一个操作既可以使用抽象类又可以使用接口时,优先考虑使用接口。

2.继承说明

一个抽象类可以使用implements实现多个接口,但是接口不能继承抽象类。

实现接口的抽象类也可以不实现接口中的抽象方法。

接口间是可以继承的。一个接口可以使用extends继承多个父接口。

抽象类间也是可以继承的。不过遵循”单继承“。一个抽象类只能继承一个抽象类。

3.区别

1)结构组成

接口由抽象方法+全局变量组成。抽象类由普通类+抽象方法组成。(甚至可以没有抽象方法)

2)权限

接口中的方法和属性只允许public权限。抽象类中可以允许各种权限。

3)子类使用

接口中子类用implements实现接口。抽象类子类用extends继承抽象类。

4)二者的继承关系

一个抽象类可以实现多个接口。 但是接口不能继承抽象类,但是接口可以使用extends继承多个父接口。

5)子类继承限制

子类可以实现多个接口,多个接口间用","隔开。 但是只能继承一个抽象类。

四、对象的实例化步骤

1)进行类加载

2)进行类对象的空间开辟

3)进行类对象中的属性初始化(构造方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值