• 6_面向对象-下之关键字:static


    static:静态的
    1.可以用来修饰的结构:主要用来修饰类的内部结构
      属性、方法、代码块、内部类
    2.static修饰属性:静态变量(或类变量)
      2.1 属性,是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
      * 实例变量:我们创建了类的多个对象,每个对象都独立的拥一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
      * 静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
      * 2.2 static修饰属性的其他说明:
      * ① 静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用
      * ② 静态变量的加载要早于对象的创建。
      * ③ 由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中。
      *
      * ④    类变量   实例变量
      * 类     yes      no
      * 对象    yes     yes
      *
      * 2.3 静态属性举例:System.out; Math.PI;

    3.静态变量内存解析:

      

    4.static修饰方法:静态方法、类方法
      ① 随着类的加载而加载,可以通过"类.静态方法"的方式进行调用
      ②    静态方法   非静态方法
      * 类   yes      no
      * 对象   yes     yes
      ③ 静态方法中,只能调用静态的方法或属性
        非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性

    5. static的注意点:
      5.1 在静态的方法内,不能使用this关键字、super关键字
      5.2 关于静态属性和静态方法的使用,大家都从生命周期的角度去理解。

    6.如何判定属性和方法应该使用static关键字:
      6.1 关于属性
      > 属性是可以被多个对象所共享的,不会随着对象的不同而不同的。
      > 类中的常量也常常声明为static

      6.2 关于方法
      > 操作静态属性的方法,通常设置为static的
      > 工具类中的方法,习惯上声明为static的。 比如:Math、Arrays、Collections
    7.使用举例:
    举例一:Arrays、Math、Collections等工具类
    举例二:单例模式

    public class MyClass {
    //    public static void main(String[] args) {
    //
    //
    //    }
        //饿汉式1
        //1.私化类的构造器
        private MyClass(){
    
        }
        //2.内部创建类的对象
        //4.要求此对象也必须声明为静态
        private static MyClass  mycalss =new MyClass();
        //3.提供公共的静态的方法,返回类的对象
        public static MyClass getMycalss() {
             return mycalss;
        }
        //饿汉式2(使用静态代码块)
        //1.私化类的构造器
        private MyClass(){
    
        }
        //2.内部创建类的对象
        //4.要求此对象也必须声明为静态
        private static MyClass  mycalss =null;
    
        static {
            mycalss=new MyClass();
        }
        public static MyClass getMycalss() {
            return mycalss;
        }
        //懒汉式
        //1.私化类的构造器
        private MyClass(){
    
        }
        //2.内部创建类的对象
        //4.要求此对象也必须声明为静态
        private static MyClass  mycalss =null;
    
    
        public static MyClass getMycalss() {
            if(mycalss==null){
                mycalss=new MyClass();
            }
            return mycalss;
        }
    }

    举例三:

    class Circle{
        
        private double radius;
        private int id;//自动赋值
        
        public Circle(){
            id = init++;
            total++;
        }
        
        public Circle(double radius){
            this();
    //        id = init++;
    //        total++;
            this.radius = radius;
            
        }
        
        private static int total;//记录创建的圆的个数
        private static int init = 1001;//static声明的属性被所有对象所共享
        
        public double findArea(){
            return 3.14 * radius * radius;
        }
    
        public double getRadius() {
            return radius;
        }
    
        public void setRadius(double radius) {
            this.radius = radius;
        }
    
        public int getId() {
            return id;
        }
    
        public static int getTotal() {
            return total;
        }
    
    }

      2.3 两种方式的对比:
      * 饿汉式:
      * 坏处:对象加载时间过长。
      * 好处:饿汉式是线程安全的
      *
      * 懒汉式:好处:延迟对象的创建。
      * 目前的写法坏处:线程不安全。--->到多线程内容时,再修改

    补充

    main()的使用说明

      * 1. main()方法作为程序的入口
      * 2. main()方法也是一个普通的静态方法
      * 3. main()方法可以作为我们与控制台交互的方式。(之前:使用Scanner)
      
      如何将控制台获取的数据传给形参:String[] args?
      运行时:java 类名 "Tom" "Jerry" "123" "true"

      sysout(args[0]);//"Tom"
      sysout(args[3]);//"true" -->Boolean.parseBoolean(args[3]);
      sysout(args[4]);//报异常

  • 相关阅读:
    Appium+unittest+PageObject实例
    monkeyrunner简单用法
    Mac电脑修改系统文件夹的权限
    UIImage剪切
    LLDB 打印 frame
    打开qq在线聊天
    获取当地时间
    微信支付SDK使用心得
    获取当前星期几
    UIView相对于屏幕的frame
  • 原文地址:https://www.cnblogs.com/chengmr/p/13372213.html
Copyright © 2020-2023  润新知