1.本地内部类:定义在方法里面的类,只能在当前方法中使用
public static void func()
{
class Student{
int num=0;
String name;
}
}
2.实例内部类:定义在类内部的类是一个普通的类,他是和成员变量和方法是同一级别的,可以把它当成外部类的一个普通实例的成员
1)在实例内部类里面是不可以定义静态成员变量和静态成员方法的
2)如果想要非得定义静态变量,那么它只能是由final修饰的常量
3)实例内部类里面也是可以有构造方法的
4)如何获取实例化内部类的对象呢?它是如何进行实例化的呢?
我们只能通过外部类的对象来进行调用,先进行实例化外部类再通过外部类的.new 内部类(),就可以进行创建
外部类名.内部类名 自定义内部类名=外部类的引用.new 内部类();
5)这个内部类也是可以实现接口和继承封装多态的,他也是可以被其他类所继承
6)内部类的字节码文件类型是:外部类$内部类.class文件
7)在内部类所实现的一个方法里面,是可以进行访问到,例如打印外部类的一些属性字段,但是如果外部类和内部类有定义过相同的成员变量,那么在内部类所打印的字段中,打印出来的字段就是(外部类 int a=90,内部类 int a=90)内部类里面的值
8)OutClass.this.data来进行访问,外部类.this.字段/属性,在实例内部类中如果包含了与外部类同名的成员变量,那么如何在实例内部类中进行访问呢,就通过上述这种方式;
9)在实力内部类成员中,一共包含了两个this,一个是外部类.this,一个是内部类自己的this
10)如下:
扫描二维码关注公众号,回复: 14334201 查看本文章class test extends OuterClass.Inner{ public test(OuterClass o1) { o1.super(); }}
class OuterClass{
public int data1=1;
private int data2=2;
public static int data3=3;
class Inner{
public int a=10;
private int data4=20;
// public static int d=19;
public static final int data6=100;
public Inner()
{
System.out.println("我是不带有参数的内部类的构造方法");
}
public void test()
{
System.out.println("我是实例内部类的中的test方法");
}
}
public void func1()
{
System.out.println("我是OuterClass的func1方法");
}
}
class test{
public static void main(String[] args) {
OuterClass outerClass=new OuterClass();
OuterClass.Inner inner=outerClass.new Inner();
inner.test();
}
}
3.静态内部类
1)我们可以把静态内部类看作是外部类的一个静态成员,他的实例化只通过外部类的类名来进行操作即可
2)静态内部类里面是可以有一些静态成员方法,静态字段,普通字段,普通方法
3)获取到静态内部类的实例:
外部类名.内部类名 自定义内部类名字=new 外部类名.静态内部类名();
4)我们在静态内部类内部是无法进行访问内部类的一些成员变量,无论是静态的还是非静态的,这些都是不可以进行访问的;那么我们如何在内部类里面进行访问外部类的普通成员变量呢?
我们要是想访问这些字段,就要依赖于外部类的对象的引用,再通过.的方式来进行访问就行了
class OuterClass{
public int data1=100;
public int data2=99;
public int data3=88;
public static int data4=11;
static class InnerClass{
OuterClass ont=null;
public InnerClass()
{
this.out=new OuterClass();
}
OuterClass out=new OuterClass();
public int data4=4;
public int data5=5;
public int data6=8;
public static int data7=90;
public static void func1()
{ //System.out.println(data4);这里面会出现爆红,是不可以进行访问的
// System.out.println(data1);
System.out.println("我是静态内部类中的func1()方法,我是内部类中的一个静态方法");
}
public void func2()
{ System.out.println(out.data1);
System.out.println("我是静态内部类中的一个普通方法");
}
}
}
class test{
public static void main(String[] args) {
OuterClass.InnerClass innerClass=new OuterClass.InnerClass();
innerClass.func1();
}
}
4.匿名内部类
class Text{ public void func1() { System.out.println("我是父类的构造方法"); } } public class test{ public static void main(String[] args) { Text t1= new Text(){ @Override public void func1() { System.out.println("我是匿名内部类重写的方法"); } }; t1.func1(); } }