package cn.china; /* * 主函数特殊之处: * 1.格式是固定的 * 2.被jvm所调用和识别 * public:权限必须是最大的 * static:虚拟机调用的时候不需要new对象,直接用主函数所属类名调用即可。 * void:主函数没有具体的返回值。 * main:函数名,不是关键字,只是一个JVM识别的固定名字。 * String[]args:这是主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。*/ public class testDemo1 { public static void main(String[] args) { Person p1=new Person(); //p1.name="小强"; //p1.show(); //类名可以直接调用static关键字修饰的变量 System.out.println(Person.country); } } class Person{ String name;//成员变量,实例变量 /* * static关键字,设置共享数据 * static特点: * 1、static是一个修饰符,用于修饰成员 * 2、被static修饰的成员,被所有的对象共享 * 3、static优先于对象存在,因为static的成员随着类的加载就已经存在了 * 4、static修饰的成员多了一种调用方式,可以直接被类名所调用。类名.静态成员 * 5.静态修饰数据是共享数据,对象中存储的是特有数据*/ static String country="china";//静态变量,类变量 /* * 成员变量与静态变量的区别? * 1、两个变量的生命周期不同。 * 成员变量随着对象的创建而存在,随着对象的被回收而被释放 * 静态变量随着类的加载而存在,随着类的消失而消失 * 2、调用方式不同。 * 成员变量只能被对象调用 * 静态变量可以被对象调用,也可以被类名调用。 * 3、别名不同 * 成员变量也称为实例变量 * 静态变量也成为类变量 * 4、数据的存储的位置不同 * 成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。 * 静态变量数据存储在方法区(共享数据区)的静态区中,所以也叫对象的共享数据。 * */ /*静态使用注意事项: * 1、静态方法只能访问静态成员。因为非静态要存在于实体中,而静态成员先在,非静态需要实例化以后才存在堆内存中 * 2、静态方法中不可以使用this或者super关键字。因为没有对象,静态方法存在于对象之前; * 3、主函数是静态的。 * */ /* * 静态什么时候用? * 1、静态变量 * 当分析对象中所具备的成员变量的值都是相同的,这个成员就可以被静态修饰。 * 只要数据在对象中是不同的,就是对象的特有数据,必须存储在对象中,是非静态的。 * 如果是相同的数据,对象不需要修改,只需要使用即可,不需要存储在对象中,定义成静态的 * 2、静态函数 * 函数是否用静态修饰,就参考一点,该函数功能是否访问到对象中的特有数据。 * 简单点说,从源代码看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。 * 如果不需要,就可以将该功能定义成静态。当然,也可以定义为非静态的, * 但是非静态需要被对象调用吗,而创建对象调用非静态的没有访问特有数据方法,该对象定义没有任何意义,浪费堆内存*/ /* * 静态代码块 * 随着类的加载,而执行。而且只执行一次。 * 作用: * 用于给类进行初始化*/ static int num; static{ num=10; num*=3; System.out.println("java"+num); } /* * 构造代码块 * 构造代码块可以给所有对象进行初始化,构造函数是给对应的对象进行初始化。 * */ { System.out.println("wawa!!!"); } public static void show1(){ System.out.println(Person.country+":"); } public void show() { /* * 局部代码块 * 限定局部变量生命周期*/ { System.out.println("sdfgd"); } System.out.println(country+":"+name); // TODO Auto-generated constructor stub } }