7.9

成员方法分为静态的和非静态的,直接用 类名.func() 访问,不需要实例化对象

    public static void func(){

        System.out.println("静态的成员方法!");

        //System.out.println(name+"静态的成员方法!");//err 静态方法不依赖对象

    }

     

    public static void funcStatic(){//访问非静态的成员变量

        Student student = new Student();

        student.age = 10;

        System.out.println(student.age);//打印10

    }

 

    //成员方法里面都是默认有Student this,除了静态的方法和构造方法

    //这也再次解释了静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用

    public void func1(Student this){

        System.out.println(student.age);

    }

}

public class Test {

    public static void main(String[] args) {

        Student.func();//打印:静态的成员方法!

        System.out.println(Student.classes);//打印高一三班

    }

}

 

用public static String classes = "高一三班";说明:

 

静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。所以他不存在对象里面,他单独的存放在一块方法区里面,仅且只有一份。

 

我们访问静态的成员变量直接用 类名.成员变量访问,因为静态的成员变量与对象无关。(静态的成员方法也是如此)

 

生命周期伴随类的一生(JVM:随类的加载而创建,随类的卸载而销毁,上面的认识JVM有讲解)

 

在静态的成员方法里面是不能出现非静态的成员变量,因为静态的成员变量和方法是不依赖对象的;但是呢,如果你想要在静态的成员方法里面访问非静态的成员变量需要在方法的内部定义一个对象,通过对象的引用去访问。

 

通过一段自定义代码再次解释static:

 

//常见的自定义方法

public class Test {

    public static void func(){

        System.out.println("static");

    }

    public static void main(String[] args) {

        func();//打印static

    }

}

 

 

//没有static修饰

public class Test {

    public void func(){

        System.out.println("static");

    }

    public static void main(String[] args) {

        //func();//err

        Test test = new Test();

        test.func();//打印static

    }

}

在Java自定义的方法里面为什么要加static呢?通过上面的代码我们可以知道main方法是静态的(static修饰的),通过学习后我们也知道了静态的成员方法和变量是不依赖对象的,所以当我们自定义的方法没有static修饰时,我们想要访问的话,就需要在方法的内部定义一个对象,通过对象的引用来访问。

 

7.2 static初始化

  静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性

静态成员变量的初始化分为两种:就地初始化 和静态代码块初始化。

八、代码块详解

用{}括起来定义的一段代码就叫做代码块。

 

分为普通代码块(定义在main函数里面) ;构造代码块 ;静态代码块 ;同步代码块(后面文章详解)

 

代码如下:

 

class Student{

    //构造代码块:一般用于初始化实例成员变量

    public Student(){

        System.out.println("构造代码块");

    }

    //实例代码块

    {

        System.out.println("实例代码块");

    }

    //静态代码块:一般用于初始化静态成员变量。

    static{

        System.out.println("静态代码块");

    }

}

public class Test {

    public static void main(String[] args) {

        Student student = new Student();//按照静态——>实例——>构造的顺序打印

        System.out.println("=========");

        Student student1 = new Student();//按照实例——>构造的顺序打印(静态的代码块只会执行一次,不会管你实例化多少个对象)

    }

}

//打印结果

静态代码块

实例代码块

构造代码块

实例代码块

构造代码块

由上面的代码可知:

类是最先被加载的,实例化对象的时候(类加载完成了)就会按照静态——>实例——>构造的顺序打印;二次实例化对象后,按照实例——>构造的顺序打印(静态的代码块只会执行一次,不会管你实例化多少个对象)

如果有多个相同类型的代码块,就看定义的次序。实例代码块只有创建对象的时候才会调用。

静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的

 

posted @   new菜鸟  阅读(215)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示