zoukankan      html  css  js  c++  java
  • 探索static——不需要能够使用该类实例?


           在一般情况下。需要使用一个上课时间。你必须先实例化类,它调用的能力。在编程过程中发现。有些类不能直接实例来使用,利用其场、法等等。

           这时候。靠的就是static作用。static英文意思为“精巧的。静态的”,在OOP中能够作为修饰符。类、字段、属性、方法等被static修饰后,变为静态类、静态字段、静态属性、静态方法……

           static修饰的类成为静态类,静态类仅仅能包括静态成员(被static修饰的字段、属性、方法),不能被实例化,不能被继承;非静态中能够包括静态成员。

      


           1、被调用时必须先实例化的情况:

           被调用成员为非静态成员此时它所属的类肯定为非静态类)。例如以下小样例:

        public class ClassA      //ClassA类(非静态类)
        {
            public ClassA() { }  //构造函数
            public void Fun() { }//ClassA类中的方法(非静态方法)
        }
    
        public class ClassB     //须要调用ClassA类中方法的ClassB类
        {
            public ClassB() { }  //构造函数
            public void Fun()  
            {
                ClassA a = new ClassA();//调用ClassA类中的方法须要先实例化
                a.Fun();
            }
        }
          说明:ClassA类为非静态类。当中的方法Fun()也为非静态方法,所以在ClassB中调用时须要先实例化ClassA类。


           2、被调用时不须要实例化的情况:

           被调用成员为静态成员此时它所属的类为静态类或非静态类)。例如以下小样例:

           (1)被调用类为非静态类:

        public class ClassA      //ClassA类(非静态类)
        {
            public ClassA() { }  //构造函数
            public static void Fun() { }//ClassA类中的方法(静态方法)
        }
    
        public class ClassB     //须要调用ClassA类中方法的ClassB类
        {
            public ClassB() { }  //构造函数
            public void Fun()  
            {
                ClassA.Fun();  //调用ClassA类中的方法直接调用:类名.成员
            }
        }
           说明:ClassA类为非静态类,但当中的方法Fun()为非静态方法。所以在ClassB中调用时不实例化ClassA类(并且不能实例化)。直接调用其成员,语法为“类名.成员”。 

           (2)被调用类为静态类:

        public static class ClassA      //ClassA类(静态类)
        {
            //当然静态类中不能存在构造函数
            public static void Fun() { }//ClassA类中的方法(静态方法)
        }
    
        public class ClassB     //须要调用ClassA类中方法的ClassB类
        {
            public ClassB() { }  //构造函数
            public void Fun()  
            {
                ClassA.Fun();  //调用ClassA类中的方法直接调用:类名.成员
            }
        }
           说明:ClassA类为静态类,当中的方法也Fun()为非静态方法,所以在ClassB中调用时不实例化ClassA类(并且不能实例化),直接调用其成员,语法为“类名.成员”。 

           3、static修饰符(拓展):

            (1) 用来修饰类或类的成员,这时不须要创建实例就能訪问(并且不能实例化),在被调用的时候自己主动实例化,且在内存中产生一个实例。当含有静态成员的非静态类实例化出对象后,这些对象公用这些静态成员。通过类名或对象名都能訪问它们。
            在网上看到两个有趣的小样例:
            人是一个非静态类。

    有脑子。这是一个用static修饰的属性。
    这个属性是针对全部的人,是人的共同特征。而不是某个特点对象所特有的(比方张三有脑子。李四没脑子),由于仅仅要是个人,他都有脑子(尽管卡洛斯·罗德里格兹仅仅有半个脑子,还有些人比較脑残→_→。那也算是有脑子),既然是人类共同拥有的,那么他就不能被实例化。

            
           另外一个能被实例化的样例,还是人这个类。人的身高,就是一个非static的属性。

    由于每一个人的身高是不同的。比方我身材魁梧,高达1.55米,这个1.55米是描写叙述我的身高,是跟我这个特定的对象有联系的。

    姚明才2.26米。这是姚明这个对象的数据。无论是1.55还是2.26,这都和特定的对象有联系。而不是人类所共同拥有的特征。

    所以非static的能够被实例化,而static不能被实例化。

      

           (2) 修饰方法内部的静态变量
           我们的代码都是从硬盘载入到内存中才干执行的。在内存中主要分为三个区域,来存放我们的代码。各自是堆、栈和静态存储区。堆中存放的是代码中的引用类型变量,如类的实例、数组等。栈中存放的是代码中的值类型,如整型、浮点型、布尔型等;静态存储区中存放静态变量和全局变量、常亮。

           整个程序执行时。代码都是共用静态存储区中的静态变量的。比如定义存款剩余金额为静态变量,同一个银行卡号,不管你是在银行取钱、在ATM机取钱。还是网银消费,用的都是这个静态的剩余金额。

           所以,方法内部的静态变量,运行完静态变量值不消失。再次运行此对象的方法时,值仍存在,它不是在堆和栈中分配的,是在静态区非配的, 这是与局部变量最大的差别。关于内存分配问题可參考《静态存储区、堆和栈的差别》



    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    [LeetCode] 134. Gas Station Java
    [LeetCode] 22. Best Time to Buy and Sell Stock II Java
    [LeetCode] 55. Jump Game Java
    [LeetCode] 264. Ugly Number II Java
    [LeetCode] 331. Verify Preorder Serialization of a Binary Tree Java
    [LeetCode] 232. Implement Queue using Stacks Java
    java.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory的解决办法
    Linux centos 连接网络
    MyEclipse默认编码为GBK,修改为UTF8的方法
    表单
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4748415.html
Copyright © 2011-2022 走看看