内部类-------类和对象

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)如下:

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();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_61518137/article/details/125123608