java抽象类、接口

抽象类:在 Java 面向对象当中,所有的对象都是用过类进行描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,我们把这种类定义为抽象类。
抽象类的特征
1 不能用来实例化对象,所以抽象类必须被继承才能够被使用,其他的功能和普通类相同。
2 一个类只能继承一个抽象类。
3 抽象类的修饰符不能是 private。

抽象类的要点
1 非抽象类不能含有抽象方法。如果抽象超类的子类没有实现所有的抽象方法,则子类必须定义为抽象类。换句话说, 继承了抽象类的非抽象子类必须实现所有的抽象方法。抽象方法非静态。
2 抽象类不能用new操作符实例化,但仍可定义构造函数,子类的构造函数会调用它。例如GeometricObject的构造函数被Circle和Rectangle类调用。包含了抽象方法的类必须是抽象类,但抽象类却可以不包含抽象方法。这种情况下不能用new操作符创建类的实例,此类用于继承。
3 子类可以重写超类中的方法并将其定义为抽象方法,虽然非常罕见, 但如果超类中的方法的实现在子类中变得非法时,这种写法就有用。这种情况下,子类必须定义为抽象类。
4 即使超类是具体类,子类也可以是抽象类。例如虽然Object类是具体类,但是它的子类如GeometricObject可以是抽象类。
5 不能用new操作符创建抽象类的实例,但是抽象类可用作数据类型。因此,如下创建以GeometricObject为元素类型的数组的语句是正确的。

抽象方法:如果想要设计一个类,该类包含一个特别的成员方法,该方法是根据子类的行为来确定的,那么在父类中将这个方法声明为抽象方法。继而含有抽象方法的类称为抽象类。

抽象方法的注意点
1 抽象类中不一定含有抽象方法,但是有抽象方法的类一定是抽象类。即用abstract修饰的类中可以有abstract方法,也可以没有abstract方法;可以有非abstract方法,也可以没有非abstract方法。
2 构造方法,类方法(static 修饰的方法)不能声明为抽象方法。
3 抽象类的子类必须给出抽象类中抽象方法的实现,除非该子类也是一个抽象类。
4 抽象方法的修饰符不能是 private。
5 abstract可以修饰class表示抽象类,可以修饰方法表示抽象方法,但是不能修饰成员变量,也就是没有抽象的成员变量。
6只有abstract类中才能声明abstract方法,abstract方法不能声明在非abstract类中。
7 abstract类可以是外部类,也可以是内部类。abstract类如果是外部类,不能用private修饰;abstract类如果是内部类,可以用private修饰。
8 abstract方法不能有方法体,abstract方法必须对其子类可见,即不能用private修饰。
9 abstract类可以继承自其他类,这个父类可以是abstract类,也可以是非abstract类。如果它继承自abstract类,它可以选择实现其父类中的abstract方法,也可以不实现。
10 abstract类可以实现一个接口。它可以选择实现接口中的接口方法,也可以不实现。
11 abstract类只有被继承时才有用,它的子类可以是abstract类,也可以是非abstract类。如果它的子类是abstract类,则会自动继承所有其所有的abstract方法,abstract子类中也可以定义新的abstract方法,如果它的子类是非abstract类,则子类必须实现其所有的abstract方法。
12 abstract类可以用来定义变量,但不能实例化,也就是不能通过new来构造一个abstract类的对象。abstract类定义的变量可以被赋值为其非abstract子类的对象。
13 abstract类中可以有构造方法,抽象类的构造方法不能是抽象方法。
14 abstract类和abstract方法都不能用final修饰。

abstract class Employee{//抽象类
    private String name;
    private String address;
    private int number;
    public Employee(String name, String address, int number) {
        super();
        this.name = name;
        this.address = address;
        this.number = number;
    }
    public void mailCheck(){
        System.out.println("mailing a check to" + this.name+" "+this.address);
    }
    public void setAddress(String newaddress){
        address=newaddress;
    }
    public abstract void fun();//定义抽象方法
}
class ExtendsEmployee extends Employee{//继承抽象类必须实现抽象方法
    public ExtendsEmployee(String name, String address, int number) {
        super(name, address, number);
        // TODO Auto-generated constructor stub
    }
    @Override
    public void fun() {//抽象方法的实现// 
        TODO Auto-generated method stub
    }
}
public class TestDemo{
     public static void main(String[] args){
         Employee e=new Employee();//error 不能用抽象类实例化对象
     }
}

接口:Java中的接口表示规范,用于定义一组抽象方法,表示某一类事物必须具备的功能,要求实现类必须来实现该接口并提供方法实现.在抽象类中,可以包含一个或多个抽象方法,但是在接口中,所有的方法必须是抽象的,不能有方法体,他比抽象类更加的抽象。接口规定一个类必须做什么而不规定他如何去做。

接口中生命的成员变量默认都是 public static final 的,必须显示的初始化。因而在常量声明时可以省略这些修饰符。是若干常量和抽象方法的集合。
定义类语法: [public] class 类名{}
定义接口语法: [public] interface 接口名{},在这里还没有考虑接口的父接口等等).
接口起名问题: 表示具有某些能力的.有人习惯以able/handler结尾. Walkable,表示可以行走的. 有的公司或个人,习惯以I打头,表示接口,如:IWalkable.java.成功编译之后,和类一样,具有一份字节码.
接口存在的成员:
1):接口中没有构造器,推论:接口不能创建对象(不能 new ),接口中不能定义普通方法.
2) :接口中定义的成员变量,实质是全局静态常量,默认使用 public static final来修饰.

 public static final String NAME = "龙17";    
  1. :接口中定义的方法都是公共的抽象方法,默认的使用 public abstract 来修饰方法.
public abstract void walk();

一般的,我们在接口中定义方法,不喜欢使用修饰符.
4) :接口中定义的内部类都是公共的静态内部类,默认使用public static来修饰内部类.
接口的特点
① 没有构造方法,也不能显示定义构造器,不能实例化。
② 接口只能继承接口,不能继承类,且接口支持多继承(类是单继承关系)。[修饰符] interface 接口名 extends 接口1,接口2
③ 接口里的方法方法全是抽象的,默认修饰符是public abstract。
④ 接口里的字段全是全局静态常量,默认修饰符是public static final。
⑤ 接口里的内部类全是公共静态的,默认修饰符是public static。

interface InterfaceClass{
    int a=10;//只能是public static final进行修饰接口变量,必须初始化
    void fun();//默认的修饰符是 public abstract,不能用其他修饰符进行修饰操作
}
class AchieveInterface implements InterfaceClass{
    @Override
    public void fun() {
        // TODO Auto-generated method stub
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值