程序-关于static内部类的细节

问题描述

关于static内部类的细节

请先看这个程序:http://algs4.cs.princeton.edu/13stacks/Bag.java.html
菜鸟提问,为什么内部类声明成了static?有什么作用么?

解决方案

static关键字内部类,目的是告诉虚拟机只有一份变量声明。
private static class Node {
private Item item;
private Node next;
}
这段代码其实不论在bag当前文件内,还是由一个别的java文件单独声明,虚拟机不会因为当前bag实例的不同时间点的初始化单独创建一份了。
但这里这样写还有一个别的目的,就是在用到bag这个类的时候才告诉虚拟机“node这个类只要初始化一次”就可以了。
如果将node这个类以单独文件,那么虚拟机在启动java运行时就执行了“node这个类只要初始化一次”这样的操作了。
详细设计上写法的区别也就是上面的区别。目的就是用到的时候才声明去解释一些事情。希望这样的描述对你有用。

解决方案二:

内部类声明为静态类,就可以直接通过外部类.内部类名来访问了,比较方便

解决方案三:

按照下面的描述创建三个文件,给你解释的例子,希望你能理解到位。

----com.bag1test.Bag1.java

package com.bag1test;

import java.util.Iterator;

@SuppressWarnings("hiding")
public class Bag implements Iterable{

public long sid = 0;
private int N;               // number of elements in bag
private Node<String> first;    // beginning of bag

public static class Node<String> {

    private String item;
    private Node<String> next;
    public String uid = (String) "空的";

    public Node(long sid){
        uid = (String) (sid + "-" +System.currentTimeMillis());
    }
}

public Bag() {
    first = null;
    N = 0;
    sid = System.currentTimeMillis();
}

public boolean isEmpty() {
    return first == null;
}

public int size() {
    return N;
}

public void add(String item) {
    Node<String> oldfirst = first;
    first = new Node<String>(sid);
    first.item = item;
    first.next = oldfirst;
    N++;
}

@Override
public Iterator<String> iterator() {
    // TODO Auto-generated method stub
    return null;
}

}

----com.bag2test.Bag1.java

package com.bag2test;

import java.util.Iterator;
import java.util.NoSuchElementException;

@SuppressWarnings("hiding")
public class Bag implements Iterable{

public long sid = 0;
private int N;               // number of elements in bag
private Node<String> first;    // beginning of bag
public Bag() {
    first = null;
    N = 0;
    sid = System.currentTimeMillis();
}

public boolean isEmpty() {
    return first == null;
}

public int size() {
    return N;
}

public void add(String item) {
    Node<String> oldfirst = first;
    first = new Node<String>(sid);
    first.item = item;
    first.next = oldfirst;
    N++;
}

@Override
public Iterator<String> iterator() {
    return null;
}

}

--com.bag2test.Node.java

package com.bag2test;

public class Node {

public String item;
public Node<String> next;
public String uid = (String) "空的";

public Node(long sid){
    uid = (String) (sid + "-" +System.currentTimeMillis());
}

}

----ClassTester.java

