今天听了曹雪松老师讲课,才发现几年前接触过的东西还是很有意思的,同时也感觉到自己以前的学习总是死记硬背不会融会贯通,也停留在皮毛表面,因此总是原地踏步,没有掌握到一些语言的精髓以及一些技术背后的原理.同时感觉到编程的基础是对一门语言语法特性的扎实掌握,还有计算机相关的主干课程的牢固掌握,才能够举一反三,学会设计。
有感于此,决心补一补Java的基础知识,以此为基础结合老师的视频课程好好理解一下Java Web相关的东西,为之后的工作打下一个基础。
内部类
//错误1:无法从静态上下文中引用非静态 变量 this
import java.lang.*;
class test{
public static void main(String[] args){
System.out.println("hello world!");
User user=new User("joe");
user.run();
}
class User{
private String name;
public User(String aname){
name=aname;
}
public int run(){
System.out.println(this.name+" run!");
}
}
}
此段代码中user位于test类的内部,是属于test的非静态内部类,也是一个成员,因此无法直接在静态方法main中直接访问非静态的成员变量,所以不能生成。
纠正:
方法1 先生成这个test类的对象,就可以用内部类的生成方法new出来,结果就会显示consructor: joe
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
test t=new test();
User u=t.new User("joe");
System.out.println("hello world");
}
class User{
String name;
User(String a){
this.name=a;
System.out.println("consructor: "+name);
}
void run(){
System.out.println(name+" run!");
}
}
}
方法2:直接将此类变为静态的内部成员类,这样的话就可以直接调用了,让我们来试一下
public class test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//test1 t=new test1();
//对于静态内部类,可以直接用new 对象的方法,不依赖于外部类就可以实例化
User u=new User("joe");
System.out.println("hello world");
}
static class User{
String name;
User(String a){
this.name=a;
System.out.println("consructor: "+name);
}
void run(){
System.out.println(name+" run!");
}
}
}
输出结果:
constructor: joe
参考1:内部类的不同种类的用法
http://blog.csdn.net/fgakjfd/article/details/5282646
参考2:解析静态内部类的使用目的与限制
http://blog.csdn.net/vange/article/details/5407625
主要有:
1静态内部类的实例化不依赖于外部内的实例化,可以升级为顶级类
2非静态内部类,即成员内部类内部不能有静态成员变量。否则编译有问题
3对于那些非静态的成员变量与成员方法,在静态内部类中是无法访问的。这就是静态内部类的最大使用限制
拓展:设计模式:单例模式