[JAVA笔记]-基础-Static静态非静态

static 可以修饰什么?

  • 可以修饰成员变量,修饰成员方法,修饰内部类
  • 不可以修饰局部变量,原因: 静态成员属于类的,不属于方法的。

static 关键字的特点?

  • 静态成员被所在类的对象共享
  • 静态成员可以通过类名进行调用
  • 静态成员随着类的加载而加载
  • 静态成员优先于对象存在
  • 注意事项 :先进内存的不能调用后进内存的
  • 对应案例:
public class Demo_Static {
    public static void main(String[] args) {
        //静态成员可以通过类名调用
        Student.nationality = "中国";

        Student student1 = new Student("张三",23);
        Student student2 = new Student("李四",24);

        //静态成员被所在的类的成员共享
        System.out.println("student1的国籍:"+student1.getNationality());
        System.out.println("student2的国籍:"+student2.getNationality());
    }
}
  • 运行结果:
student1的国籍:中国
student2的国籍:中国

static 方法访问特点?.

静态方法只能调用静态成员(静态成员变量,静态成员方法).

非静态方法可以调用任意成员(静态和非静态都可以)-

  • 原因: 静态方法(static 修饰的方法),属于类的方法,是随着类的加载而加载,所以静态方法可以直接通过类名来调用,静态方法也可以访问其他静态方法,; 非静态方法属于对象方法,因为类优先于对象存在,静态方法随着类加载而加载,所以当静态方法加载到内存时,非静态方法还没有在内存中存在,先进内存的调用不了后进内存的,所以静态方法调用不了非静态方法,非静态方法需要通过创建对象,用对象进行调用.
  • 对应案例:
public class Demo_Static2 {
    /*
    1.静态方法只能调用静态成员(静态成员变量, 静态成员方法)
    2.非静态方法可以调用任意成员(静态和非静态都可以)
    */
        static String a;
        String b;

        public static void staticMethod1() {
            System.out.println(a);
            System.out.println(b);//报错!
            staticMethod2();
            method2();//报错!
        }

        public static void staticMethod2() {
        }

        public void method1() {
        	//都没有报错
            System.out.println(a);
            System.out.println(b);
            staticMethod2();
            method2();
        }

        public void method2() {

        }
}

Java 中是否可以重写 private 或者 static 修饰的方法?

  • 不可以:
    • private 修饰的方法不能被重写,private 修饰的成员只能在本类中访问.
    • 静态的方法可以被继承,但是不能重写。如果父类中有一个静态方法, 子类也有一个与其方法名参数列表相同静态方法,那么该子类的方法会把原来继承过来的父类方法隐藏, 而不是重写, 简单来说,就是父类的static方法和子类的static方法是没有关系的两个方法.
public class Demo_Static3 {

}
class Father {
    private void privatemethod(){
        System.out.println("我是私有方法");
    }
    public static void staticmethod(){
        System.out.println("我是静态方法");
    }
}

class Son extends Father{
    /*
    @Override//报错,
    private void privatemethod(){
    }
    @Override//报错
    public static void staticmethod(){
    }
    */
}

非静态内部类与静态内部类的区别?

  • 成员变量区别!
    • 静态内部类 :可以定义静态和非静态的成员变量
    • 非静态内部类 :只能定义非静态的成员
  • 成员方法区别.
    • 静态内部类 :可以定义静态方法和非静态方法
    • 非静态内部类: 只能定义非静态方法
  • 非静态方法访问区别
    • 静态内部类 :可以访问内部的静态和非静态成员,但只能访问外部类的静态成员
    • 非静态内部类: 可以访问内部的非静态成员(静态成员无法定义),外部的静态与非静态.
  • 对应案例:
public class Demo_Static4 {
    private static String name ="name";
    private String num = "num";
    //静态内部类
    static class Person1 {
        // 静态内部类中可以定义非静态和静态的成员变量
        private String address = "China";
        private static String mail = "dakele.itcast.cn";

        //非静态方法
        public void method() {
            //可以访问内部的静态和非静态成员
            System.out.println(address + "---" + mail);//访问本内部类成员。

            //静态内部类只能访问外部类的静态成员
            System.out.println(name);
            System.out.println(num);//报错
        }
        //静态方法
        public static void method1() {}

    }
    //非静态内部类
    class Person2 {
        //非静态内部类: 只能定义非静态的成员
        private String address = "China";
        public static String mail ="mail.126.com";//报错
        //非静态方法
        public void method2(){
            //非静态内部类只能访问内部类的非静态成员
            System.out.println(address);

            //非静态内部类可以访问外部的静态和非静态成员(和方法)
            System.out.println(name);
            System.out.println(num);
        }
        
        //非静态内部类中不能有静态方法-报错
        public static void method3() {
        }
    }
}

静态代码块特点及作用?.

  • 格式: static{ 静态代码块中执行的代码 }
  • 特点:随着类的加载而加载,优先于构造方法执行,并且只执行一次.
  • 作用:用于给类初始化,加载驱动等。
  • 对应案例 :
public class Demo_Static5 {
    static {
        System.out.println("静态代码块执行");
    }

    public Demo_Static5(){
        System.out.println("构造方法执行");
    }

    public static void main(String[] args) {
        Demo_Static5 ds1 = new Demo_Static5();
        Demo_Static5 ds2 = new Demo_Static5();
        System.out.println("main方法执行");
    }
}

static修饰符使用时利弊?.

  • 利:
    • 静态方法被在类所有的对象共享,没必要每个对象都存储一份,目的节省空间
    • 可以通过类名调用,方便使用
  • 弊:
    • 静态方法随着类的加载而加载, 随着类的消失而消失,生命周期较长
    • 访问有局限性,只能访问静态

应用场景

  • 在项目中 很多工具类会使用static 定义方法,不用创建对象,拿对象调用方法.使用 工具通过类名直接调用方法,减少对象的创建。例如:项目中的 UUIDUtils, java里面的Math类下面都是静态方法,直接类名调用,Math.abc();
  • 常见的单例模式. 单例模式方法定义为静态方法:不能使用该类在其他地方创建对象,而是通过该类自身提供的静态方法返回此类的实例。
public class Demo_Static6 {
    //私有构造
    private Demo_Static6(){}
    
    private static Demo_Static6 single = new Demo_Static6();
    
    //静态工厂方法
    public static Demo_Static6 getInstance(){
        return single;
    }
}
更新时间:2019-10-18 14:52:01

本文由 Alicyu 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://www.alicyu.com/archives/static
最后更新:2019-10-18 14:52:01

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×