静态内部类
成员式的:
成员内部类
内部类:
局部内部类
局部式的:
匿名内部类
(1) 静态内部类和成员内部类:相当于外部类中成员变量,与这些变量的方法都是并列的。
(2) A类的存在必须是以B类存在为前提的。
(3) 所有的访问权限修饰符都不能放在内部类的前面,它前面只能放abstract或者final。
(4) 如果内部类在外部类的方法中定义的(叫做局部内部类) ,则这个内部类只能访问这个方法中的final变量。其它的变量都无法访问的(这个不信你可以试)。即是final int length = 100;
静态内部类代码:
package test;
public class StaticInnerClassTest {
public static void main(String[] args) {
//第三方类中生成静态内部类对象
OuterA.InnerA in = new OuterA.InnerA("Mary",120);
in.test();
}
}
class OuterA{
private static String name = "solo";
int age;
public void move(){
System.out.println("moving...");
//在外部类中生成静态内部类对象
InnerA a = new InnerA("Byr",150);
}
static class InnerA{
String name;
int weight;
public InnerA(String name,int weight){
this.name = name;
this.weight = weight;
}
public void test(){
System.out.println("test()");
System.out.println(name);
//访问外部类中同名属性
System.out.println(OuterA.name);
System.out.println(weight);
}
}
}
成员内部类代码:
package test;
public class MemberInnerClassTest {
public static void main(String[] args) {
OuterB out = new OuterB();
//在第三方类中如何生成成员内部类对象
OuterB.InnerB in = out.new InnerB("Mary",120);
in.test();
//一个外部类对象,可以生成若干个内部类对象
OuterB.InnerB in2 = out.new InnerB("Mandy",140);
in2.test();
}
}
class OuterB{
String name = "solo";
int age;
public void move(){
System.out.println("moving...");
}
public InnerB test(){
return this.new InnerB("Lili",150);
//return new InnerB("Lili",150);
}
class InnerB{
//成员内部类中不能有静态成员
int weight;
String name;
public InnerB(String name,int weight){
this.name = name;
this.weight = weight;
}
public void test(){
System.out.println(name);
System.out.println(weight);
//访问外部类中的同名属性
System.out.println(OuterB.this.name);
}
}
}
局部内部类代码:这里提出一个问题,这个问题也就是演变这个局部内部类LocalInnerClassTest的来源。
问题是这样的:在外部类OuterC中如何访问内部类InnerC的test方法?
答案就是下面这个:是通过继承来实现的。
package test;
public class LocalInnerClassTest {
public static void main(String[] args) {
OuterC out = new OuterC();
// InnerC in = new InnerC();
Super o = out.move();
o.test();
}
}
class OuterC{
String name;
int age;
public Super move(){
int weight = 100;
class InnerC extends Super{
int height;
public void test(){
System.out.println("InnerC...test");
}
}
return new InnerC();
}
}
class Super{
public void test(){
System.out.println("Super...test()");
}
}