14.内部类

14.内部类


14.1 知识点

Java中的内部类

// 外部类
public class Lesson14_Outer {
    private int i = 1;
    public String str = "123";

    public Inner i1 = new Inner();

    public void Eat() {

    }

    public void Speak() {

    }

    // 在一个类里声明的类 一般称为 内部类
    public class Inner {
        public int i = 2;

        public void Test() {
            // 外部类中的所有内容(包括私有)都可以直接在内部类中使用
            // 内部类和外部类中的同名成员,通过this 和 外部类.this来区分
            int i = 3;
            System.out.println(i);      // 3
            System.out.println(this.i); // 2
            System.out.println(Lesson14_Outer.this.i); // 1

            // System.out.println(str);
            i = 10;
            str = "韬老狮";
            // System.out.println(i);
            // System.out.println(str);
        }
    }
}

// 注意:Java中的内部类的使用和C#中不同
// 1.Java中的内部类在外部使用时必须伴随包裹它的外部类的出现而出现 C#不用
//   声明语法为
//   外部类 outer = new 外部类();
//   外部类.内部类 inner = outer.new 内部类();
Lesson14_Outer outer = new Lesson14_Outer();
Lesson14_Outer.Inner inner = outer.new Inner();
inner.Test();
// 2.外部类中的所有内容(包括私有)都可以直接在内部类中使用
// 3.内部类和外部类中的同名成员,通过this 和 外部类.this来区分

匿名内部类

public abstract class Lesson14_Test {
    public abstract void Test1();

    public abstract void Test2();
}

// 匿名内部类,在声明一个类对象时临时拓展该对象
// 但是拓展的内容一般是基于外部类的
// 注意:
// 1.不能写构造方法
// 2.不能定义静态成员
// 3.一般基于外部类已有方法实现内容
// 4.如果匿名类创建的对象不记录,用完一次后会马上被销毁

// 声明匿名类继承重写
Lesson14_Outer outer2 = new Lesson14_Outer() {
    @Override
    public void Eat() {
        System.out.println("吃东西");
    }

    @Override
    public void Speak() {
        System.out.println("说话");
    }
};
outer2.Eat();   // 吃东西
outer2.Speak(); // 说话

// 匿名类继承重写抽象类
Lesson14_Test tt = new Lesson14_Test() {
    @Override
    public void Test1() {
        System.out.println("111");
    }

    @Override
    public void Test2() {
        System.out.println("222");
    }
};
tt.Test1(); // 111
tt.Test2(); // 222

总结

Java中的内部类和C#中区别较大,在使用时一定要注意他们的区别之处:

  1. Java中的内部类在外部使用时必须伴随包裹它的外部类的出现而出现。
  2. 外部类中的所有内容(包括私有)都可以直接在内部类中使用。
  3. 内部类和外部类中的同名成员,通过this 和 外部类.this来区分。
    匿名类使用较少,主要做了解,能看懂即可。

14.2 知识点代码

Lesson14_Outer

//外部类
public class Lesson14_Outer
{
    private int i = 1;
    public String str = "123";

    public Inner i1 = new Inner();

    public void Eat()
    {

    }

    public void Speak()
    {

    }

    //在一个类里声明的类 一般称为 内部类
    public class Inner
    {
        public int i = 2;
        public void Test()
        {
            // 外部类中的所有内容(包括私有)都可以直接在内部类中使用
            // 内部类和外部类中的同名成员,通过this 和 外部类.this来区分
            int i = 3;
            System.out.println(i);//3
            System.out.println(this.i);//2
            System.out.println(Lesson14_Outer.this.i);//1

            //System.out.println(str);
            i = 10;
            str = "韬老狮";
            //System.out.println(i);
            //System.out.println(str);
        }
    }
}

Lesson14_Test

public abstract class Lesson14_Test
{
    public abstract void Test1();

    public abstract void Test2();
}

Lesson14_内部类

public class Lesson14_内部类
{
    public static void main(String[] args)
    {
        //知识点1:Java中的内部类
        //注意:Java中的内部类的使用和C#中不同
        //1.Java中的内部类在外部使用时必须伴随包裹它的外部类的出现而出现 C#不用
        //  声明语法为
        //  外部类 outer = new 外部类();
        //  外部类.内部类 inner = outer.new 内部类();
        Lesson14_Outer outer = new Lesson14_Outer();
        Lesson14_Outer.Inner inner = outer.new Inner();
        inner.Test();
        //2.外部类中的所有内容(包括私有)都可以直接在内部类中使用
        //3.内部类和外部类中的同名成员,通过this 和 外部类.this来区分


        //知识点2:匿名内部类
        //匿名内部类,在声明一个类对象时临时拓展该对象
        //但是拓展的内容一般是基于外部类的
        //注意:
        //1.不能写构造方法
        //2.不能定义静态成员
        //3.一般基于外部类已有方法实现内容
        //4.如果匿名类创建的对象不记录,用完一次后会马上被销毁

        //声明匿名类继承重写
        Lesson14_Outer outer2 = new Lesson14_Outer()
        {
            @Override
            public void Eat()
            {
                System.out.println("吃东西");
            }

            @Override
            public void Speak()
            {
                System.out.println("说话");
            }
        };
        outer2.Eat();//吃东西
        outer2.Speak();//说话

        //匿名类继承重写抽象类
        Lesson14_Test tt = new Lesson14_Test()
        {
            @Override
            public void Test1()
            {
                System.out.println("111");
            }

            @Override
            public void Test2()
            {
                System.out.println("222");
            }
        };
        tt.Test1();//111
        tt.Test2();//222


        //总结
        //Java中的内部类和C#中区别较大
        //在使用时一定要注意他们的区别之处
        //1.Java中的内部类在外部使用时必须伴随包裹它的外部类的出现而出现
        //2.外部类中的所有内容(包括私有)都可以直接在内部类中使用
        //3.内部类和外部类中的同名成员,通过this 和 外部类.this来区分
        //匿名类使用较少,主要做了解,能看懂即可
    }
}

14.3 练习题

请说出Java面向对象知识中和C#的不同点,至少说出8点不同

  • Java中没有索引器
  • Java中没有运算符重载
  • Java中没有vo
  • Java中的b是super
  • Java中继承类用extends关键字
  • Java中继承接口用implements关键字
  • Java中不存在显示实现接口
  • Java中的is是instanceof
  • Java中没有as关键字
  • Java中用package管理同名类
  • Java中的内部类使用和C#不同
  • Java中引用包用import,C#中引用命名空间用using


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