Javastatic关键字与抽象类

252 阅读2分钟

static关键字

静态变量

静态变量可以通过类(Student类)直接调用,而非静态变量只能通过对象调用。

  
  package com.oop.Demo08;
  public class Student {
      private static int age;//静态的变量
      private double score;//非静态的变量
  ​
      public static void main(String[] args) {
          Student s1 = new Student();
          System.out.println(s1.age);
          System.out.println(s1.score);
          System.out.println(Student.age);//静态变量可以通过类直接调用
          System.out.println(Student.score);//报红
      }
  }

静态方法

非静态方法不能被静态方法调用,只能通过new一个对象之后.方法()才能调用(new Student().run();)。非静态方法可以调用静态方法里的所有东西。

  
  package com.oop.Demo08;
  public class Student {
      private static int age;//静态的变量
      private double score;//非静态的变量
      public void run(){
          go();
      }
      public static void go(){
        
      }
      public static void main(String[] args) {
          new Student().run();
          go();
      }
  }

静态代码块

类一加载直接执行,永久只执行一次。而匿名代码块创建对象时自动创建,在构造器之前。静态代码块比匿名代码块先执行

  
  package com.oop.Demo08;
  public class Person {
      //2 用来赋初值
      {
          //代码块(匿名代码块):创建对象(Person)时自动创建,在构造器之前
          System.out.println("匿名代码块");
      }
      //1
      static {
          //静态代码块 :类一加载直接执行 永久只执行一次
          System.out.println("静态代码块");
      }
      //3
      public Person() {
          System.out.println("构造方法");
      }
  ​
      public static void main(String[] args) {
          Person person1 = new Person();
          Person person2 = new Person();
      }
  }
  /*
  输出结果为:
  静态代码块
  匿名代码块
  构造方法
  匿名代码块
  */

静态导入包

正常情况下java要调用随机数函数random()时需这样:Math.random() .若我们不想每次都调用Math时怎么做呢?只需在代码头部添加 import static java.lang.Math.random; 同样,若想在程序中直接使用PI(3.14...)时,只需在代码头部添加 import static java.lang.Math.PI;

  
  package com.oop.Demo08;
  import static java.lang.Math.random;
  import static java.lang.Math.PI;
  public class Test {
      public static void main(String[] args) {
          System.out.println(random());
          System.out.println(PI);
      }
  }

抽象类

  • 不能new这个抽象类,只能靠子类去实现它;约束!
  • 抽象类中可以写普通的方法
  • 抽象方法必须在抽象类中
  • 抽象类的所有方法必须要由子类实现除非子类也是抽象则由子子类实现
  
  package com.oop.Demo09;
  //abstarct 抽象类:类
  public abstract class Action {
      //约束~有人帮我们实现~
      //抽象方法,只有方法名字, 没有方法的实现!
      public abstract void doSth();
      public void todoSth(){}
  }

要想继承抽象类,则必须重写抽象类的抽象方法

  
  package com.oop.Demo09;
  ​
  public class A extends Action{
      @Override
      public void doSth() {
  ​
      }
  }
  ​

\