QUESTION NO: 4 1. public class Outer{ 2. public void someOuterMethod() { 3. // Line 3 4. } 5. public class Inner{} 6. public static void main( String[]argv ) { 7. Outer o = new Outer(); 8. // Line 8 9. } 10. } Which instantiates an instance of Inner? A. new Inner(); // At line 3 B. new Inner(); // At line 8 C. new o.Inner(); // At line 8 D. new Outer.Inner(); // At line 8//new Outer().new Inner()大家帮着看看这道题,帮我解释一下,我不太明白 谢谢了
其中public class Inner{} 为内部类,
内部类其实你就可以当做一个普通的成员在用
在第三行相当于是 new this.Inner();
C的话需要inner声明为static的类
At line 8//new Outer().new Inner() 这样也是对的。
内部类实例只能存在于其外部类的实例之中,如果你想实例化一个内部类,你必须首先实例化外部类,然后在外部类中创建内部类,语法如下:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();因此上面的正确的方法是o.new Inner();经过我的测试,这样才是对的,其他均不对。
package aa;
public class Outer {
public void someOuterMethod() {
//Inner in=new Inner();
//System.out.println(in);
}
public class Inner {
}
public static void main(String[] argv) {
Outer o = new Outer();
new Outer().new Inner();
//o.someOuterMethod();
//output :aa.Outer$Inner@c17164
}
}
A是正确的,成员变量当然可以访问成员变量。
B不正确,static方法不能直接调用非静态的变量。
C不正确,这个内部类不是static,不能直接引用。
D不正确,内部类的实例化是:new Outer().new Inner();
A 正确
C 因为静态调用 所以需要修改为 o.new Inner();
B不正确,static方法不能直接调用非静态的变量。
C不正确,这个内部类不是static,不能直接引用。
D不正确,内部类的实例化是:new Outer().new Inner();
{ new Inner().aa(); } public class Inner
{
public void aa()
{
System.out.println("实例成功啦");
} }
public static void main( String[] arges )
{
Outer o =new Outer();
// Line 8 } } 没有返回任何结果 是不是说就没有实例化呢 ?
你不调用someOuterMethod方法怎么会有返回值呢晕,你在Line 8加上o.someOuterMethod()试试只有A是正确的
正确答案...! B. new Inner(); // At line 8
静态方法中不能直接实例化内部类..! C. new o.Inner(); // At line 8
Inner()是一个内部类,属于这个类,而不是属于某个对象 D. new Outer.Inner(); // At line 8//new Outer().new Inner()
Inner()是一个内部类,属于这个类,而不是属于某个对象
|.使用声明的内部类就是外部类,可以通过外部类,内部类直接访问.
|.普通的内部类是不能够直接被外部所访问的,需要通过外部类实例在找到内部类实例.
所以 A 是正确答案.
C选项,需要在声明时加static
成员内部类有这些特性:
1:定义在类的内部,不使用static修饰,可看做封装类的成员。
2:成员内部类可访问封装类的任何成员(静态和非静态的)。
3:成员内部类不能使用static变量,但可使用实例变量和局部变量
4:在创建内部类的实例时,必须要有一个封装类的引用
5:创建内部类实例
a:外部类的内部创建
Outer.Inner innerInstance = this.new Inner();//这里this.new Inner = new Inner();
b:外部类的内部和外部创建
Outer outerInstance = new Outer();
Outer.Inner innerInstance = outerInstance.new Inner();
Outer.Inner innerInstance = new Outer().new Inner();
看看几个选项:
A. new Inner(); // At line 3
初步查看,不适合在创建内部类的实例时,必须要有一个封装类的引用这一条,其实不然
在第三行new Inner() = this.new Inner();
这样就容易了,这个this,可以不显示使用,系统会隐式使用来引用封装类的实例
B. new Inner(); // At line 8
C. new o.Inner(); // At line 8 D. new Outer.Inner(); // At line 8//new Outer().new Inner() 所以:答案是A和Outer().new Inner()
C应该为o.new Inner();
内部类要在外部类的实例里
解释:
关于a:要执行someOuterMethod方法,必须先实例化外部类(someOuterMethod 不是static的),所以在此实例化内部类正确
b:out没有实例化
C:out类实例化了,但是内部和外部是平行的,体现不出包含关系了。
d:没听过这样的语法。。
<a href="http://www.1688jp.com/nmhx/01_29_2273.html">北京到里约热内卢机票</a>
<a href="http://www.1688jp.com/nmhx/01_09_9184.html">北京到圣保罗机票</a>
<a href="http://www.1688jp.com/nmhx/01_11_134.html">北京到亚松森机票</a>
<a href="http://www.1688jp.com/nmhx/01_53_8453.html">北京到布宜诺斯艾利斯机票</a>
<a href="http://www.1688jp.com/nmhx/12_52_1219.html">北京到波哥大机票</a>
<a href="http://www.1688jp.com/nmhx/12_44_9971.html">北京到圣地亚哥机票</a>
<a href="http://www.1688jp.com/nmhx/12_53_2283.html">北京到里约热内卢机票</a>
内部类在out类的中使用时,跟平常的类没什么区别。
在此处main方法是一个static的方法,而Inner类没有声明为static的故不能用Outer.Inner这样的方法new出对象来,只能用new Inner;在其它不是static的方法中是可以用new Outer.Inner()这样的方式生成对象的。由此可见static的“优先级”比"."要高.
对于C根本就没有那样的方式,内部类还是一个类,不用象调一般的方法那样去调用.但如果要在out类以外的其它类产生对象,那么就得用OuterClassName.InnerClassName指定其型别,但在外部类是不允许生成内部类的对象的。
请记住内部类在于out类以外的所有类是不能用new关键字来生成对象的。
如果非得生成对象请在out类里提供返回Inner类对象的一个方法.
public void testMethod(){
}
public class Inner{
public Inner(){}
public void innerMethod(){
System.out.println("Inner.innerMethod()");
}
}
public Inner getInnerObject(){
return new Outer.Inner();
}
public static void main(String[] args) {
TestI t=new TestI();
t.testInner();
}
}class TestI{
public void testInner(){
Outer t=new Outer();
Outer.Inner i=t.getInnerObject();
i.innerMethod();
}
}
B答案:把静态类当做外部类的一个非静态的成员可知,静态的方法是不能够调用非静态的成员,如果将嵌套类改为静态的就可以
C答案:应该改为 o.new Inner();
D答案:如果将嵌套类改为静态的就可以
C的话需要inner声明为static的类