赞
踩
目录
内部类概念
定义在其他类中的类,称为内部类
内部类访问特点
1.直接访问外部类的成员,包括私有
2.外部类访问内部类成员,必须创建对象
在外部类创建内部类对象 Nei nei = new Nei()
在测试类创建内部类对象 Wai.Nei nei = new Wai().new Nei()
定义在成员位置的类,称为成员内部类
- class B {
- //成员内部类
- class A {
-
- }
-
- public void show() {
- //局部内部类
- class C {
-
- }
- }
-
- }
若成员内部类被private修饰(内部类可以被私有,普通类则不行),则不能在测试类中创建内部类对象,只能在外部类中创建内部类对象,再在测试类中创建外部类对象。
- public class MyTest {
- public static void main(String[] args) {
- //Wai.Nei nei = new Wai().new Nei();
- //nei.neiShow(); //内部类被私有,不能在测试类创建内部类对象
-
- Outer outer = new Outer();
- outer.waiShow(); //内部类被私有,只能通过创建外部类对象调用方法来创建内部类对象
- }
- }
-
- class Wai {
- //内部类可以私有修饰
- private class Nei {
- public void neiShow() {
- System.out.println("nei show");
- }
- }
-
- public void waiShow() {
- Inner inner = new Inner();
- inner.neiShow();
- }
- }
被static修饰的成员内部类
1.只能访问外部类的静态成员
- public class Wai {
- static int num = 100;
-
- public static class Nei {
- public void neiShow() {
- System.out.println(num);
- }
- }
2.静态的成员内部类,在测试类中创建对象
Wai.Nei nei = new Wai.Nei();
- public class MyTest {
- public static void main(String[] args) {
-
- Wai.Nei nei = new Wai.Nei();
- }
- }
***** : Outer.this 表示外部类对象
不能直接在测试类创建对象,在方法内创建局部内部类对象,在测试类创建外部类对象调用外部类的方法
- public class MyTest {
- public static void main(String[] args) {
- //局部内部类,在外界没有直接创建其对象的语法。
- Wai wai = new Wai();
- wai.waiShow();
- }
- }
-
- class Wai {
- int num = 20;
- private double a = 3.5;
-
- public void waiShow() {
- final int num=20; //默认有final,可不写。
-
- //局部内部类
- class Nei {
- int t = 50;
-
- public void neiShow() {
- System.out.println(num);
- System.out.println(a);
- }
- }
- //创建局部内部类对象
- Nei nei = new Nei();
- nei.neiShow();
- }
-
- public void hehe() {
- }
- }
局部变量用final修饰。因为局部变量会随着方法的调用完毕而消失,但是局部对象并没有立马从堆内存中消失,还要继续使用那个局部变量,就要用final修饰,在堆内存中储存为一个常量。
匿名内部类是局部内部类的简写形式
实质上为一个对象
是继承了抽象类的一个子类对象 或 实现接口类的一个对象
抽象类:
- new Father() { //父类的子类对象,重写了父类的方法
- @Override
- public void hehe() {
- System.out.println("呵呵呵呵呵呵");
- }
- };
-
-
- new Father() {
- @Override
- public void hehe() {
- System.out.println("44444444444444");
- }
- }.hehe(); //子类对象调用了父类方法
- }
- }
-
- abstract class Father { //抽象父类
- public abstract void hehe();
- }
接口:
- public class MyTest {
- public static void main(String[] args) {
- //我想要得到接口的实现类对象
- new SS() {
- @Override
- public void ss() {
- System.out.println("sssssssssssssssssss");
- }
- };
-
- new SS() {
- @Override
- public void ss() {
- System.out.println("sssssssssssssssssss888888");
- }
- }.ss();
-
- //多态
- SS ss = new SS() {
- @Override
- public void ss() {
- System.out.println("sssssssssssssssssss888888");
- }
- };
-
- }
- }
-
-
- interface SS {
- void ss();
- }
若想对对象取名
- AA aa = new AA() {
- @Override
- public void aa() {
- System.out.println("aaaaaaaaaaaaaa744444aa");
- }
-
- @Override
- public void hehe() {
- System.out.println("hehehehehe888877777hhehehhe");
- }
- };
- aa.aa();
- aa.hehe();
匿名内部类,常作为参数传递或返回值
抽象类 作为参数:
- public class MyTest {
- public static void main(String[] args) {
- //匿名内部类,经常作为参数,或返回值,使用比较方便。
- WW ww = new WW() {
- @Override
- public void hehe() {
- System.out.println("aaa");
- }
- };
-
- test(ww);
-
- test(new WW() {
- @Override
- public void hehe() {
- System.out.println("bbb");
- }
- });
- }
-
-
- public static void test(WW ww) {
- ww.hehe();
- }
- }
-
-
- abstract class WW {
- public abstract void hehe();
- }
接口 作为参数:
- public class MyTest2 {
- public static void main(String[] args) {
- HH hh = new HH() {
- @Override
- public void hh() {
- System.out.println("hhhhhhhhhhhhhhhhh");
- }
- };
- test(hh); //取名传递
- test(hh);
-
-
- test(new HH() {
- @Override
- public void hh() {
- System.out.println("hhhhhhhhhhhhhhhhh");
- }
- }); //直接作为参数传递
-
- }
-
- //当你以后看到一个方法的形参,要一个接口,类型,你就传递一个该接口的,实现类对象,多态。
- public static void test(HH hh) {
- hh.hh();
- }
- }
-
- interface HH {
- void hh();
- }
抽象类 作为返回值
- public class MyTest {
-
- public static void main(String[] args) {
- BB bb = getBB();
- bb.bb();
-
- BB bb2 = getBB2();
- bb2.bb();
-
- //匿名内部类,作为返回值,返回方便
- }
-
- //当你以后看到一个方法的返回值,类型是一个抽象类 类型,你就返回一个该抽象类的子类对象。
- public static BB getBB() {
-
- BB cc = new CC();
- return cc;
- }
-
- public static BB getBB2() {
- return new BB() {
-
- @Override
- public void bb() {
- System.out.println("bbbbbbbbbbbbbbbbb222222222");
- }
- };
- }
- }
-
- abstract class BB {
- public abstract void bb();
- }
-
- class CC extends BB {
- @Override
- public void bb() {
- System.out.println("bbbbbbbbbbbbbbbbbb");
- }
- }
接口 作为返回值
- public class MyTest {
-
- public static void main(String[] args) {
- BB bb = getBB();
- bb.hehe();
-
- BB bb2 = getBB2();
- bb2.hehe();
-
- //匿名内部类,作为返回值,返回方便
- }
-
- //当你以后看到一个方法的返回值,类型是一个抽象类 类型,你就返回一个该抽象类的子类对象。
- public static BB getBB() {
-
- BB cc = new CC();
- return cc;
- }
-
- public static BB getBB2() {
- return new BB() {
-
- @Override
- public void hehe() {
- System.out.println("bbbbb66666");
- }
- };
- }
- }
-
- interface BB {
- void hehe();
- }
-
- class CC implements BB {
- @Override
- public void hehe() {
- System.out.println("666666");
- }
- }
在类中定义接口,称为内部接口
- public class MyTest {
- public static void main(String[] args) {
- //创建内部接口的子类对象
- Wai.MyInterface myInterface = new Wai.MyInterface() {
-
- @Override
- public void hehe() {
- System.out.println("呵呵呵呵呵");
- }
- };
- myInterface.hehe();
-
- Wai wai = new Wai();
- wai.test();
-
- }
- }
-
-
- class Wai {
- //内部接口
- interface MyInterface {
- void hehe();
- }
-
- //私有内部接口
- private interface MyInterface2 {
- void hehe2();
- }
-
- public void test() {
- MyInterface2 myInterface2 = new MyInterface2() {
- @Override
- public void hehe2() {
- System.out.println("2222222222222222");
- }
- };
- myInterface2.hehe2();
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。