黑马程序员:Java之main函数、static关键字介绍

来源:互联网 发布:oltp是数据挖掘吗 编辑:程序博客网 时间:2024/06/06 20:51
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

main函数

主函数是一个特殊的函数,作为程序的入口,可以被jvm调用

主函数的定义

public static void main(String[] args)

  • public:代表着该函数访问权限是最大的。
  • static:代表主函数随着类的加载就已经存在了
  • void:主函数没有具体返回值
  • main:不是关键字,但是是一个特殊的单词,可以被jvm识别
  • (String[] args):函数的参数,参数类型是一个数组,该数组中的元素是字符串。即字符串类型的数组。

主函数的重载写法

  • public static void main(int x) //这种写法JVM不认为是程序入口
  • public static void main(String[] args) //这是JVM识别的程序入口,只有args可以改成其他的,其他的都不改

题外话:args完整写法:arguments(元素)

JVM调用的默认String[] args到底为何值呢?

1
2
3
4
5
6
7
8
9
10
11
12
class MainDemo
{
    public static void main(String[] args)
    {
          //结果为[Ljava.lang.String;@1a4eb98b,说明是一个new String[]
        System.out.println(args);
          //结果为0,说明main函数默认调用的是new String[0];
        System.out.println(args.length);
          //结果是超出角标的错误。因为args[0]调用的是第一个值,而默认调用的String长度为0
        System.out.println(args[0]);
    }
}

题外话:java命令可以直接给String[] args传入值

如 java MainDemo haha heihei

则System.out.println(args[0]);//结果为haha

 

static(静态)关键字

用于修饰成员,包括成员变量及成员函数

被static修饰的成员有以下特点:

  • 随着类的加载而加载,随着类的消失而消失,说明它的生命周期最长,所以不建议太多的static变量
  • 优先于对象存在,静态先存在,对象后存在
  • 被所有对象所共享 //当多个对象中的变量存在想同值时,可通过static String country = "CN";来定义,可以节省内存空间。不会导致每个对象中存在重复的country变量。
  • 可以直接被类名调用  写法:类名.静态成员  如:Person.country

使用注意事项:

  • 静态方法只能访问静态成员。非静态方法即可以访问静态也可以访问非静态。
  • 静态方法中不可以写this,super关键字
  • 主函数是静态的
  • 静态函数只能被静态函数覆盖(重写),静态函数只能覆盖静态函数

关于特有数据和共享数据的内存存放空间

特有数据随着对象存储在堆内存中。共性内容(共享)存在方法区(也叫共享区、数据区)

1
2
3
4
5
6
7
8
9
class Person
{
    String name; //成员变量,实例变量。随对象的存在而存在,对象的消失而消失。
    static String country = "CN"//静态的成员变量,类变量
    public void show()
    {
        System.out.println(name+":"+country);  
    }
}

实例变量和类变量的区别:

  • 存放位置:
    类变量随着类的加载而存在于方法区中。
    实例变量随着对象的加载而存在于堆内存中。
  • 生命周期:
    类变量生命周期最长,随类的消失而消失
    实例变量的生命周期,随着对象的消失而消失

静态的利与弊

  • 利:对对象的共享数据进行单独空间的存储,节省内存空间,没必要每个对象中都存储一份,且可以直接被类名调用。
  • 弊:生命周期过长,访问有局限性(只能访问静态)

什么时候使用静态:

  • 当对象中出现共享数据时,该数据被静态(static)所修饰
  • 当函数内部没有访问到非静态数据时,可以定义为静态函数

 

静态代码块

格式:

1
2
3
4
static
{
    静态代码块中的执行语句;
}

特点:随着类的加载而执行,只执行一次(静态代码块只要加载过,就算再执行也不会执行),并优先于主函数
用于给类进行初始化

题外话:

静态代码块、构造代码块、构造函数之间的执行顺序问题

静态代码块>构造代码块>构造函数

原因:

静态代码块:给类初始化,随类的加载而加载

构造代码块:给对象初始化,对象一建立就加载,优先于构造函数

构造函数:给指定对象初始化,指定对象一建立就加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class BlockDemo
{
    public static void main(String[] args)
    {
        Block b = new Block(3); //结果输出:d c b 3
    }
}
 
class Block
{
    Block()
    {
        System.out.println("a");   
    }
    static
    {
        System.out.println("d");   
    }
    Block(int a)
    {
        System.out.println(a); 
    }
    {
        System.out.println("b");   
    }
    static
    {
        System.out.println("c");   
    }
}

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net
原创粉丝点击