java面向对象---内部类

1.内部类

A:内部类概述: 把类定义在其他类的内部,这个类就被称为内部类。
举例:在类A中定义了一个类B,类B就是内部类。
B:内部类访问特点
a:内部类可以直接访问外部类的成员,包括私有。
b:外部类要访问内部类的成员,必须创建对象。

public class MyTest {
    public static void main(String[] args) {
        //内部类:将一个类A 定义到另一个类B 当中,我们就称类A为内部类,我们可以把类B 叫做外部类
        //根据内部类定义的位置不同,分为:成员内部类和局部内部类
        //成员内部类:将内部类定义到成员位置
        //局部内部类:将内部类定义到外部类的方法中
    }
}

class B{
    //成员位置:类中方法外
    class A {
       //成员内部类

    }

    public void show(){
        class C{
            //局部内部类
        }
    }


}

2.内部类分类及成员内部类的直接使用

  • A:按照内部类位置分类
    成员位置:在成员位置定义的类,被称为成员内部类。
    局部位置:在局部位置定义的类,被称为局部内部类。
  • B:成员内部类
    如何在测试类中直接访问内部类的成员。
    格式: 外部类名.内部类名 对象名 = 外部类对象.内部类对象;

3.成员内部类的常见修饰符及应用

  • A:成员内部类的修饰符:
    private 为了保证数据的安全性
    static 为了方便访问数据
    注意事项:
    a:静态内部类访问的外部类数据必须用静态修饰。
    b: 成员方法可以是静态的也可以是非静态的
  • B:成员内部类被静态修饰后的访问方式是:
    格式: 外部类名.内部类名 对象名 = new 外部类名.内部类名();
public class MyTest {
    public static void main(String[] args) {
        //我要访问内部类的成员
        //创建内部类的对象
      Outer.Inner inner= new Outer().new Inner();
      inner.neiShow();
      System.out.println(inner.bb);
      //内部类的特点:他可以直接访问外部类的成员,包括私有的
        //外部类想要访问内部类的成员,就要创建内部类对象
        Outer outer = new Outer();
        outer.test();
    }
}

class Outer{
    int num=20;
    private int aa=100;
    //定义成员内部类
    class Inner{
        int bb=20;
        public void neiShow(){
            System.out.println("这是内部类的show方法");
            System.out.println(num);
            System.out.println(aa);
            waiShow();
            waiTest();
        }

        public void neiTest(){
            System.out.println("这是内部类的test方法");
        }
    }


    public void waiShow(){
        System.out.println("这是外部类的show方法");
    }

    private void waiTest(){
        System.out.println("这是外部类私有的方法");
    }

    public void test(){
        //创建内部类的对象
        Inner inner = new Inner();
        System.out.println(inner.bb);
        inner.neiTest();
    }
}

4.成员内部类的面试题

要求:使用已知的变量,在控制台输出30,20,10。

class Outer {
		public int num = 10;
		class Inner {
			public int num = 20;
			public void show() {
				int num = 30;
				System.out.println(num);//30
				System.out.println(this.num);//20
				System.out.println(new Outer().num); //10
			}
		}
	}
	class InnerClassTest {
		public static void main(String[] args) {
			Outer.Inner oi = new Outer().new Inner();
			oi.show();
		}	
	}

5.局部内部类访问局部变量的问题

  • A: 可以直接访问外部类的成员
  • B: 可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能
  • C:局部内部类访问局部变量必须用final修饰
    为什么呢?
    因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失,还要使用那个变量。
    为了让数据还能继续被使用,就用fianl修饰,这样,在堆内存里面存储的其实是一个常量值。
    JDK1.8之后,final会默认加上,你不用手动去加,但是你要知道

6.匿名内部类

  • A:匿名内部类: 就是局部内部类的简化写法。
  • B:前提: 存在一个类或者接口;这里的类可以是具体类也可以是抽象类。
  • C:格式:
    new 类名或者接口名(){
    重写方法;
    } ;
  • D:本质是什么呢?
    是一个继承了该类或者实现了该接口的子类匿名对象

7.匿名内部类的方法调用

匿名内部类的方法调用

public class MyTest {
    public static void main(String[] args) {
        //匿名内部类:他是局部内部类的简写形式
        //匿名内部类:本质上是一个对象,是谁的对象,是继承了该抽象类,或实现了该接口的子类对象
        //匿名内部类的语法
       /* new 抽象类名/接口名(){
            重写抽象类/接口 中的抽象方法
        };
        */

        new AA() {
            @Override
            public void show() {
                System.out.println("重写了抽象类中的show方法22222222222222");
            }
        }.show();

    }

    public static void  set(AA aa){
        aa.show();
    }
}

abstract class AA{
    public abstract void show();
}

8.匿名内部类在开发中的应用

首先回顾我们曾经讲过的方法的形式参数是引用类型的情况,
我们知道这里需要一个子类对象。而匿名内部类就是一个子类匿名对象,
所以,可以使用匿名内部类改进以前的做法。

//这里写抽象类,接口都行
	public class MyTest3 {
    public static void main(String[] args) {
        new EE() {
            @Override
            public void hehe() {
                System.out.println("呵呵");
            }

            @Override
            public void haha() {
                System.out.println("哈哈");
            }
        }.haha();


        new EE() {
            @Override
            public void hehe() {
                System.out.println("呵呵222");
            }

            @Override
            public void haha() {
                System.out.println("哈哈2222");
            }
        }.hehe();

        //用多态的方式 给对象起个名字
        EE ee = new EE() {
            @Override
            public void hehe() {
                System.out.println("呵呵222333");
            }

            @Override
            public void haha() {
                System.out.println("哈哈22223333");
            }
        };
        ee.haha();
        ee.hehe();

    }
}


abstract class EE {
    public abstract void hehe();

    public abstract void haha();
}

9.匿名内部类中this关键字

	 interface Inter {
		public static final int a = 23 ;
	}
	
	public class Test {

		public static void main(String[] args) {
			new Inter() {
				public void show() {
					//this 匿名内部类
					System.out.println(this.a);//23
					System.out.println(Inter.a);//23
		
				}
			}.show();
		}
	}

10.匿名内部类的面试题

要求在控制台输出”HelloWorld”

interface Inter {
    void show();
}

class Outer {
    //补齐代码
    public static Inter method() {
        return new Inter() {
            @Override
            public void show() {
                System.out.println("HelloWorld");
            }
        };
    }

}

class OuterDemo {
    public static void main(String[] args) {
        Outer.method().show();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值