这里的静态,指以static关键字修饰的,包括类,方法,块,字段。
非静态,指没有用static 修饰的。
静态有一些特点:
1.全局唯一,任何一次的修改都是全局性的影响
2.只加载一次,优先于非静态
3.使用方式上不依赖于实例对象。
4.生命周期属于类级别,从JVM 加载开始到JVM卸载结束。
静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。静态方法只能访问静态成员,实例方法可以访问静态和实例成员,因为静态成员(静态变量和静态方法是类自己的,所以是每个实例所共享的); 之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,变量(即类变量的赋值动作和静态代码块),所以此时当然不可以调用实例方法和实例变量。静态方法在编译期可知,运行期不可变的特点,所以在类加载的解析阶段,就会将类如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。 main()方法是一个典型的静态方法,它同样遵循一般静态方法的规则,所以它可以由系统在创建对象之前就调用。 从虚拟机角度来说,因为在类加载时,要对静态成员变量初始化,第一次在准备阶段,初始化为0值或null 值,第二次在初始化阶段,调用类构造器<clinit>初始化静态成员
方法的符号引用转化为直接引用,运行时即不可变了,调用指令为:invokeststic。而如果可以用实例变量或实例方法,那么久不是运行期不可变了,所以从虚拟机的底层角度来说,
静态成员(静态字段,方法,代码块)不可以调用非静态成员(实例字段,方法,代码段)。关于静态内部类(嵌套类)和非静态内部类的区别
(1)静态内部类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。
(2)非静态内部类能够访问外部类的静态和非静态成员。静态内部类不能访问外部类的非静态成员,只能访问外部类的静态成员,因为内部类也相当于外部类的一个成员,所以
也要遵循这个上面的规则。
(3)一个非静态内部类不能脱离外部类实体被创建,一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面,因为成员之间可以互相访问(静态成员特殊)。
(4)静态内部类的修饰符:public,private,protected,省略省略访问控制符(即default),static,外部类只能用public,省略访问控制符,即default,包访问权限。
(5)内部类成员可以访问外部类私有数据,因为内部类被当成外部类成员,同一个类的成员之间可以相互访问(注意静态和非静态即可),但是外部类不可以直接访问内部类的实现细节。
(6)非静态内部类可以访问外部类静态成员,静态内部类实例,但是不可以定义静态成员。
/* 下面程序演示如何在java中创建静态内部类和非静态内部类 */ class OuterClass{ private static String msg = "GeeksForGeeks"; // 静态内部类 public static class NestedStaticClass{ // 静态内部类只能访问外部类的静态成员 public void printMessage() { // 试着将msg改成非静态的,这将导致编译错误 System.out.println("Message from nested static class: " + msg); } } // 非静态内部类 public class InnerClass{ // 不管是静态方法还是非静态方法都可以在非静态内部类中访问 public void display(){ System.out.println("Message from non-static nested class: "+ msg); } } } class Main { // 怎么创建静态内部类和非静态内部类的实例 public static void main(String args[]){ // 创建静态内部类的实例 OuterClass.NestedStaticClass printer = new OuterClass.NestedStaticClass(); // 创建静态内部类的非静态方法 printer.printMessage(); // 为了创建非静态内部类,我们需要外部类的实例 OuterClass outer = new OuterClass(); OuterClass.InnerClass inner = outer.new InnerClass(); // 调用非静态内部类的非静态方法 inner.display(); // 我们也可以结合以上步骤,一步创建的内部类实例 OuterClass.InnerClass innerObject = new OuterClass().new InnerClass(); // 同样我们现在可以调用内部类方法 innerObject.display(); } }
java的静态成员和静态方法,非静态内部类和静态内部类的区别
最新推荐文章于 2022-08-28 15:39:07 发布