每日复习--抽象类

随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。

类的设计应该保证父类和子类能够共享特征。

有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。

 * 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() {

         }

}

posted @ 2021-09-29 22:16  浩楠要秃顶  阅读(14)  评论(0编辑  收藏  举报