关于Java中静态内部类的疑问。
本人初学Java,今日在学习静态内部类的过程中产生了几个疑问,求助大虾解惑。如果我的问题有点儿钻牛角尖或者不得章法,还请大家赐教。书上说静态内部类在使用之前不必先实例化包...
本人初学Java,今日在学习静态内部类的过程中产生了几个疑问,求助大虾解惑。如果我的问题有点儿钻牛角尖或者不得章法,还请大家赐教。
书上说静态内部类在使用之前不必先实例化包含它的外部类。于是我猜想静态内部类是用来配合所在外部类的静态成员使用的。但是又发现静态内部类可以实例化出多个对象(写了个小程序连续new静态内部类)。这两方面貌似是冲突的。。。求助~~~~~~~~~谢谢~~~~~ 展开
书上说静态内部类在使用之前不必先实例化包含它的外部类。于是我猜想静态内部类是用来配合所在外部类的静态成员使用的。但是又发现静态内部类可以实例化出多个对象(写了个小程序连续new静态内部类)。这两方面貌似是冲突的。。。求助~~~~~~~~~谢谢~~~~~ 展开
3个回答
展开全部
你好,我这样说,不知道你是否能理解:
如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static.通常称为嵌套类,当内部类是static时,意味着:
[1]要创建嵌套类的对象,并不需要其外围类的对象
[2]不能从嵌套类的对象中访问非静态的外围类对象
嵌套类与普通的内部类还有一个区别:普通内部类的字段的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类.但是在嵌套类里可以包含所有这些东西。
看明白了,就知道你的想法错在哪里了。
如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static.通常称为嵌套类,当内部类是static时,意味着:
[1]要创建嵌套类的对象,并不需要其外围类的对象
[2]不能从嵌套类的对象中访问非静态的外围类对象
嵌套类与普通的内部类还有一个区别:普通内部类的字段的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类.但是在嵌套类里可以包含所有这些东西。
看明白了,就知道你的想法错在哪里了。
更多追问追答
追问
摘自Thinking in Java????
追答
忘记了,以前在学习内部类时记下的笔记。
展开全部
package dl.java.baidu.faq;
public class StaticInnerClass {
private static int i=0,j=0;
/**
* 书上说静态内部类在使用之前不必先实例化包含它的外部类。
* 于是我猜想静态内部类是用来配合所在外部类的静态成员使用的。
* 但是又发现静态内部类可以实例化出多个对象(写了个小程序连续new静态内部类)。
* 这两方面貌似是冲突的。。。求助~~~~~~~~~谢谢~~~~~
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
while(i<=10){
a A = new a();//静态内部类可以这样实例化
A.print();
A.sayHellow();
System.out.println(A);
System.out.println("--------------");
}
a.print();
/***********
*
*new b().print(); //报错误
*静态内部类(Static Inner Class),即在内部类的前面增加了static修饰符(modifier)。
*注意,仅仅只有内部类能够被声明为static类型,通常我们声明一个普通类的时候不能使用static,否则编译出错。
*
***/
/******
* 书上说静态内部类在使用之前不必先实例化包含它的外部类
*
* 这里提到的是不必要。就是可以直接实例化内部类访问类中的静态方法方法
* 而不必要使用这种形式去实例化内部类:new StaticInnerClass().new b().print();
* 而可以直接这样实例化:a A = new a()
*
*/
new StaticInnerClass().new b().print();//非静态内部类,必须这样实例化
}
/****
*
* 那么为什么我们要使用静态的内部类呢?在什么情况下我们需要使用静态的内部类呢?
* 编译器会自动给内部类加上一个reference,指向产生它的那个外部类的对象,
* 如果不想要或者说不需要这个reference,那么我们就可以把这个内部类声明为static,
* 禁止这个reference的产生。除此之外静态类的使用与普通的静态类是一样的
* @author ZZY
*
*/
static class a{
static void print(){
System.out.println(i);
i++;
}
void sayHellow(){
System.out.println("Hellow World");
}
}
class b{
void print(){
System.out.println(j);
j++;
}
}
}
public class StaticInnerClass {
private static int i=0,j=0;
/**
* 书上说静态内部类在使用之前不必先实例化包含它的外部类。
* 于是我猜想静态内部类是用来配合所在外部类的静态成员使用的。
* 但是又发现静态内部类可以实例化出多个对象(写了个小程序连续new静态内部类)。
* 这两方面貌似是冲突的。。。求助~~~~~~~~~谢谢~~~~~
*
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
while(i<=10){
a A = new a();//静态内部类可以这样实例化
A.print();
A.sayHellow();
System.out.println(A);
System.out.println("--------------");
}
a.print();
/***********
*
*new b().print(); //报错误
*静态内部类(Static Inner Class),即在内部类的前面增加了static修饰符(modifier)。
*注意,仅仅只有内部类能够被声明为static类型,通常我们声明一个普通类的时候不能使用static,否则编译出错。
*
***/
/******
* 书上说静态内部类在使用之前不必先实例化包含它的外部类
*
* 这里提到的是不必要。就是可以直接实例化内部类访问类中的静态方法方法
* 而不必要使用这种形式去实例化内部类:new StaticInnerClass().new b().print();
* 而可以直接这样实例化:a A = new a()
*
*/
new StaticInnerClass().new b().print();//非静态内部类,必须这样实例化
}
/****
*
* 那么为什么我们要使用静态的内部类呢?在什么情况下我们需要使用静态的内部类呢?
* 编译器会自动给内部类加上一个reference,指向产生它的那个外部类的对象,
* 如果不想要或者说不需要这个reference,那么我们就可以把这个内部类声明为static,
* 禁止这个reference的产生。除此之外静态类的使用与普通的静态类是一样的
* @author ZZY
*
*/
static class a{
static void print(){
System.out.println(i);
i++;
}
void sayHellow(){
System.out.println("Hellow World");
}
}
class b{
void print(){
System.out.println(j);
j++;
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
定义静态内部类是因为内部类不需要访问到外部类的实例变量和方法,它只是隐藏在外部类里面的一个类,不依赖于外部类而存在,因此不需要外部类对象就能定义内部类对象。它仅仅是不关联于外部类实例部分而已,跟外部类静态成员无任何关系(虽然可以访问到),它本身也是一个类,当然可以创建多个对象。
追问
“它仅仅是不关联于外部类实例部分而已,跟外部类静态成员无任何关系(虽然可以访问到)”
逗号之后我以为要说“和静态成员有关系”。。没想到还是没关系。。。
至此如你所说,和外部类完全没关系。。。那内部类的用途又是什么呢。。
追答
其实,它的目的纯粹是为了隐藏实现,更好达到封装的目的。类似于静态方法,静态方法是可以不通过对象去调用的,而静态内部类的创建也是一样。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询