62,628
社区成员
发帖
与我相关
我的任务
分享
class Inner {
public String fieldFive;
String fieldSix;
protected String fieldSeven;
private String fieldEight;
public Inner() {
//this.fieldOne = "I-one";//这样不行
Outer.this.fieldOne="I-one";//这样是可以的,这个跟下面一句是等效的,理由就是下面的说的,Outer.this被省略而已
fieldOne = "I-one"; //问题2A 从问题前提1知道,这里的fieldOne实际上是通过Outer的当前instance实例调用的,只是这个实例被省略了,这里并不是通过Inner实例本身调用的,也就是this.fieldOne="one";是错的,因为对于Inner来说this是Inner的当前instance实例
public class Outer {
public String fieldOne;
String fieldTow;
protected String fieldThree;
private String fieldFour;
public static void main(String[] args) {
Outer out = new Outer();
//out.fieldFive = "new-O-five"; //问题1-1 Outer对象本身并不能直接访问Inner的属性和方法,必须通过Inner的实例去访问,参看问题1-2
//out.methodFive();
Outer.Inner in = new Outer().new Inner();
//in.fieldOne = "new-I-one"; //问题2-1 Inner对象本身并不能直接访问Outer的属性或方法,必须通过Outer的实例去访问,参看问题2-2
//in.methodOne();
in.useOuterInstance();
}
public Outer() {
fieldOne = "O-one"; //问题前提1 要知道,这里相当于this.fieldOne,也就是通过Outer的当前instance实例this调用的,只是this可以省略
fieldTow = "O-tow";
fieldThree = "O-three";
fieldFour = "O-four";
methodOne();//问题前提2 这里相当于this.methodTow(),也就是通过Outer的当前instance实例this调用的,只是this可以省略
methodTow();
methodThree();
String s = methodFour();
System.out.println(s);
//问题1-2 Outer要访问Inner的属性或方法,就必须创建Inner对象
Inner in = new Inner();
//fieldFive = "O-five"; //问题1A 根据问题前提1,这里相当于this.fieldFive="O-five";this就是Outer的当前instance实例,显然是不行的,也就是Outer对象本身不能直接调用Inner的属性,必须通过生成Inner的instance实例去调用
in.fieldFive = "O-five";
in.fieldSix = "O-six";
in.fieldSeven = "O-seven"; //问题3前提1 Outer类能访问Inner类的不可见属性
in.fieldEight = "O-eight";
//methodFive();//问题1B 根据问题前提2,这里相当于this.methodFive();this就是Outer的当前instance实例,显然是不行的,也就是Outer对象本身不能直接调用Inner的方法,必须通过生成Inner的instance实例去调用
in.methodFive();
in.methodSix();
in.methodSeven(); //问题3前提2 Outer类能访问Inner类的不可见方法
in.methodEight();
s = in.methodEight();
System.out.println(s);
}
public void methodOne() {
System.out.println("methodOne:" + fieldOne);
}
void methodTow() {
System.out.println("methodTow:" + fieldTow);
}
protected void methodThree() {
System.out.println("methodThree:" + fieldThree);
}
private String methodFour() {
System.out.println("methodFour:" + fieldFour);
return this.getClass().getName();
}
class Inner {
public String fieldFive;
String fieldSix;
protected String fieldSeven;
private String fieldEight;
public Inner() {
//this.fieldOne = "I-one";
fieldOne = "I-one"; //问题2A 从问题前提1知道,这里的fieldOne实际上是通过Outer的当前instance实例调用的,只是这个实例被省略了,这里并不是通过Inner实例本身调用的,也就是this.fieldOne="one";是错的,因为对于Inner来说this是Inner的当前instance实例
fieldTow = "I-tow";
fieldThree = "I-three"; //问题3前提3 Inner类可以访问Outer类的不可见属性
fieldFour = "I-four";
//this.methodOne();
methodOne(); //问题2B 从问题前提2知道,这里的methodOne()实际上是通过Outer的当前instance实例调用的,只是这个实例被省略了,这里并不是通过Inner实例本身调用的,也就是this.methodOne();是错的,因为对于Inner来说this是Inner的当前instance实例
methodTow();
methodThree(); //问题3前提4 Inner类可以访问Outer类的不可见方法
String s = methodFour();
System.out.println(s);
fieldFive = "I-five"; //问题2C 根据问题前提1 这里相当于this.fieldFive="five";this就是Inner的当前instance实例,只是被省略了
fieldSix = "I-six";
fieldSeven = "I-seven";
fieldEight = "I-eight";
methodFive();//问题2D 根据问题前提2 这里相当于this.methodFive();this就是Outer的当前instance实例,只是被省略了
methodSix();
methodSeven();
s = methodEight();
System.out.println(s);
}
public void methodFive() {
System.out.println("methodFive:" + fieldFive);
}
void methodSix() {
System.out.println("methodSix:" + fieldSix);
}
protected void methodSeven() {
System.out.println("methodSeven:" + fieldSeven);
}
private String methodEight() {
System.out.println("methodEight:" + fieldEight);
return this.getClass().getName();
}
void useOuterInstance() {
//问题2-2 Inner可以创建Outer对象来访问其属性和方法
Outer out = new Outer();
out.fieldOne = "new-O-one";
out.fieldTow = "new-O-tow";
out.fieldThree = "new-O-three";
out.fieldFour = "new-O-four";
out.methodOne();
out.methodTow();
out.methodThree();
String s = out.methodFour();
System.out.println(s);
}
}
} interface Inner6 {
void methodSix();
}
public class Inner {
public static void main(String[] args) {
new Inner().new Inner2().new Inner3().methodThree();
new Inner().new Inner4().methodFour();
new Inner().methodFive();
}
void methodOne() {
System.out.println(this.getClass().getName());
}
void methodFive() {
class Inner5 {
void methodFive() {
methodOne(); //类Inner5被类Inner包围着,所以Inner5可以访问其属性和方法
//methodTow();//类Inner5没有被类Inner2包围着,所以Inner5不可以访问其属性和方法
//methodThree();//类Inner5没有被类Inner3包围着,所以Inner5不可以访问其属性和方法
//methodFour();//类Inner5没有被类Inner4包围着,所以Inner5不可以访问其属性和方法
System.out.println(this.getClass().getName());
}
}
new Inner5().methodFive();
new Inner6() {
public void methodSix() {
methodOne(); //类Inner6被类Inner包围着,所以Inner6可以访问其属性和方法
//methodTow();//类Inner6没有被类Inner2包围着,所以Inner6不可以访问其属性和方法
//methodThree();//类Inner6没有被类Inner3包围着,所以Inner6不可以访问其属性和方法
//methodFour();//类Inner6没有被类Inner4包围着,所以Inner6不可以访问其属性和方法
System.out.println(this.getClass().getName());
}
}.methodSix();
}
class Inner2 {
void methodTow() {
methodOne();//类Inner2被类Inner包围着,所以Inner2可以访问其属性和方法
//methodFour();//类Inner2没有被类Inner4包围着,所以Inner2不可以访问其属性和方法
System.out.println(this.getClass().getName());
}
class Inner3 {
void methodThree() {
methodOne();//类Inner3被类Inner包围着,所以Inner3可以访问其属性和方法
methodTow();//类Inner3被类Inner2包围着,所以Inner3可以访问其属性和方法
//methodFour();//类Inner3没有被类Inner4包围着,所以Inner3不可以访问其属性和方法
System.out.println(this.getClass().getName());
}
}
}
class Inner4 {
void methodFour() {
methodOne();//类Inner4被类Inner包围着,所以Inner4可以访问其属性和方法
//methodTow();//类Inner4没有被类Inner2包围着,所以Inner4不可以访问其属性和方法
System.out.println(this.getClass().getName());
}
}
}
其他的内部类都是一样的
package alltest;
public class InnerClassTest {
int i;
public void m1(){
System.out.println("Outer.m1()");
}
public class inner{
public void m2(){
m1();
}
}
public static void main(String[] args) {
//The method m1() is undefined for the type
//InnerClassTest.inner
(new InnerClassTest().new inner()).m1(); //error!!
}
}
LZ 你说的是用inner class 对象能否调用outer class的属性和方法吧,各位大哥把LZ的问题看清楚哦
package alltest;
public class InnerClassTest {
int i;
public static void m1(){
System.out.println("Outer.m1()");
}
public static class inner{
public void m2(){
m1();
}
}
}
上面的是在内部类中调用外部类的方法和属性(其他内部类一样),这样是可以的;
package alltest;
public class InnerClassTest {
int i;
public static void m1(){
System.out.println("Outer.m1()");
}
public static class inner{
public void m2(){
m1();
}
}
public static void main(String[] args) {
//The method m1() is undefined for the type
//InnerClassTest.inner
(new InnerClassTest.inner()).m1(); //error!!
}
}
这才是用内部类的事例调用外部内的方法和属性,能吗,显然不行,我是没学过这种语法的存在,不要误导人家
public class Test {
private int cc = 0;
static class a{
void b(){cc = 1}; //Exception!!!!!!!!!!!
}
public static void main(String[] args) {
a aa = new a();
aa.b();
}
}