目录
一、认识
1.abstract:抽象的
2.abstract可以修饰的结构:类、方法
3.abstract修饰类:抽象类
>抽象类不能实例化,但是依然会有构造器,因为子类的构造器会继承父类的构造器
>开发中,抽象类一定会有子类,以便于子类实例化,完成相关操作
4.abstract修饰方法:抽象方法
>抽象方法只有方法的声明,没有方法体,我们知道调用一个方法就是为了执行其方法体,但是没有方法体了那么这个方法就不该被调用,所以得出结论:包含抽象方法的类一定是抽象类;反之:抽象类中不是必须有抽象方法
>父类有一个抽象方法,那么其子类(或者间接子类)必须有这个方法的重写,使得可以调用这个方法;如果子类没用重写这个方法,那么这个子类也必须是抽象类,让它的子类重写方法
>若子类重写了父类中的 所有 的抽象方法后,此子类方可实例化;
若子类没有重写父类中的所有的抽象方法,则子类也是一个抽象类,需要使用abstract修饰
public class AbstractTest {
public static void main(String[] args) {
// Person p1 = new Person();抽象的类不能再实例化
}
}
abstract class Person {
String name;
int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 抽象方法:
public abstract void walk();
public void eat() {
System.out.println("人吃饭");
}
public void sleep() {
System.out.println("人睡觉");
}
}
class Student extends Person {
public void walk() {
System.out.println("学生走路");
}
二、 abstract使用上的注意点:
1.abstract不能用来修饰:属性、构造器等结构
2.abstract不能修饰 : 私有方法 静态方法 final的方法 final的类
>因为私有方法不能被重写
>静态方法没有重写这一说,改了以后就是改了,而且所有对象共用,最后改的那个就是最后的样子
>final的方法就不允许重写
>fianl的类不允许被继承
三、调用方法时的匿名调用方法
public abstract class Person {
public void eat() {
System.out.println("人吃饭");
}
}
public class Student extends Person {
public void eat() {
System.out.println("学生吃饭");
}
}
public class PersonalTest {
public static void main(String[] args) {
// 匿名对象
mathod(new Student());// 运行结果:学生吃饭
// 匿名类。这里的Person是一个抽象的类,按理说不能实例化,但是这里的new Person()可以理解为Person的
// 子类,在子类中重写了Person类中的抽象的eat方法。同时将匿名子类的对象赋值给q,这个对象便是有名字的
Person q = new Person() {
public void eat() {
System.out.println("匿名的人吃饭");
}
};
mathod(q);// 运行结果:匿名的人在吃饭
// 创建一个匿名子类的匿名对象,这里是新new的一个人,写好了它的抽象方法。这只用一次可以这样写。
mathod(new Person() {
public void eat() {
System.out.println("匿名的人吃饭");
}
});
}
public static void mathod(Person p) {
p.eat();
}
}