/** * 关于java中的static关键字 * 1、static修饰的方法为静态方法 * 2、static修饰的变量为静态变量 * 3、static翻译为“静态的 ” * 4、所有static修饰的元素都是静态的,都可以采用“类名.”的方式访问,也可以采用“引用.”的方式访问【不建议,】 * 5、static修饰的元素都是类级别的特征,和具体的对象无关 */ /** * 什么时候成员变量要声明成静态变量呢? * --所有对象都有这个属性,但是所有对象的这个属性的值是相同的,就给他设置为静态变量,节省内存的开销 * * 什么时候成员变量要声明成实例变量呢? * --所有对象都有这个属性,但是这个属性的值会随着对象的变化而变化,【换句话说,就是不同对象这个属性的值不同】 * * 静态变量在类加载的时候初始化,内存开辟在方法区内存中,访问的时候采用“类名.静态变量”的方式访问 */
/** * 可以使用static关键字来定义“静态代码块”: * 1、语法格式: * static{ * java语句; * } * * 2、静态代码块在类加载的时候执行,并且只执行一次。 * * 3、static关键字定义的“静态代码块”是在“main主方法”之前执行的。 * * 4、static关键字定义的“静态代码块”可以在一个类中写N个,都在“main主方法”之前执行的,并且是有执行顺序的(自上而下)。 * * 5、静态代码块的作用?怎么用?用在哪?什么时候用? * --这和具体的需求有关。例如项目需求在类加载的时刻执行代码完成日志的记录 * 那么这段记录日志的代码就可以编写到静态代码块中,完成日志记录 * --静态代码块是java为程序员准备的一个特殊时刻,这个特殊时刻被称为类加载时刻, * 如果希望在此执行一段特殊的程序,这段程序可以直接放在静态代码块中 */
/**
* "中国人"类
*/
public class Chinese {
//身份证号【每个对象的身份证号不同】
private String id;//实例变量
//姓名【每个对象的姓名不同】
private String name;//实例变量[一个java对象就有一份,100个java对象就有100个姓名],这种设计方式的缺点???
//国籍【每一个对象由于都是“Chinese”类实例化的,所以每个中国人的国籍都是“中国‘】
//无论通过Chinese类实例化多少个对象,这些对象的国籍都是’”中国“
//因为每个人的国籍都是“中国”,每次调用都需要创建一个对象,这样的话太浪费内存空间了,,,,,,,,,,,,,,,,优化方法如下↓↓↓↓
//【所有对象国籍都一样,这种特征属于类级别的特征,可以提升为整个模板的特征,可以在变量前加上“static”关键字修饰】
//静态变量,静态变量在类加载的时候初始化,不需要创建对象,内存就开辟了
//静态变量存在于方法区内存中
/**
* 优化前
private String country;//实例变量
*/
//优化后
static String country="中国";
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
//构造方法(无参构造)
public Chinese(){
}
//构造方法(有参构造)
/**
* 优化前
public Chinese(String id,String name,String country){
this.id=id;
this.name=name;
this.country=country;
}
*/
//优化后
public Chinese(String id,String name){
this.id=id;
this.name=name;
}
}
public class ChineseTest {
public static void main(String[] args) {
/**
* 《《《《《《《《《《《《《《优化前》》》》》》》》》》》》
//创建中国人对象1
Chinese c1 = new Chinese("1", "张三", "中国");
System.out.println(c1.getId()+","+c1.getName()+","+c1.getCountry());
//创建中国人对象2,,,,,创建对象就要构造方法在Chinese里
Chinese c2 = new Chinese("2", "李四", "中国");
System.out.println(c2.getId()+","+c2.getName()+","+c2.getCountry());
}
*/
//《《《《《《《《《《《《《《优化后》》》》》》》》》》》》》》》》
//创建中国人对象1
Chinese c1 = new Chinese("1", "张三");
System.out.println(c1.getId()+","+c1.getName()+","+Chinese.country);
//创建中国人对象2,,,,,创建对象就要构造方法在Chinese里
Chinese c2 = new Chinese("2", "李四");
System.out.println(c2.getId()+","+c2.getName()+","+Chinese.country);
}
}
/**
* 可以使用static关键字来定义“静态代码块”:
* 1、语法格式:
* static{
* java语句;
* }
*
* 2、静态代码块在类加载的时候执行,并且只执行一次。
*
* 3、static关键字定义的“静态代码块”是在“main主方法”之前执行的。
*
* 4、static关键字定义的“静态代码块”可以在一个类中写N个,都在“main主方法”之前执行的,并且是有执行顺序的(自上而下)。
*
* 5、静态代码块的作用?怎么用?用在哪?什么时候用?
* --这和具体的需求有关。例如项目需求在类加载的时刻执行代码完成日志的记录
* 那么这段记录日志的代码就可以编写到静态代码块中,完成日志记录
* --静态代码块是java为程序员准备的一个特殊时刻,这个特殊时刻被称为类加载时刻,
* 如果希望在此执行一段特殊的程序,这段程序可以直接放在静态代码块中
*/
public class StaticTest {
static{
System.out.println("类加载-->1");
}
static{
System.out.println("类加载-->2");
}
static{
System.out.println("类加载-->3");
}
public static void main(String[] args){
System.out.println("main begin");
}
}
/**
* 什么时候定义为静态的?
* 方法描述的是动作,当所有的对象执行这个动作的时候,最终产生的影响是一样的,那么这个动作已经不再属于某个对象的动作了,
* 可以将这个动作提升为类级别的动作,模板级别的动作
*
* 静态方法中无法直接访问实例变量和实例方法
*/
public class StaticTest {
public static void main(String[] args){
}
}
/**
* 《《《《《《《《《《《《《《 总结 》》》》》》》》》》》》》》》》
* class 类{
* 静态代码块
* 实例代码块
*
* 静态变量
* 实例变量
*
* 构造方法
*
* 静态方法
* 实例方法
* }
*/