内部类
实例内部类
1.不能在内部类创建静态的成员变量和方法(对于内部类来说,和普通的成员变量是同一等级的,也会受到限定符的约束,静态可能在类加载的时候就执行)通俗讲就是内部类未加载,但是却试图在内存中创建static的属性和方法。
但是这里还有点特殊,在内部类的实例变量中加个final就不会报错,因为加了final是定义常量,在编译的时候就已经确定了。但是方法里面加final依然会报错(语法规定)。
2:如何对内部类的实例化。(如何获取实例内部类对象呢?)
两种写法:
写法一:外部类名.内部类名 对象名=new 外部类构造方法.new 内部类构造方法
Tea.Stu stu=new Tea().new Stu();
写法二:先创建外部类对象,然后我们要的内部类类型是已知(外部类名.内部类名)。。。 Tea tea=new Tea();
。。类型 对象名=外部类对象.new 内部类构造方法
Tea.Stu stu1= tea.new Stu();
public class test {
public static void main(String[] args) {
Tea.Stu stu=new Tea().new Stu(); //外部类名.内部类名 对象名=new 外部类构造方法.new 内部类构造方法
Tea tea=new Tea(); //先创建外部类对象,然后我们要的内部类类型是已知(外部类名.内部类名)
//类型 对象名=外部类对象.new 内部类构造方法
Tea.Stu stu1=tea.new Stu();
stu1.fun();
stu.fun();
}
}
class Tea{
class Stu{
public static final int a=10;//加了final就没有默认的初值,必须得赋初值
public void fun(){
// public static final int b=10; 语法规定不行
System.out.println("hello");
}
}
}
3:成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
如果外部类与内部类有重名的就优先访问自己,自己没有的才去访问外部类的。
如果我非要在重名的时候访问外部类的呢?
方法一:创建外部类的对象,通过这个对象访问。
方法二:拿到外部类的this。外部类名.this.要访问的成员
反之呢?
外部类要想访问内部类成员和方法得依靠对象(想要内部类对象又得先创建外部类对象)
public class test1 {
public static void main(String[] args) {
}
}
class caixukun{
int age=80;
public void jin(){
System.out.println("唱跳rap 篮球");
caixukun cai =new caixukun();
caixukun.ikun kun=cai.new ikun();
System.out.println(kun.age);//21
}
class ikun{
int age=21;
public void jin1(){
System.out.println("ikun只会打篮球");
System.out.println("坤坤年纪"+caixukun.this.age);//80
System.out.println("ikun年纪"+age);//21
jin();//直接调用
}
}
}
静态内部类
1:静态内部类的对象的创建不依靠外部类的对象
2:不能使用外部类的非static成员变量或者方法,(因为在没有外部类对象的情况也能创建静态内部类对象。外部类的非静态成员必须依靠对象)如果非要访问,只能创建外部类对象,通过对象去访问。
静态内部类是可以有静态的成员和方法
局部内部类
局部内部类:把类创建在方法里,我们基本不使用,所以我这里就不涉及这个内容。