博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
黑马程序员————类的第五个成员内部类
阅读量:6421 次
发布时间:2019-06-23

本文共 2723 字,大约阅读时间需要 9 分钟。

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

  我们在通过java语言描绘事物的时候,会遇到事物里面还有事物,而里面的事物还会用到外面事物的一些属性。就好像看似单一的物体实则里面还有很多看似独立的分支,但却又要用到这个物体的一些属性与方法。就好像大自然里面的万物,每个看似独立却又息息相关。我们当然可以把其中的生物个体单独定义封装,但为了表现程序语言对现实世界的描述力,还是把他放到大自然里面更好,这样如果要用到大自然的一些元素就可以直接条用了。而不是在通过创建对象来调用。

  内部类大致分为三类:成员内部类,局部内部类,匿名内部类。先说说成员内部类,成员内部类可以访问外部类的成员包括私有的;而自身也是通过创建对象被访问,如果是外部其他类要访问,则通过创建追踪对象(方便理解,自创的词)。

class A {        private int a=3;        class B{//成员内部类            void function(){                System.out.println(a);//调用私有的外部成员变量            }        }}    class C{    public static void main(String arg[]){        A.B aa =new A().new B();//创建所属成员内部类        aa.function();    }}

  

为什么叫创建追踪对象呢,因为想要访问非静态的成员就必须得创建对象,如果一些外部类的内部类重名,系统将不知道是指的哪个外部类里面的内部类,所以在内部类前面必须加上其外部类名。这样才能创建出你想要的那个内部类,格式:外部类名.内部类名  变量名 = new 外部类名().new 内部类名();

值得注意的是当内部类访问外部成员时,如果内部类成员变量与外部类成员变量重名,甚至还与内部局部变量重名,那么其调用原则为就近原则。

class A{          private  int a =3;//成员变量          class B{                    int a=4;//内部类成员变量                    void  function(){                    int a =5;//内部类局部变量                                System.out,println(a);              }      }    }

  如果出现这种情况还要调用外部类的成员变量的话,就需要在a前面加上外部类引用。外部类名.this.a,正因为如此,内部类才能访问外部类成员的,因为你不写的时候是隐含了外部类引用的。

因为成员外部类属于类的成员,所以他能被成员修饰符private,static等修饰。被private修饰的内部类为封装内部类,由此我们也可以得出结论:类是能被private修饰的。被static修饰的内部类为静态内部类,同样也具备静态的性质。只能访问外部类静态成员,如果是调用静态内部类非静态成员时还是需要创建对象的,格式为

new 外部类名.内部类名().方法名;

  调用静态内部类中静态成员时,无需创建对象

外部类名.内部类名.方法名();

  

 

 

 

第二种:局部内部类                    

       因为内部类能定义在外部类中任何位置,所以就有了局部内部类。因为是定义在方法中,所以不能被成员修饰符所修饰,但是可以访问到外部类成员,因为隐含了外部类的引用。对一般局部变量也访问不了,如果要访问,必须经final修饰。因为是局部变量,所以即使经final修饰成为常量也依然能起到作为变量的作用,只有当方法调用是,局部变量进栈,但随后会消失,再次调用方法,有重新获得新的内存空间,正因如此也无法对其进行累加或累减运算。

class A{            viod  aa(){                         final int a =3;//经final修饰后的局部变量                         class B{                                     void bb(){                                                  System.out.println(a);                   }                        }       }}

  有一点需要注意的是。当调用A类aa方法时,B类中bb方法是不能调用的,必要要创建对象。

 

 

 

第三种:匿名内部类

匿名内部类的作用就是简化写法,但前提是必要要有继承或实现。

例如内部类需要继承一个抽象类,再通过调用内部类实现其中方法一般写法是这样

abstract class Abs{                 abstract  void show();} class A{            int  x=3;           class B extends Abs{//第一步:继承抽象类                  void show(){//第二步:重写父类方法                               System.out.println(x);                                 }      }          public   void  function(){                                                  new A.B().show();//第三步:创建对象              } }

  上面用了三不才实现的通过匿名内部类一步就可以搞定

new Abs(){//因为没有名字所有直接创建父类     void show(){//因为父类中有抽象方法,所以重写得到自己想要的方法               System.out.println(x);   }}

  需要注意的是,定义子类的方法最好不要超过三个,一个两个最好。我也是初学者,哪里有问题还望指正。

 

转载于:https://www.cnblogs.com/huangjiawei/p/4696758.html

你可能感兴趣的文章
紧急维护,阿里云服务器抢修记
查看>>
linux工具使用
查看>>
站长怎样理性选择虚拟主机
查看>>
linux文件系统\环境变量\帮助文件
查看>>
ioS开发知识(二十二)
查看>>
svn 配置
查看>>
安装saltstack遇到缺包问题!自己遇到的错!若有雷同请海涵
查看>>
数学基础知识03——坐标系变换
查看>>
理解 HashMap 加载因子 loadFactor
查看>>
第三周编程总结
查看>>
发布功能完成
查看>>
用js实现返回上一页
查看>>
因数分解
查看>>
数据结构之队列
查看>>
并发编程(二)
查看>>
[html5]localStorage的原理和HTML5本地存储安全性
查看>>
vc 多行文本框CEdit垂直滚动条定位到最底端
查看>>
basic4android 开发 推送功能
查看>>
centos7安装redis
查看>>
EF 约定介绍
查看>>