zoukankan      html  css  js  c++  java
  • 宋体静态内部类static class 静态类的实例化

    在本篇文章中,我们主要介绍宋体静态内部类的容内,自我感觉有个不错的建议和大家分享下

        

     

        

    先应用网上一篇写的比较好的文章(http://klcwt.iteye.com/blog/452834),大家先看一下

        

    一般情况下是不可以用static饰修类的。如果定一要用static饰修类的话,平日static饰修的是匿名部内类。

        

    在一个类中创立另外一个类,叫做成员部内类。这个成员部内类可以静态的(利用static症结字饰修),也可以长短静态的。由于静态的部内类在义定、应用的时候会有各种的制限。所以在际实任务用中到的并不多。

        

    在发开中程过,部内类中应用的最多的还长短静态地成员部内类。不过在特定的情况下,静态部内类也可以挥发其特独的用作。

    一、静态部内类的应用目标。

    在义定部内类的时候,可以在其后面加上一个权限饰修符static。此时这个部内类就变为了静态部内类。不过由于各种的因原,如应用上的制限等等要素(具体的应用制限,笔者在面上的容内中会具体述阐),在际实任务用中的并非很多。但是并非说其没有值价。在某些殊特的情况下,少了这个静态部内类还真是不可。如在停止代码序程试测的时候,如果在个一每Java源件文中都设置一个主方法(主方法是某个应用序程的进口,必须拥有),那么会涌现很多额定的代码。而且最主要的时这段主序程的代码对于Java件文说来,只是一个式形,其本身并不须要种这主方法。但是少了这个主方法又是千万不可的。在种这情况下,以可就将主方法写入到静态部内类中,从而不用为个一每Java源件文都设置一个类似的主方法。这对于代码试测长短常有效的。在一些中大型的应用序程发开中,则是一个经常使用的技术手段。为此,这个静态部内类虽然不怎么经常使用,但是序程发开人员还必须要握掌它。许也在某个症结的刻时,其还可以挥发伟大的用作也说不定。

        

     

        

    二、静态部内类的应用制限。

    将某个部内类义定为静态类,跟将其他类义定为静态类的方法基本雷同,引用则规也基本分歧。不过其细节方面仍然有很大的不同。具体说来,主要有如下几个地方要引发各位序程发开人员的注意。

    一是静态成员(包含静态变量与静态成员)的义定。一般情况下,如果一个部内类不是被义定成静态部内类,那么在义定成员变量或者成员方法的时候,是不可以被义定成静态成员变量与静态成员方法的。也就是说,在非静态部内类中不可以声明静态成员。如现在在一个student类中义定了一个部内类age,如果没有将这个类利用static症结字饰修,即没有义定为静态类,那么在这个部内类中如果要利用static症结字来饰修某个成员方法或者成员变量是不允许的。在译编的时候就通不过。故序程发开人员须要注意,只有将某个部内类饰修为静态类,然后才可以在这个类中义定静态的成员变量与成员方法。这是静态部内类都有的一个特性。也恰是因为这个因原,有时候少了这个静态的部内类,很多任务就法无成完。或者说要绕一个大圈才可以实现某个用户的需求。这也是静态的部内类之所以要存在的一个重要因原。

    二是在成员的引用上,有比大较的制限。一般的非静态部内类,可以随便的问访外部类中的成员变量与成员方法。即使这些成员方法被饰修为private(私有的成员变量或者方法),其非静态部内类都可以随便的问访。则长短静态部内类的权特。因为在其他类中是法无问访被义定为私有的成员变量或则方法。但是如果一个部内类被义定为静态的,那么在银用外部类的成员方法或则成员变量的时候,就会有诸多的制限。如不可以从静态部内类的对象中问访外部类的非静态成员(包含成员变量与成员方法)这是什么意思呢?如果在外部类中义定了两个变量,一个长短静态的变量,一个是静态的变量。那么在静态部内类中,无论在成员方法部内还是在其他地方,都只可以引用外部类中的静态的变量,而不可以问访非静态的变量。在静态部内类中,可以义定静态的方法(也只有在静态的部内类中可以义定静态的方法),在静态方法中引用外部类的成员。但是无论在部内类的什么地方引用,有一个共同点,即都只可以引用外部类中的静态成员方法或者成员变量。对于那些非静态的成员变量与成员方法,在静态部内类中是法无问访的。这就是静态部内类的最大应用制限。在通普的非静态部内类中是没有这个制限的。也恰是这个因原,决议了静态部内类只应用在一些特定的合场。其应用范围远远没有像非静态的部内类那样泛广。

    三是在创立静态部内类时不须要将静态部内类的实例绑定在外部类的实例上

    平日情况下,在一个类中创立成员部内类的时候,有一个强制性的定规,即部内类的实例定一要绑定在外部类的实例中。也就是说,在创立部内类之前要先在外部类中要利用new症结字来创立这个部内类的对象。如此的话如果从外部类中初始化一个部内类对象,那么部内类对象就会绑定在外部类对象上。也就是说,通普非静态部内类的对象是依靠在外部类对象中之的。但是,如果成员发开人员创立的时静态部内类,那么这就又另当别论了。平日情况下,序程员在义定静态部内类的时候,是不须要义定绑定在外部类的实例上的。也就是说,要在一个外部类中义定一个静态的部内类,不须要利用症结字new来创立部内类的实例。即在创立静态类部内对象时,不须要其外部类的对象。

        每日一道理
    生活中受伤难免,失败跌倒并不可怕,可怕的是因此而一蹶不振,失去了对人生的追求与远大的理想。没有一个人的前进道路是平平稳稳的,就算是河中穿梭航行的船只也难免颠簸,生活中所遇上的坎坷磨难不是偶尔给予的为难,而是必然所经受的磨练。

        

     

        

    具体为什么会这样,一般序程发开人员不须要解了这么深刻,只须要住记有这个则规便可。在义定静态部内类的时候,千万不要犯弄巧成拙的错误。

    从以上的析分中可以看出,静态部内类与非静态的部内类还是有很大的不同的。一般序程发开人员可以这么解理,态的部内类对象隐式地在外部类中保存了一个引用,指向创立它的外部类对象。不管这么解理,序程发开人员都须要记牢静态部内类与非静态部内类的异差。如是不是可以创立静态的成员方法与成员变量(静态部内类可以创立静态的成员而非静态的部内类不可以)、对于问访外部类的成员的制限(静态部内类只可以问访外部类中的静态成员变量与成员方法而非静态的部内类便可以问访静态的也可以问访非静态的外部类成员方法与成员变量)。这两个异差是静态部内类与非静态外部类最大的异差,也是静态部内类之所以存在的因原。解了了这个异差后之,序程发开人员还须要知道,在什么情况下该应用静态部内类。如在序程试测的时候,为了免避在各个Java源件文中写书主方法的代码,可以将主方法写入到静态部内类中,以少减代码的写书量,让代码更加的洁简。

        

    总之,静态部内类在Java语言中是一个很殊特的类,跟通普的静态类以及非静态的部内类都有很大的异差。作为序程发开人员,必须要知道他们之间的异差,并在际实任务中在适合的地方采取适合的类。不过总的说来,静态部内类的应用频率并非很高。但是在有一些合场,如果没有这个部内静态类的话,可能会起到事倍功半的面反果效

        


        


        

    ------------------------------------------------------------------------------------------------------------------------------------

        


        

    看了以上容内后,面上我团体试测了一下:

        


        

    首先大家须要白明,静态部内类只是不依靠与外部类,它里头的变量和方法也没有说定一得是静态的,面上拿代码说事:

        


        

     

    public class Test {
    	public  static void main(String[] args){ 
    		MyInnerStaticClass inner=new MyInnerStaticClass();
    		inner.a=10;
    		inner.b="abc";
    		System.out.println(inner.a+" "+inner.b);
    	}
    	
    	
    	static class MyInnerStaticClass{
    		int a;
    		String b;
    	}
    }

        
    上述代码将静态匿名类用new实例化了,运行后输入10 abc,确正!

        


        

    再看一个代码:

        

     

    public class Test {
    	public  static void main(String[] args){ 
    		MyInnerStaticClass inner=null;
    		inner.a=10;
    		inner.b="abc";
    		System.out.println(inner.a+" "+inner.b);
    	}
    
    
    	static class MyInnerStaticClass{
    		int a;
    		String b;
    	}
    }

        代码中的

    MyInnerStaticClass inner=null;

        替换为

        

     

    MyInnerStaticClass inner;

        后提示没有初始化,然后我就将其附为null,结果eclipse在inner.a=10处提示

        

    Null pointer access: The variable inner can only be null at this location

        

    这充分明说了静态部内类中的变量不是默许是静态的,运行结果是

        

    java.lang.NullPointerException

        

    面上一个代码更能明说题问

        

     

    public class Test {
    	public  static void main(String[] args){ 
    		MyInnerStaticClass inner=null;
    		inner.a=10;
    		inner.b="abc";
    		System.out.println(inner.a+" "+inner.b);
    	}
    
    
    	static class MyInnerStaticClass{
    		static int a;
    		static String b;
    	}
    }

        
    这个代码运行就确正了,明说静态部内类其实和义定在外面的独单一个通普类别区不大,但是大家还是须要解理面上引用的那篇文章里说的,毕竟他是部内类,还是有一些和外部类不同的

        

    虽然这个代码运行功成了,但是eclipse提示了一个正告

        

    The static field Test1.MyInnerStaticClass.a should be accessed in a static way

        

    这个大家都得懂,类中的静态方法和变量不属于独单一个实例,所以问访时应当直接classname.var方法问访,前当面上方法也不错,但是欠好,纠正后代码

        


        

     

    public class Test {
    	public  static void main(String[] args){ 
    		MyInnerStaticClass.a=10;
    		MyInnerStaticClass.b="abc";
    		System.out.println(MyInnerStaticClass.a+" "+MyInnerStaticClass.b);
    	}
    
    
    	static class MyInnerStaticClass{
    		static int a;
    		static String b;
    	}
    }

        
    这个代码大家就熟习的不能太熟习了吧

        



        

     

    文章结束给大家分享下程序员的一些笑话语录: 联想——对内高价,补贴对外倾销的伟大“民族”企业。

  • 相关阅读:
    commons-dbutils实现增删改查(spring新注解)
    commons-dbutils实现增删改查
    配置扫描注解的包
    常用注解
    注入集合类型数据
    spring创建bean的三种方式
    switch
    jvm编译器的优化
    java9小工具jshell
    java三元运算符
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3045649.html
Copyright © 2011-2022 走看看