Java第七课

Java第七课

一、课后作业讲解

public class Shape {
   /**
    * 计算长方形的周长
    * @param rectangle
    * @return
    */
   public int perimeter(Rectangle rectangle) {
       return (rectangle.getLength()+rectangle.getWidth())*2;
  }
   /**
    * 计算正方形的周长
    * @param square
    * @return
    */
   public int perimeter(Square square) {
       return square.getWidth()*4;
  }
}
public class Square {
   /**
    * 边长
    */
   private int width;

   public Square(int width) {
       this.width = width;
  }

   public int getWidth() {
       return width;
  }
}
public class Rectangle {
   /**
    * 长
    */
   private int length;
   /**
    * 宽
    */
   private int width;

   public Rectangle(int length, int width) {
       this.length = length;
       this.width = width;
  }

   public int getLength() {
       return length;
  }

   public int getWidth() {
       return width;
  }
}

二、属性的继承

当父类中的属性不是私有的可以继承到子类中,当子类中有同名的属性时,会覆盖父类的属性,有点像方法的重写

重点:父类的属性可以被继承,但无法覆盖,这个和方法不一样

三、多态

多态是用父类声明的变量指向子类的实现,该变量随着实现的子类不同,对于相同的行为(方法)表现出不同的现象,就是多态

Father有三个子类Son1,Son2,Son3

Father类中的say行为(方法)在三个子类中都被重写,表现不同

Father person = new Son1(); person.say()表现出大声说话

Father person = new Son2(); person.say()表现出小生哼哼

Father person = new Son3(); person.say()表现出抑扬顿挫

多态时,用父类声明的变量只能在父类中获取自身的属性,无法获取子类的属性

虽然person实际上是指向了内存中Son1的对象,但是只能获取父类的属性。

如果父类中的方法在子类中有重写,则用person调用该方法时,实际调用的是子类的方法。

  • 当多态时,子类中的方法可以重写父类中的方法,子类中的属性无法覆盖父类中的属性。当通过父类声明的变量调用属性时,永远获取的时父类中的属性,调用方法时,永远调用的是子类的方法。

  • 多态的优点

    1. 增加了程序的灵活性

    2. 增加了程序的扩展性

public class Party {
   public static void main(String[] args) {
       Party party = new Party();
       party.act(new Yueyunpeng());
       party.act(new Songxiaofeng());
  }

   public void act(Actor actor) {
       actor.say();
  }
}
class Actor{
   protected void say() {
       System.out.println("Actor say");
  }
}
class Yueyunpeng extends Actor{
   @Override
   protected void say() {
       System.out.println("我的天哪");
  }
}
class Dacui extends Actor{
   @Override
   protected void say() {
       System.out.println("好尴尬啊");
  }
}
class Songxiaofeng extends Actor{
   @Override
   protected void say() {
       System.out.println("此时此景我想吟诗一首");
  }
}

四、静态

  • static

  • public static void main(String[] args)

  • 当一个类中有静态的成员时,这个类被加载到JVM中时,会首先初始化静态的成员

public class Student {
   /**
    * 静态的成员
    */
   protected static int num;

   /**
    * 增加学生
    * @param student
    */
   protected static void add(Student student) {
       
  }
}

当Student.class文件加载到JVM中时,JVM会创建一个Class对象(类模板对象),在这个对象中存储了num和add对象(num是一个成员对象,add是一个方法对象)

Student student;当这行代码执行时,JVM就会加载class文件,换句话说,当代码中一旦出现了Student字样,JVM就会加载Student.class文件。

Class在Java中是一个特殊的类,是模板类,它会根据类的实际信息构建出该类的一个模板对象,模板对象中存储着类的成员对象

它会在模板对象中存储静态的成员信息num和add,num = 0;模板对象中分两块区域,一块是静态区域,一块非静态的

当Student类加载到JVM时,此时并没有Student的实例,所以静态是脱离实例存在的,它不属于某个实例,而是属于该类的信息。调用静态成员时,只需要通过类名.调用,不需要实例来调用。

在静态方法中,是无法使用实例信息的,因为在静态方法中,实例还没有创建,先有静态,后有实例。

静态和类的关系,静态属于类的,不属于实例的,静态可以被继承,但无法覆盖。

  1. 静态成员属于类,不属于对象

  2. 静态方法无法访问实例

  3. 静态可以被继承,但无法覆盖

静态的优点: 1.通过类名方便调用,多用于工具类的方法

2.公共资源,不随实例的变化而变化

静态的缺点:1.因为是公共的,从JVM加载到JVM卸载始终占用资源,不会被回收

public class Ticket {
   /**
    * 共有20张票
    */
   private static int num = 20;

   public  void sale() {
       if (num <= 0) {
           System.out.println("票已售罄");
      } else {
           System.out.println("剩余" + --num+"张票");
      }
  }

   public static void main(String[] args) {
       Ticket ticket = new Ticket();
       for (int i=0;i<21;i++) {
           ticket.sale();
      }
  }
}

五、抽象

  • abstract

  • 没有方法体的方法是抽象方法,有抽象方法的类必须是抽象类

  • 抽象类可以没有抽象方法

  • 抽象类无法创建实例,不能new

  • abstract class A{

    abstract void work();

    }

    work是一个抽象方法,这个方法什么都没有做。假设让 A a = new A();

    a.work();为了避免什么都不能做的情况,就不能让抽象类初始化,创建对象。

    抽象类存在的意义是被继承。



posted @ 2021-02-25 14:59  若你  阅读(50)  评论(0编辑  收藏  举报