什么叫抽象类
具备抽象方法的类就是抽象类,抽象方法就是没有具体的方法体的方法。
抽象类的特点:
- 抽象方法只能在抽象类里面
- 抽象类和抽象方法必须被abstract修饰
- 抽象类不能创建对象(不能实例化)
- 抽象类可以有非抽象的方法
- 一个类继承了抽象类,要么重写了所有的抽象方法,要么他自己就是抽象类
例
public class ChouXiangLei {
}
//定义抽象类Animal
abstract class Animal{
public abstract void eat();
}
//继承抽象类
class Dog extends Animal{
//重写父类的方法
@Override
public void eat()
{
System.out.println("猫吃鱼");
}
}
abstract class Cat extends Animal{
}
例2
public class PersonTest {
public static void main(String [] args)
{
/*员工类:
属性:姓名,编号,薪水
行为:工作
程序员:
属性:姓名,编号,薪水
行为:写代码工作
经理:
属性:姓名,编号,薪水,奖金
行为:盯着程序员写代码工作*/
Programer p=new Programer();
p.work();
}
}
abstract class Employee{
String name;
int bianhao;//编号
int money;
public abstract void work();
}
class Programer extends Employee{
@Override
public void work() {
System.out.println("写代码工作");
}
}
class Maneger extends Employee{
int jiangjin;
@Override
public void work()
{
System.out.println("盯着程序员写代码");
}
}
抽象类的成员特点
- 只可以存在成员变量和常量
- 可以存在抽象方法和非抽象方法
面试题:为什么抽象类不可以创建对象却可以有构造方法
因为抽象类中可能有成员变量,构造方法可以对成员变量进行初始化
抽象类不可以和那些关键字共存
1.private :因为抽象方法只要被private修饰,子类就无法重写抽象方法,那么这个抽象方法就没有存在的必要。
2.final:final修饰的类不能被继承,修饰的方法不能被重写
3.static:static修饰的方法可以通过类名直接调用,但抽象方法里没有具体的方法体。
接口
格式:
interface 接口名{
抽象方法;
}
接口的特点
1.接口不能创建对象
2.接口内只能有抽象方法(public abstract 可以省略,建议写上)
3.接口中只有常量,不能有成员变量,因为接口中只有抽象方法,不能对变量进行二次赋值(常量默认被public final static 修饰)
4.接口中不可以有构造方法
接口与接口,接口与类的关系
接口与接口的关系是继承,而且是多继承。接口与类的关系是实现(implements)。
例
public class YunDong {
public static void main(String []args)
{
/**篮球运动员和教练
要出国访问,需要学习英语
* 乒乓球运动员和教练
分析哪些是类,哪些是抽象类,哪些是接口
* */
B1 b1=new B1();
b1.Study();
}
}
/**类:篮球运动员 乒乓球运动员 篮球教练 乒乓球教练
接口 学习
抽象类: 运动员,教练*/
//B1,P1分别代表篮球运动员和乒乓球运动员
class B1 extends Y implements Study
{
@Override
public void work(){
System.out.println("打篮球");
}
@Override
public void Study() {
System.out.println("学习英语");
}
}
class P1 extends Y{
@Override
public void work(){
System.out.println("打篮球");
}
}
//B2,P2分别代表篮球教练和乒乓球教练
class B2 extends J{
@Override
public void work()
{
System.out.println("练篮球");
}
}
class P2 extends J{
@Override
public void work()
{
System.out.println("练乒乓");
}
}
/**运动员*/
abstract class Y extends Person{
}
/**教练*/
abstract class J extends Person{
}
//人(总父类)
abstract class Person{
public abstract void work();
}
interface Study{
void Study();
}