黑马程序员------毕老师视频笔记第九天------面向对象(内部类)

来源:互联网 发布: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培训、期待与您交流! ----------------------
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信钱包手势密码忘记了怎么办 买家一起拍了两件宝贝怎么办 宿雾航空付款无法显示验证码怎么办 不小心把购物车的东西删了怎么办 微信在别人电脑登录忘退出怎么办 微信电脑版忘了退出怎么办 给微商交了定金不给退怎么办 方舟手游飞龙驯服时间不够怎么办 淘宝上买了假货找不到商家怎么办 魅蓝手机一直在开机画面怎么办 在实体店买的手机想退怎么办 淘宝买了东西发货了不想要了怎么办 快递已经发货了不想要了怎么办 锤子手机买了不到十天碎屏了怎么办 唯品会新人专享优惠卷过期了怎么办 我微信被系统说赌博登陆不起怎么办 平湖新居民积分卡怎么办办好办吗 电话卡插上去只能打紧急电话怎么办 不小心充错q币了怎么办 液相色谱柱堵了怎么办处理柱子 扣扣空间宠物消消87关怎么办 微信钱包里的钱忘记密码了怎么办 支付宝绑定银行卡要验证码怎么办 微信红包超出20万限额怎么办 微信充电信的号码话费没到账怎么办 农业银行手机银行转账转错了怎么办 微信钱包里的零钱不见了怎么办 买家说支付宝没钱要微信付钱怎么办 微信红包没绑卡密码忘了怎么办 手机微信红包密码忘了怎么办 qq账号忘了怎么办什么也没绑定 手机银行转账名字对卡号错了怎么办 手机夸行转账卡号输入错了怎么办 移动开通了20元流量卡怎么办? 联通手机充值卡网上充值话费怎么办 提现金额和实际到账不一样怎么办 二冲踏板冷车加油熄火怎么办? qq被盗绑定了别人的银行卡怎么办 如何更改微信支付密码忘记了怎么办 微信钱包没绑银行卡忘记密码怎么办 微信密码忘记了也没绑银行卡怎么办