黑马程序员--03.Java面向对象--02.【static关键字】【main方法】【静态成员】

本文深入讲解Java中的static关键字,包括其基本用法、特点、注意事项以及如何合理使用。同时介绍了main方法的作用及其标准格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java面向对象--02

static关键字 main方法 静态成员

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

1.    static知识点

1). 方法区/共享区/数据区

(1). 类中的函数代码本身==>这片区域叫方法区的意义

       **方法内部使用局部变量数据是存储在栈中该方法对应的区域

(2). 类中的静态数据 (也就是共享数据) ==è这片区域叫共享区的意义

2). static的基本用法

(1). static 是一个修饰符只能修饰类的成员(也就是只能修饰成员变量和成员方法)

       static绝对不能修饰局部变量!!!

(2). 静态成员的两种调用方式

[1]. 对象引用.静态成员变量

[2]. 类名.静态成员变量

(3). 静态成员变量存储的位置

类中静态成员变量是存储在方法区/共享区/数据区***

类中静态成员是存储在堆内存

注意区分上面两种情况。

(4). static静态成员的特点

[1].随着类加载而加载,随着类的消失而消失与类共存亡

class Person{
    Stringname;
    static String country;
}

注意这个Person类一加载到内存的时候,静态成员变量country就在方法区开辟内存空间。随着类加载而加载。

[2]. 先于类的对象存在

[3]. 被所有的该类的对象共享

[4]. 可以通过类名来调用静态成员

(5). 别名

[1]. 静态成员变量也叫类变量

[2]. 静态成员变量也叫实例变量

3). 类变量和实例变量的区别

 

内存中的存储位置

生命周期

类变量/静态变量

随着类加载而加载,存储到方法区

共存亡

实例变量/非静态变量

随着对象建立而存在堆内存

对象共存亡

 

4). 静态使用的注意事项

(1). 静态成员方法只能访问静态的成员(方法/变量) ------à静态只能访问静态

       非静态可以访问静态(原因就是对象也可以调用静态成员)。

       结论静态 (方法)只能访问静态但是非静态 (方法)可以访问任意

       【个人理解】

       [1].澄清一下:这个静态成员方法调用的是本类的非静态成员才会出问题

所以,如果通过静态方法调用

{1}.没有“对象.”非静态成员

{2}. this.本类非静态成员”

都是错误的,编译无法通过!!

       [2].如果调用有“非this的具体对象引用.非静态成员”是可以的。

       所以,大原则:如果静态方法调用的非静态的成员,这个成员之前的对象是存在,那就没有问题。

(2). 静态方法中不可以使用superthis等关键字

(3). main方法为静态的

5). 静态的利与弊

(1). 静态的好处

       [1].节省空间。对对象的共享数据在方法区单独开辟了内存空间。没有为每一个对象在堆内存中单独复制一份备份。

       [2].调用方便。类名就可以直接调用静态方法,不用创建实例再调用。

(2). 静态的坏处

       [1],生命周期过长

       [2].出现访问局限性(只能访问本类的静态成员。 无法直接访问非静态成员)

6). 如何使用static

(1). 何时使用static修饰成员变量

[1]. 当类中出现了所有对象共享的数据,那么就把这个成员定义为static的成员变量

[2]. 每个对象都有不同取值的成员变量对象特有的属性,应该定义成非静态的成员变量

(2). 何时使用static修饰成员方法

[1]. 当要定义的函数的功能没有直接访问到该类的非静态成员或者通过this来访问该类的非静态成员的时候,将这个要定义的功能设置为static的成员方法

2.    main函数

1). main方法的作用

main方法是程序的入口,可以被JVM调用。

2). main方法的标准格式及含义

(1). main函数各个部分的含义

publicstatic void main(String[] args) {}

[1]. public: 访问修饰符

{1}. 代表main函数的访问权限是最大的,由JVM调用。

{2}. main不是Java中的关键字,但是确是可以被JVM识别。

[2]. static: 成员修饰符

{1}. main方法在Java中一定是在某个类的成员位置上出现的。所以,可以被专门修饰成员的修饰符static来修饰。

{2}. 代表main函数是随着所属的类加载而加载到内存中的方法区。

{3}. JVM直接采用 “类名.main()”来调用某个类的主方法。

[3]. void: 返回值类型

主函数没有具体返回值。这是因为JVM自身调用main方法,main中如何执行的,JVM本身非常清楚,所以不存在什么数据的值,JVM不知道,所以执行完main方法之后,没有必要给JVM一个返回值。

[4]. String[] args:参数列表

    {1}.main方法的参数是一个字符类型的数组。

    {2}.用来接受程序在启动执行的时候,用户传递给程序的参数。这些参数以String的形式存储到String[] args中。

(2). 主函数main的格式是固定的

[1]. 如果想JVM识别main方法,那么这个main方法必须遵从

       public static void main(String[] args) {}

[2]. 以上的格式中,只有形参列表String[] args的变量名args可以改变其余的地方如果被改变,虽然能通过编译(这是因为只要是函数,就能够被重载),但是无法被JVM识别!!!!

e.g.

public static void main(int x){}

    public static void main(String[] args) {}

其中,JVM只能识别第二个main方法。第一个作为第二个的重载形式可以存在,所以编译通过。

(3). 为主方法main传值的两种方式

[1]. 通过JDK中的java.exe这个工具为main的String[]传值。

假设MainDemo为一个类名

{1}. > javaMainDemo

       要执行哪个类,就把类名作为参数传入JVM。传入这个类名之后,JVM会调用这个类的main方法。

{2}. >javaMainDemo tomcat jetty maven

JVM会将类名之后字符串分别封装到MainDemo类的main方法中的String[]args参数。

[2]. 通过其他方法调用main并为其进行传值

class MainDemo{
    public static void main(String[] args) {
        for(String arg: args){
            System.out.println(arg);
        }
    }
}
class MainTest{
    public static void main(String[] args) {
        show();
    }
    static void show(){
        String[]arr =new String[]{"Tomcat", "Maven","Jetty"};
        MainDemo.main(arr);//其他方法调用了MainDemo的main方法,并且为其进行了传值
    }
}


输出结果:

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值