可以分为三个类分别进行讲解。
1首先为Student类
package com.oop.demo07; import com.oop.demo051.Stu; //Static public class Student { private static int age;//静态的变量private修饰的变量或方法只能自己类调用 private double score;//非静态变量 public void run(){//非静态方法可以随便调用静态方法(因为静态方法早就随着类的加载而完成)也可以调用非静态方法因为都是随着对象一起建立的 go(); } public static void go(){//静态方法只能调用其它静态方法 } public static void main(String[] args) { //Student s1 = new Student(); //System.out.println(Student.age);//可以直接被类调用说明age为Student类的静态变量,同时也能被对象调用s1.age //注意单独的打出s1.age将会报错:not a statement为语法错误必须用打印语句来查看。 Student student = new Student(); student.go();//虽然快捷键没有提示但也可以用对象来调用 new Student().run(); go();//在本类里面可以直接按方法名来调用static方法 } }
首先用private修饰了两个变量分别为age与score两个保证二者只能在本类中被调用。同时age为static即静态变量会随着Student的建立而一起加载完毕,而score为非静态变量只会随着对象的new而随之创建。接着定义了一个非静态方法run()已经静态方法go();其中要注意:非静态方法可以随便调用静态方法(因为静态方法早就随着类的加载而完成)也可以调用非静态方法因为都是随着对象一起建立的,但是静态方法只能调用其它静态方法二者都是一起随着类的创建而建立的,而非静态方法会再其后故而无法调用。
对于main()方法要注意:对于age为静态变量(也即是类变量可以用类名直接调用)可以通过类名.age或者直接用age(因为本身就在本类中)调用。对于new的Student类的对象student既可以调用非静态方法(本身就是随着对象而被建立),也可以调用静态方法(本身早就满足条件)直接用方法名即可来实现。
2其次为Person类讲解
package com.oop.demo07; public class Person { {//2执行:可以用来赋一些初始值 //代码块(匿名代码块)随对象一起创建无法主动调用 System.out.println("匿名代码块"); } public Person() {//3执行 System.out.println("构造方法"); } static {//1先执行 但是随类的创建只执行一次 //静态代码块随类加载一次 System.out.println("静态代码块"); } public static void main(String[] args) {//静态代码块的打印语句随着Person类便已经执行完毕且只会执行一次。 Person person = new Person(); System.out.println("================"); Person person1 = new Person(); } }
本次主要讲解一些结构体的书写以及作用,首先对于静态结构体static{//代码块}会先随着类(Person类)的建立而执行且仅执行一次,其次为匿名代码块的结构体{//匿名代码块}它的执行时间是当对象被创建之时可以理解为(Person person = new Person();)其中Person person先执行故而为第2执行。最后为对于构造器之前已经讲过适当new 构造器方法名()执行后开始执行故而为最后执行。而当再次执行定义语句:Person person1 = new Person();对于静态结构体只会随类的建立执行一次故而不再执行,按照之前分析,依次执行顺序为先是一般匿名结构体,再是构造器方法执行。
3最后为Test类的讲解
package com.oop.demo07; //静态导入包~下方的Math.可以直接删除直接用random()就可以实现随机产生一个0-1的数 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); } } //注意当某个类被final修饰时无法被其它类继承!!!而对于private与static无法用来修饰类 //对于static被它修饰的方法无法被子类继承因为它是随父类直接加载的 //在父类中被private修饰的方法和属性无法被子类访问
本类代码主要是扩展了静态导入包的概念主要用于当某个方法名调用长度过长且次数很多时可以使用来缩短代码,一般情况用不上即为import static java.lang.Math.PI;必须为静态修饰才可以。时候就可以直接使用PI来构造代码,而不再用Math.PI来构造。
注意(必须记住!!!):
1,当某个类被final修饰时无法被其它类继承!!!而对于private与static无法用来修饰类,而private与static不会导致子类无法继承的情况(也就是不会报错。)
2,对于static被它修饰的方法无法被子类重写可以被继承,因为被static修饰的方法可以在任意类中调用,但是不会存在重写的情况即:即使在父类调用重写方法也只会调用父类的方法,static也可以用来修饰变量。具体代码例子如下。
package com.oop.demo051; public class Stu extends Per { public static void Per() { System.out.println("1"); } } /// package com.oop.demo051; public class Per { public static void Per() { System.out.println("2"); } } // package com.oop.demo051; public class Application5 { public static void main(String[] args) { Per per1 = new Stu(); per1.Per();//2 } }
上方父类对象per1即使调用了重写方法且定义也满足多态对于父类对象扩展的定义,但是实际结果表示调用的仍然是父类的static修饰的Per()方法。
3,在父类中被private修饰的方法和属性无法被子类访问,因为只能在本类中使用。