黑马程序员------毕老师视频笔记第九天------面向对象(内部类)
来源:互联网 发布:qq头像源码大全 编辑:程序博客网 时间:2024/05/16 15:36
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
内部类(内置类、嵌套类):将一个类定义在另一个类的里面,对里面那个类就称为内部类
成员内部类(实例内部类)
访问特点:内部类可以直接访问外部类中的成员,包括私有成员,之所以能直接访问外部类的成员,是因为内部类中持有一个外部类的引用,外部类名.this,
而外部类要访问内部类中的成员必须要建立内部类的对象。
一个类里面可以定义多个内部类
其他的类中要建立内部类的对象,要用内部类全名
如在Demo类的main函数中建立内部类对象
Outer.Inner in = new Outer().new Inner();
*类可以用private 修饰吗?答:内部类能。
*成员位置上的内部类被private修饰以后,其他类中能创建内部类对象吗?答:不能,在所在外部类中可以
搞清楚访问权限,生命周期,一切皆可搞定。
1.当内部类定义在外部类的成员位置上,而且非私有,可以再外部其他类中直接建立内部类对象,格式:
外部类名.内部类名引用名 = new 外部类名().new 内部类名();
Outer.Inner in = new Outer().new Inner();
2.外部类要访问内部类,必须建立内部类对象
静态内部类
内部类在外部类的成员位置上,那么内部类就可以用static修饰,成为静态内部类
当内部类被static修饰以后,只能直接访问外部类中的静态成员,出现访问局限
在外部其他类中如何直接访问静态外部类呢?
如果内部类中的func() 是非静态的,对象访问 new Outer.Inner().func();
如果func()是静态的,可以类访问,Outer.Inner.func();
注意:当内部类中定义了静态成员,该内部类必须是静态的
当外部类中的静态方法访问内部类时,内部类必须是静态的
当描述事物的时候,事物的内部还有事物,该事物用内部类描述
因为内部事物在使用外部事物的内容,如人体和心脏
class Body
{
privateclass Heart
{ }
}
只有内部类定义在成员位置上才能被 private 和static修饰
内部类一般私有
局部内部类
还能直接访问外部类的成员
局部内部类中能定义静态成员吗?不能。
因为若有,则内部类必须也是静态,可是内部类在局部,所以不行。
要在局部建立对象,否则访问不到。
局部内部类想访问所在方法(局部)的变量,这个变量必须是final类型的
匿名内部类
1.匿名内部类其实就是内部类的简写格式
往往简写都有其好处和弊端
2.定义匿名内部类的前提
内部类必须继承一个类或者实现接口
创建一个匿名内部类一般直接创建一个匿名内部类的对象,创建的时候用父类或接口的名字
既然匿名内部类是继承自父类或实现接口,那么就要覆盖父类(接口)中的方法,这时用父类的引用指向这个匿名内部类对象,就可以访问这个方法,如果匿名内部类中有自己特有的方法,那么就不能用父类的引用访问,这时匿名内部类的局限。
3.匿名内部类的格式
new父类或接口名(){定义子类的内容};
4.其实匿名内部类就是一个匿名子类对象,而且这个对象有点儿“胖”,也可以理解为带内容的对象
写匿名内部类的目的一般就是覆盖方法简化书写。
什么时候用匿名内部类呢,一般
参数是interface类型时,可以传匿名内部类
//匿名内部类要继承的父类,这里定义虚类,当然一般类也可以abstract class AnonymousFu{abstract void func_1();}//定义外部类内部类class Outer{//外部类的一些一般成员String s = "外部类成员变量";void func_2(){//外部类中要访问成员内部类中的成员,要建立内部类对象Inner_1 in_1 = new Inner_1();//in_1.func_2();}//对外部类的一些初始化方法,可以看看外部类怎么加载的static{System.out.println("Outer类加载");}{System.out.println("Outer构造代码块初始化");}Outer(){System.out.println("Outer构造函数初始化");}//定义一个成员内部类class Inner_1{//定义内部类中的成员String s = "成员内部类成员变量";void func_2(){String s = "成员内部类成员方法中的局部变量";System.out.println(s+"\n"+this.s+"\n"+Outer.this.s);}//成员内部类的一些初始化/*不能有静态代码块初始化,若有,类也必须静态static{System.out.println("Outer类加载");}*/{System.out.println("成员内部类Inner_1构造代码块初始化");}Inner_1(){System.out.println("成员内部类Inner_1构造函数初始化");}}//定义一个静态内部类static class Inner_2{//静态内部类的成员,定义可以静态,可以非静态,访问只能访问静态String s = "静态内部类中的成员变量";static String ss = "静态内部类中的静态成员变量";void func_2(){String s = "静态内部类成员方法中的局部变量";System.out.println(ss);}//静态内部类的一些初始化static{System.out.println("静态内部类Inner_2类加载");}{System.out.println("静态内部类Inner_2构造代码块初始化");}Inner_2(){System.out.println("静态内部类Inner_2构造函数初始化");}}//定义一个局部内部类void func_3(){//定义函数的局部变量,局部内部类要访问,所以只能是final类型final String ss = "外部类成员函数的局部变量(常量)";class Inner_3{//定义内部类中的成员String s = "局部内部类成员变量";void func_2(){String s = "局部内部类成员方法中的局部变量";System.out.println(ss+"\n"+s+"\n"+this.s+"\n"+Outer.this.s);}//成员内部类的一些初始化{System.out.println("局部内部类Inner_3构造代码块初始化");}Inner_3(){System.out.println("局部内部类Inner_3构造函数初始化");}}new Inner_3().func_2();}}//定义一个其他类class Demo{public static void main(String [] args){System.out.println("**************************************************************************");System.out.println(" ........................................................");System.out.println(" |实例化一个外部类对象,并调用其实例化了成员内部类的函数|");System.out.println(" ........................................................");Outer out = new Outer();out.func_2();System.out.println("**************************************************************************");System.out.println(" ..................................");System.out.println(" |实例化一个成员内部类对象,结果:|");System.out.println(" ..................................");Outer.Inner_1 in = new Outer().new Inner_1();System.out.println("**************************************************************************");System.out.println(" ...................................");System.out.println(" |调用静态内部类中的成员函数,结果:|");System.out.println(" ...................................");new Outer.Inner_2().func_2();System.out.println("**************************************************************************");System.out.println(" .....................................");System.out.println(" |调用局部内部类所在的成员函数,结果:|");System.out.println(" .....................................");new Outer().func_3();System.out.println("**************************************************************************");System.out.println(" .........................");System.out.println(" |匿名内部类的使用,结果:|");System.out.println(" .........................");new AnonymousFu(){void func_1(){System.out.println("匿名内部类实现接口方法调用");}}.func_1();}}
《加一句题外话,abstract和static是不能共存的》
面试题:
interface Inner{void method();}class Test{//补足代码}class InnerClassTest{public static void main(String [] args){Test.function().method();}}
分析:
1.Test能直接调用function方法,说明function方法时静态的
2.Test.funtion() 调用方法,说明Test.function()是一个对象的引用,所以function方法返回一个对象的引用
3.method方法接口中是有的,所以function方法返回的是实现了Inner接口的对象,可以用呢匿名内部类解题
interface Inner{void method();}class Test{static Inner function(){return new Inner(){public void method(){System.out.print("解决了");}};}}class InnerClassTest{public static void main(String [] args){Test.function().method();}}
匿名内部类可以没有自定义的父类吗?
可以,Java中所有类有一个共同的父类Object类
new Object(){
voidfunc()
{}
}.func();
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
- 黑马程序员------毕老师视频笔记第九天------面向对象(内部类)
- 黑马程序员------毕老师视频笔记第九天------面向对象(异常上)
- 黑马程序员——第九天(Java面向对象-内部类-异常)
- 黑马程序员——>第九天<面向对象(内部类-匿名内部类-异常)>
- 黑马程序员------毕老师视频笔记第五天------面向对象(封装)
- 黑马程序员------毕老师视频笔记第五天------面向对象(构造函数)
- 黑马程序员------毕老师视频笔记第五天------面向对象(this关键字)
- 黑马程序员------毕老师视频笔记第七天------面向对象(继承)
- 黑马程序员------毕老师视频笔记第七天------面向对象(final关键字)
- 黑马程序员------毕老师视频笔记第七天------面向对象(抽象类)
- 黑马程序员------毕老师视频笔记第七天------面向对象(模板方法设计模式)
- 黑马程序员------毕老师视频笔记第七天------面向对象(接口)
- 黑马程序员------毕老师视频笔记第八天------面向对象(多态)
- 黑马程序员------毕老师视频笔记第八天------面向对象(Object类)
- 黑马程序员------毕老师视频笔记第十天------面向对象(面向对象练习题上)
- 黑马程序员------毕老师视频笔记第十天------面向对象(面向对象练习题下)
- 第九天-面向对象(内部类、异常)
- 黑马程序员------毕老师视频笔记第八天------面向对象(接口多态的应用示例)
- Remove Duplicates from Sorted List
- 精益生产方式下在工程项目的成本管理
- QProcess 使用
- 20世纪中国耕地与复种指数的变化
- Random浅析以及获得随机字符串
- 黑马程序员------毕老师视频笔记第九天------面向对象(内部类)
- 小递归
- 关于“OnClickListener cannot be resolved to a type”问题
- 宝宝取名方法步骤详解
- DBMap
- linux、windows平台下如何监控mysql执行的sql语句
- bugfree安装与配置
- 在终端里获取外网 IP 的方法
- 设计模式 - 装饰者模式(Decorator Pattern) Java的IO类 使用方法