public class ClassTester {

public static boolean hasClass(String className) throws Exception{
    boolean ok = true;
    try {
        Class<?> cls = Class.forName(className);
        ok = cls!=null;
    }catch (ClassNotFoundException e1) {
        ok = false;
    }catch (Exception e1) {
        ok = false;
        throw e1;
    }
    return ok;
}

//bag1test测试
public static void main(String[] args) {
    try {
        System.out.println("进程启动");
        boolean ok1 = ClassTester.hasClass("com.bag1test.Bag.Node");
        System.out.println("进程启动时虚拟机有Node类吗:"+ok1);

        com.bag1test.Bag bag = new com.bag1test.Bag();
        boolean ok2 = ClassTester.hasClass("com.bag1test.Bag.Node");
        System.out.println("加载了一个bag类后虚拟机有Node类吗:"+ok2);

        com.bag1test.Bag.Node cmd = new com.bag1test.Bag.Node(0);
        boolean ok3 = ClassTester.hasClass("com.bag1test.Bag.Node");
        System.out.println("加载了一个bag子类后虚拟机有Node类吗:"+ok3+"-"+cmd.uid);

        System.out.println("说明了啥,知道了吗-----内置类管你是静态动态的,虚拟机压根一开始都不认");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

// //bag2test测试
// public static void main(String[] args) {
// try {
// System.out.println("进程启动");
// boolean ok1 = ClassTester.hasClass("com.bag2test.Node");
// System.out.println("进程启动时虚拟机有Node类吗:"+ok1);
//

// com.bag2test.Bag bag = new com.bag2test.Bag();
// boolean ok2 = ClassTester.hasClass("com.bag2test.Node");
// System.out.println("加载了一个bag类后虚拟机有Node类吗:"+ok2);
//

// System.out.println("说明了啥,知道了吗------虚拟机一开始就认了,以后爱咋用咋用");
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
}

时间: 2024-10-31 18:48:48

程序-关于static内部类的细节的相关文章

java的static内部类

为正确理解static在应用于内部类时的含义,必须记住内部类的对象默认持有创建它的那个封装类的一个对象的句柄.然而,假如我们说一个内部类是static的,这种说法却是不成立的.static内部类意味着: (1) 为创建一个static内部类的对象,我们不需要一个外部类对象. (2) 不能从static内部类的一个对象中访问一个外部类对象. 但在存在一些限制:由于static成员只能位于一个类的外部级别,所以内部类不可拥有static数据或static内部类. 倘若为了创建内部类的对象而不需要创建

C++6.0语言中对话框程序用static画浮点数的波纹图

问题描述 C++6.0语言中对话框程序用static画浮点数的波纹图 MFC C++6.0语言中对话框程序用static画浮点数的波纹图的思路是什么?怎么同时能实现鼠标的操作动作 解决方案 参考:http://bbs.csdn.net/topics/390509580 有例子代码 解决方案二: 就是GDI绘图,绘图的范围是static控件的范围,能同时鼠标点击就要继承CStatic类来写一个子类,把绘图动作写在子类的OnPaint里,之后在主对话框中添加鼠标点击的消息来对绘图区域进行操作

程序员应知——关注细节

曾经有一句话,叫做"细节决定成败",充分说明了细节对于成功的作用.如果我们注意一下,就会发现很多因为注重细节而获得成功的案例. 产品的细节 苹果的系列产品我们都已经非常熟悉了,各种各样i打头的产品,对于细节已经给予了非常大的关注.尤其体现明显的就是在对用户使用的友好度和便利性方面的细节.iPad.iPhone和iTouch等产品都是大大的屏幕,而在正面就只有一个按钮,用户不必考虑到底需要按什么按钮.而系列产品的做工更是让人赞不绝口,这也是另外一个细节. 另外对于国内的电子书产品,bam

存在于php程序中的安全细节

对于脚本安全这个话题似乎永远没完没了,假如你经常到国外的各种各样的bugtraq上,你会发现有一半以上都和脚本相关,诸如SQL injection,XSS,Path Disclosure,Remote commands execution这样的字眼比比皆是,我们看了之后的用途难道仅仅是抓肉鸡?对于我们想做web安全的人来说,最好就是拿来学习,可是万物抓根源,我们要的不是鱼而是渔.在国内,各种各样的php程序1.0版,2.0版像雨后春笋一样的冒出来,可是,大家关注的都是一些闻名的cms,论坛,bl

JAVA程序员面试32问 选择自 liujun999999 的 Blog (本人做收藏)

程序|程序员 第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统). 第四,&和&&的区别. 第五,HashMap和Hashtable的区别. 第六,Collection 和 Collec

JAVA程序员面试32问

程序|程序员 第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统). 第四,&和&&的区别. 第五,HashMap和Hashtable的区别. 第六,Collection 和 Collec

变态级JAVA程序员面试32问

程序|程序员 第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和 Inner Class的不同,说得越多越好(面试题有的很笼统). 第四,&和&&的区别. 第五,HashMap和Hashtable的区别. 第六,Collection 和 Collec

变态级JAVA程序员面试32问(转)

程序|程序员 前面部分是问题,后面部分是一些网友给的答案,大家参考吧: ****************************原题部分************************************** 第一,谈谈final, finally, finalize的区别. 第二,Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 第三,Static Nested Class 和

Java程序员面试问答

谈谈final, finally, finalize的区别 final-修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此一个类不能既被声明为 abstract的,又被声明为final的.将变量或方法声明为final,可以保证它们在使用中不被改变.被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改.被声明为final的方法也同样只能使用,不能重载 finally-再异常处理时提供 finally 块来执行任何清除操作