很少用到内部类, 所以没有怎么研究过, 今天看枚举的代码的时候, 突然发现有静态类!
很是好奇, 所以做了些如下测试, 当然对枚举我还不太清楚是怎样实现的!~ 还没有看到1如果你有对枚举方面解释好的链接或文章, 请贴过来 供大家研究!谢谢! :
class Test{
private static String str = "这个私有变量将无法保住!";
public static void main(String [] args) {
System.out.println("-----------");
Test3 t = new Test3(); //类是静态的就可以使用了
System.out.println(t.i); //访问属性也没问题
t.i = 10;
System.out.println(t.i);
t.print(); //方法也正常
t.setStr("你看看它的结果更改了没有 !");
System.out.println(str);
System.out.println(t.i);
//t.str = "dsffdffdf"; 看来内部类本身并不具有这个属性
//System.out.println(str)
Test3.pp("这说明已然变成了一个外部类 但是权限只再 Test这个类里");
}
private static class Test3 { //内部类变成静态只有一个好处,
int i = 5 ; //那就是在外部类的静态方法中可以使用了,
//而对类的使用 没有任何方面的更改!
public void print() {
System.out.println("没有关于动态方法不能执行一说");
}
public static void main(String [] args) {
System.out.println("外部类可以独立的运行!!!");
System.out.println(str);
/* java Test$Test3, 我们发现我们可以独立的运行,窃取了外部类的封装属性*/
//this.str = "分鸡丝豆腐";
}
public void setStr(String s) {
str = s; //通过内部类可以修改外部类的属性
//this.str = s 没有这个属性,按我们的理解,一个方法执行的时候,就被自动赋予了this,指向本身
//而这个方法赋予额this 竟是外部类的对象, 有理解出来的, 给予答案提示! 谢谢!
this.i = 500; //可是这个this确实自身的!!
}
public static void pp(String s) {
System.out.println(s);
}
}
}class Test2 extends Test {
public static void main(String [] args) {
//Test3.pp("难道说内部类说白了只不过多增加了一层权限");
//内部类没有被继承! 无法使用
}
}
如果还有什么补充,或有错误的地方, 请给与更正, 谢谢!~
解决方案 »
- JAVA怎样从txt文件中读入数据到相应类型的数组
- ★★★★JaVa 选择题★★★★
- eqauls与hashCode
- boolean isShow; 当事件触发时,if(isShow)isShow=false;if(!isShow)isShow=true
- 有个读取数据库中date类型的数据,运行有错误,请大大们帮忙看看,万谢!
- 一次往jbuilder 加好多文件问题
- 类似VC里信号量的功能在JAVA里如何实现?
- 请评论一下java流行的开发工具!
- 哪里有JAVA的编译器下载?
- 请问一下,同样是JFileChooser,为什么我的是这样。。。。
- 我使用Layout(null)布局时,JButton按钮出发一次就布局一次【附有源代码】
- 请教java学习
public void setStr(String s) {
str = s; //通过内部类可以修改外部类的属性
//this.str = s 没有这个属性,按我们的理解,一个方法执行的时候,就被自动赋予了this,指向本身
//而这个方法赋予额this 竟是外部类的对象, 有理解出来的, 给予答案提示! 谢谢!
this.i = 500; //可是这个this确实自身的!!
要内部类达到的就是这个效果
第一:只有外围类可以看到;
第二:内部类可以访问外围类的成员;
你可以test.this.attribute1这样来访问外围类的属性。
这里你之所以可以直接修改外部类的属性是因为你的str是静态的
Test3 t = new Test3(); //类是静态的就可以使用了这个原因是非静态的内部类拥有一个对外围类的引用,而在静态的main()函数里边,并没有创建任何
的外围类对象,所以不行,当你的内部类是非静态类的时候你可以这样创建之:import java.util.*;
public class test {
private class innerclass{
public innerclass(){
System.out.println("create a new inner class object");
}
}
public static void main(String[]args){
test test1=new test();
innerclass inner1=test1.new innerclass();//这样你就创建了一个非静态的内部类,他的外围类是test1
}
public void createainnerclass(){
innerclass inner1=new innerclass();
}
}静态内部类和非静态内部类的区别就在这个对外围类的引用
str是外部类的属性,内部类的对象自然不能访问2. private static class Test3 { //内部类变成静态只有一个好处,
int i = 5 ; //那就是在外部类的静态方法中可以使用了,
//而对类的使用 没有任何方面的更改!
静态内部类不依赖于外部类的实例化,如果不是静态的内部类,那你要先声明外部类的实例,再生成内部类的实例3. //this.str = s 没有这个属性,按我们的理解,一个方法执行的时候,就被自动赋予了this,指向本身
//而这个方法赋予额this 竟是外部类的对象, 有理解出来的, 给予答案提示! 谢谢!
this.i = 500; //可是这个this确实自身的!!
你在内部类声明的this当然是指内部类了,跟外部类无关4. class Test2 extends Test {
public static void main(String [] args) {
//Test3.pp("难道说内部类说白了只不过多增加了一层权限");
//内部类没有被继承! 无法使用
}
}
首先,你的程序有2个main方法,建议你将Test类声明为public,以上这个类就保持现状,其次,你将Test3的private去掉,完后通过Test.Test3.pp("难道说内部类说白了只不过多增加了一层权限");就可以访问内部类的pp()方法了,不是说内部类没有被继承