每日复习--抽象类
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。
类的设计应该保证父类和子类能够共享特征。
有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。
* abstract 关键字的使用
*
* 1.abstract:抽象的
* 2.abstract 可以用来修饰的结构:类、方法
* 3.abstract 修饰类:抽象类
* 》 此类不能实例化
* 》 抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化全过程)
* 》 开发中,都会提供抽象类的子类,让子类对象实例化,实现相关的操作
*
* 4.abstract 修饰方法:抽象方法
* > 抽象方法,只有方法的声明,没有方法体。
* > 包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法
* > 若子类重写了父类中所有的抽象方法,此子类,
*
* abstract 使用上的注意点:
* 1.abstract 不能用来修饰变量、代码块、构造器;
*
* 2.abstract 不能用来修饰私有方法、静态方法、final 的方法、final 的类。
//
1、不能修饰final修饰的类,方法:final修饰的类表示不能被继承,修饰的方法表示不能被重写,即不能用abstract修饰
2、不能修饰私有方法:因为私有方法只能在本类中被访问,子类虽然会继承到此方法,但是访问不到,就是不能被重写(其实就是隐式的final修饰的方法)
3、不能修饰static修饰的方法:因为静态方法表示可以直接用类名调用此方法,abstract修饰的方法没有方法体,所属类类必定是一个抽象类,不能实例化,必须让子类去重写,创建对象才能调用,所以如果static和abstract同时修饰一个方法,就表示可以类名直接调用这个没有方法体的抽象方法,这样是错误的,所以static和abstract不能同时修饰一个方法.
java中的静态属性和静态方法是可以被继承的,但是不能被子类重写
而重写的规定:子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
抽象方法的一个举例
//不是抽象方法
// public void eat(){
// System.out.println("人吃饭");
// }
//抽象方法
public abstract void eat();
当继承一个抽象的父类时候,子类需要重写父类定义的抽象方法,否则报错
public class Num {
}
abstract class Creature{
public abstract void breath();
}
abstract class Person extends Creature{
String name;
int age;
public Person(){
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
//不是抽象方法
// public void eat(){
// System.out.println("人吃饭");
// }
//抽象方法
public abstract void eat();
public void walk(){
System.out.println("人走路");
}
}
class Student extends Person{
public Student(String name,int age){
super(name,age);
}
public Student(){
}
public void eat(){
System.out.println("学生应该多吃有营养的。");
}
@Override
public void breath() {
System.out.println("学生应该呼吸新鲜的无雾霾空气");
}
}
/*
* 抽象类的匿名子类
*
*/
public class PersonTest {
public static void main(String[] args) {
method(new Student()); //匿名对象
Worker worker = new Worker();
method1(worker); //非匿名的类非匿名的对象
method1(new Worker()); //非匿名的类匿名的对象
System.out.println("*********************");
//创建了一个匿名子类的对象:p
Person p = new Person(){
@Override
public void eat() {
System.out.println("吃东西");
}
@Override
public void breath() {
System.out.println("呼吸空气");
}
};
method1(p);
System.out.println("**********************");
//创建匿名子类的匿名对象
method1(new Person(){
@Override
public void eat() {
System.out.println("吃零食");
}
@Override
public void breath() {
System.out.println("云南的空气");
}
});
}
public static void method1(Person p){
p.eat();
p.walk();
}
public static void method(Student s){
}
}
class Worker extends Person{
@Override
public void eat() {
}
@Override
public void breath() {
}
}