目录
1、由abstract修饰的类叫做抽象类,也可以修饰抽象方法
2、如果子类不是抽象类,abstract修饰的抽象方法必须在子类当中实现。
4、只有抽象类当中才能有抽象方法, 普通类当中不能有抽象方法。
7、final和abstract不能同时使用,final 修饰的类不能被继承,final修饰的方法不能被重写
8、abstract修饰的方法不能被static修饰,static 修饰的方法属于类
10、抽象类是有构造器的,但是他的构造器不能够创建对象,只是为了完成一些必要的初始化操作。
一、什么是抽象类
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
二、为什么引入抽象类
在学继承和重写时我们会发现这样一个问题:如果子类的方法都与父类不同(都需要重写),那为什么还需要具体写父类中的方法?这其实是因为多态,多态可以极大的丰富java代码。那有没有其他办法解决父类中代码多余的问题,这时就需要引入抽象类。
举例如下图:
定义了父类animal类,和子类dog、cat、pig类,但是由于dog、cat、pig类中的eat和run方法都不一样,就需要对父类的方法重写,这时我们就可以定义一个抽象类来解决animal中run和eat方法多余的问题。
由abstract修饰的类叫做抽象类,也可以修饰抽象方法
举例:
public abstract class Animal {
public abstract void run();
public abstract void eat();
}
public class Pig extends Animal{
public void run(){
System.out.println("猪会跑");
}
public void eat(){
System.out.println("猪爱吃胡萝卜");
}
}
public class Dog extends Animal{
public void run(){
System.out.println("狗会跑");
}
public void eat(){
System.out.println("狗爱吃骨头");
}
}
public class Cat extends Animal{
public void run(){
System.out.println("猫会跑");
}
public void eat(){
System.out.println("猫爱吃鱼");
}
}
三、抽象类的特点
1、由abstract修饰的类叫做抽象类,也可以修饰抽象方法
2、如果子类不是抽象类,abstract修饰的抽象方法必须在子类当中实现。
public abstract class Animal {
public abstract void run();
public abstract void eat();
}
public class Cat extends Animal{
public void eat(){
System.out.println("猫爱吃鱼");
}
}
这里就会报错,因为cat子类并没有实现父类中的run方法。
3、抽象类一定是父类
4、只有抽象类当中才能有抽象方法, 普通类当中不能有抽象方法。
public class Animal {
public abstract void run();
public abstract void eat(); //报错,普通类中不能使用抽象方法
}
5、抽象类不能被实例化,只能使用多态
public class Test {
public static void main(String[] args){
Aniaml p1 = new Animal(); //报错,抽象类不能实例化
}
}
6、抽象类当中不一定非要写抽象方法, 也可以写普通方法
public abstract class Animal {
public abstract void run();
public void eat(){
System.out.println("nihao");
};
}
7、final和abstract不能同时使用,final 修饰的类不能被继承,final修饰的方法不能被重写
8、abstract修饰的方法不能被static修饰,static 修饰的方法属于类
static修饰的方法叫类方法是可以直接用的,但是abstract修饰的方法需要重写。
9、抽象方法不能使用private访问修饰符修饰
因为private修饰的方法子类访问不到,但是abstract修饰的方法需要子类进行重写,产生矛盾。
10、抽象类是有构造器的,但是他的构造器不能够创建对象,只是为了完成一些必要的初始化操作。
举例:
public abstract class Animal {
private String name;
public Aniaml(String name){
this.name=name;
}
public String getname(){
return name;
}
public abstract void run();
public void eat(){
System.out.println("nihao");
};
}
public class Dog extends Animal{
public Dog(String name){
super(name);
}
public void run(){
System.out.println("狗会跑");
}
public void eat(){
System.out.println("狗爱吃骨头");
}
}
public class Test {
public static void main(String[] args){
Aniaml a =new Dog("狗狗");
a.run();
System.out.println(a.getname());
}
}