Java面向对象学习(四)static关键字与抽象类
1.static:静态的
2.static用法
1)static修饰属性
static可以修饰变量,被static修饰的变量都是存放在堆中的静态方法区,与类一起加载。
所以调用static修饰的变量可以使用 类名.变量名的方式调用,且一般都是使用这种方式
1 public class Student { 2 private static String name; //静态的变量,一般用于多线程中 3 private int age; //非静态的变量 4 5 public static void main(String[] args) { 6 //要使用这个类,先要初始化这个类 7 Student student = new Student(); 8 9 //static修饰的对象我们一般都直接用类.变量的方式调用,而非静态变量不可以 10 System.out.println(name); //在当前类可以直接调用name,但不能直接调用age 11 System.out.println(Student.name); //在其他类中可以直接调用类名.name 12 //System.out.println(Student.age); //这句话报错Non-static field 'age' cannot be referenced from a static context 13 //也可以通过对象调用 14 System.out.println(student.name); 15 System.out.println(student.age); 16 } 17 }
2)static修饰方法
调用方法与属性同理
1 public class Student { 2 //static修饰方法 3 //静态方法 4 public static void run1(){ 5 6 } 7 //非静态方法,在非静态方法中可以直接调用静态方法,因为静态方法是和类一起加载的 8 public void run2(){ 9 run1(); 10 } 11 12 public static void main(String[] args) { 13 //可以直接调动静态方法run1 14 run1(); //当前类中调用的写法 15 Student.run1(); //其它类中调用的写法 16 //run2();在调用时必须先初始化这个类,否则不能调用 17 new Student().run2(); 18 } 19 }
3)static修饰代码块
static修饰代码块,与类一起加载,只会加载一次。加载顺序为:静态代码块>匿名代码块>构造方法
1 //static修饰代码块 2 public class Person { 3 //匿名代码块:没有名字定义的代码块,用于赋初始值,和类一起加载 4 { 5 System.out.println("匿名代码块"); 6 } 7 8 //静态代码块,和类一起加载,且只会加载一次 9 static { 10 System.out.println("静态代码块"); 11 } 12 13 //构造方法 14 public Person() { 15 System.out.println("构造方法"); 16 } 17 18 public static void main(String[] args) { 19 Person person1 = new Person(); 20 /*第一次初始化这个类的时候,执行顺序为 21 静态代码块 22 匿名代码块 23 构造方法 24 */ 25 System.out.println("=============="); 26 Person person2 = new Person(); 27 /*第二次初始化这个类的时候,静态代码块不会再执行。执行顺序为 28 匿名代码块 29 构造方法 30 */ 31 } 32 }
4)static静态导入包
1 //静态导入包 2 import static java.lang.Math.random; 3 import static java.lang.Math.PI; 4 public class Test { 5 public static void main(String[] args) { 6 //要想调用random()方法,需要调用Math.random() 7 System.out.println(Math.random()); 8 /*但是可以通过静态导入Math.random这个包,实现只写random()来调用 9 先Ctrl点开Math,查看它属于哪个包。查到是java.lang 10 于是可以导入import java.lang.Math.random;,但是此时会报错,还需要加上static才行。 11 */ 12 System.out.println(random()); 13 System.out.println(PI); 14 } 15 }
2.抽象类
在普通的方法中加上abstract关键字,就成了抽象类
抽象类中可以写抽象方法和非抽象方法,抽象方法必须写在抽象类中。这些方法只是一个约束(只有方法名,没有具体的实现),具体功能由抽象类下面的非抽象子类完成(如果抽象类的子类还是抽象类,则有子子类,即一直往下,知道不是抽象类的子类来完成)
抽象类不能new,只能靠子类实现它的方法,new它非抽象类的子类
抽象类存在的意义:抽象出共同的方法。
1 //普通类加上abstract关键字就是抽象类 2 public abstract class Father { 3 //抽象类中的方法只是一个约束,方法具体的功能要由子类实现 4 public abstract void add(); 5 public void delete(){ 6 7 } 8 }
抽象类中可以写抽象方法和非抽象方法,抽象方法只是一个约束,没有实现。非抽象方法可以写实现。
1 public class Son extends Father{ 2 //必须有下面重写的方法,否则子类会报错 3 @Override 4 public void add() { 5 } 6 }
在非抽象的子类中必须重写抽象方法,否则会报错。快捷键:Ctrl+o、Alt+insert----Override Methods

浙公网安备 33010602011771号