1、抽象类
/*
当多个类中出现相同功能,但是功能主体不同,这类可以进行向上抽取,这时,只抽取功能定义,而不抽取功能主题,用abstract。抽象方法必须放在抽象类中,因为若抽象方法放在非抽象类中,类的对象对该抽象方法完全没有意义。
抽象方法:abstract 返回值类型 方法名(); 抽象方法没方法主体
特点:
抽象方法一定存在于抽象类中
抽象方法和抽象类都必须被abstract修饰
抽象类不可以用new创建对象,因为调用抽象方法没意义
抽象类中的方法要被使用,必须由子类重写所有的抽象方法后,建立子类对象来使用。
如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类(抽象方法只能存在于抽象类中)。如果子类重写了父类所有抽象方法,则子类可以不是抽象的。(一般情况下子类都是非抽象的,因此使用抽象类抽象方法,可以在一定程度上强迫子类重写一些抽象方法,因为子类需要创建对象,而抽象类不能创建对象)
抽象类和一般类:
没有太大不同,该如何描述事物就如何描述事物,只不过该事物中出现了一些看不懂的东西,这些不确定的部分也是该事物的功能,需要明确出来,但是无法定义主题。通过抽象方法类表示。
抽象类比一般类多了个抽象方法
抽象类不可以实例化
抽象类中可以存在非抽象方法。
抽象方法和一般方法:
一般方法可以被子类直接使用,若子类需要可以对父类方法进行重写。
抽象方法只定义返回值类型和方法名,没有方法主题,需要由子类重写使用。
*/
abstract class student
{
abstract void study();//抽象方法必须存在于抽象类中
}
class BaseStudent extends student
{
void study()//对抽象方法进行重写
{
System.out.println("study");
}
}
2、接口
/*
接口:初期理解,可以认为是一个特殊的抽象类,当抽象类中的方法都是抽象方法时,那么该类可以通过接口形式来表示,用interface来定义接口。
格式特点:
接口中常见定义:常量、抽象方法。
接口中的成员都有固定修饰符
常量:public static final
方法:public abstract
记住:接口中的成员都是public的,但是若public static final public abstract不写的话,系统会自动补上。但是为了阅读性,一般都写上。
注意:
类与类之间是继承关系,因为父类中的成员或方法,子类都可以直接使用。但是类与接口之间是实现关系,因为接口中的方法是抽象的,类必须实现接口中的抽象方法。
接口是不可以创建对象的,因为有抽象方法。需要被子类实现,子类对接口中的抽象方法全部覆盖后,子类才可以实例化,否则子类就是一个抽象类。但可以创建接口的引用,例如接口Inter,可以Inter i;但不可以new Inter();
*/
interface Inter
{
public static final int NUM = 3;//红色部分可以省略,系统会自动补上
public abstract void show();//红色部分可以省略,系统会自动补上
}
class Test implements Inter
{
public void show(){};
}
class InterTest
{
public static void main(String[] args)
{
Test t = new Test;
System.out.println(t.NUM);//创建子类对象,调用NUM
System.out.println(Test.NUM);//因为NUM是static的,可直接类调用
System.out.println(Inter.NUM);//NUM是static,接口名可直接调用
}
}
接口可以被类多实现,也是对多继承不支持的转换形式,java支持多实现。也就是说,一个类可以实现多个接口。
注意:java对多继承不支持的原因是,多个父类中可能存在同名不同主体的方法,子类在继承后没办法选择该继承哪一个方法。而在接口中,多个接口中的同名方法都必须由子类去实现,接口中方法没有方法体,所以子类可以自己定义方法体,不存在该选择哪个接口方法的问题。
类与类之间是继承,类与接口之间是实现,接口与接口之间是继承关系(
接口之间可以是多继承,一个接口可以继承多个接口(但是,多个接口之间不能存在方法名相同返回值不同的方法,因为子类对象调用时不知如何调用))。
interface Inter
{
public static final int NUM = 3;//红色部分可以省略,系统会自动补上
public abstract void show();//红色部分可以省略,系统会自动补上
}
interface InterA
{
public abstract void showA();//红色部分可以省略,系统会自动补上
}
class Test implements Inter,InterA
{
public void show()
{
System.out.println("对接口Inter中方法的实现");
}
public void showA()
{
System.out.println("对接口InterA中方法的实现");
}
}
class Students
{
}
//子类可以继承父类的同时,实现多个接口
class SubStudents extends Students implements Inter,InterA
{
}
接口特点:
接口是对外暴露的规则
接口是程序的功能扩展(基本功能定义在类中)
接口可以用来多实现
类与接口之间是实现关系,而且类可以继承一个类的同时实现多个接口
接口与接口之间可以有继承关系
3、二者关系
区别:
接口中方法全是抽象方法(public abstract),接口中变量全是public static final的。
抽象类中可以有非抽象方法
共性:
当抽象类中的方法全为抽象方法时,可以把该抽象类看做一个接口
二者都不能被创建其实例,也就是不能被new