自学java (day14):static关键字

/**
 *          关于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 类{
 *     静态代码块
 *     实例代码块
 *
 *     静态变量
 *     实例变量
 *
 *     构造方法
 *
 *     静态方法
 *     实例方法
 * }
 */

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值