黑马程序员————类的第五个成员内部类

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

  我们在通过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);
   }
}

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

 

时间: 2024-12-28 18:12:23

黑马程序员————类的第五个成员内部类的相关文章

黑马程序员——JAVA学习笔记五(异常)

1,     异常:是在运行时期发生的不正常情况. 在java中用类的形式对不正常情况进行了描述和封装对象.描述不正常的情况的类,就称为异常类. 以前正常流程代码和问题处理代码相结合,现在将正常流程代码和问题处理代码分离,提高阅读性. 其实异常就是java通过面向对象的思想将问题封装成了对象,用异常类对其进行描述. 不同的问题用不同的类进行具体的描述.比如角标越界.空指针异常等等. 问题很多,意味着描述的类也很多,将其共性进行向上抽取,形成了异常体系. 不正常情况分成了两大类: Throwabl

&lt;&lt;黑马程序员&gt;&gt;类的加载和初始化

类的加载和初始化 + (void)load  方法   ①  当程序一启动就会把所有类和分类而且加载后就会调用每个类的+load方法只会调用一次.   ②  先加载父类在加载子类,每个类加载完就会调用load方法 2 . + (void)initialize    方法      ①  当第一次使用这个类时就会调用  + (void)initialize    方法 调用顺序:①  先加载父类在加载子类               ② 先调用父类的load方法在调用子类的load方法      

黑马程序员----类的加载和初始化

类的加载和初始化 当程序一启动,就会加载项目中所有的类和分类,而且加载后会调用每一个类和分类中的+load方法(即使不创建对象也会调用),且只会调用一次: 当第一次使用某个类时,就会调用当前类的+initialize方法: 先加载父类,再加载子类(先调用父类的+load方法,再调用子类的+load方法): 先初始化父类,再初始子类(先调用父类的+initialize方法,再调用子类的+initialize方法): 注意点:1.调用创建子类时即会调用父类的+initialize方法,也会调用子类的

黑马程序员-----类的继承和派生概念

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ----- 第一讲 类的继承和派生概念 本小节知识点: 1.[理解]什么是继承? 2.[掌握]类的继承和派生概念 1.什么是继承? 2.OC中的继承与派生 1 #import <Foundation/Foundation.h> 2 3 @in

黑马程序员--oc基础第五篇

五.oc的语法基础(内存管理上) 1.引用计数器:在每一个对象里都有一个引用计数器,占用4个字节的空间,在一个对象创建时引用计数器的值初始化为1. *给对象发送一条retain消息,可以使引用计数器的值+1(retain方法返回对象本身) *给对象发一条release消息,则计数器的值-1 *可以给对象发送retaincount消息来获取当前引用计数器的值 *当一个对象被销毁时,系统会自动向对象发送一条dealloc消息,就像遗言一样,可以对他进行改写,一但改写就必须调用[super deall

黑马程序员----类的本质

类的本质: 类本身也是一个对象,是一个Class类型的对象,简称类对象: 1.内存中创建对象的本质: 利用Class  创建一个 Person类对象: 利用person类对象,创建Person类型的对象. 2.类对象及对象内存细节: 3.类对象的其他使用: 调用类方法: 1.利用类名调用类方法: 2.利用类对象调用类方法: 创建对象:

黑马程序员------IO(五)

黑马程序员------IO(五) 1.1  操作对象(示例1)ObjectInputStream与ObjectOutputStream 被操作的对象需要实现Serializable. Serializable:用于给被序列化的类加入ID号,用于判断类和对象是否是同一个版本 类通过实现java.io.Serializable接口以启用序列化功能,Serializable只是一个标记接口. 1 示例1: 2 import java.io.*; 3 4 class ObjectStreamDemo 5

黑马程序员_关于黑马java班入学测试技术分享-后五(二)

??????????????????????????????????????????????????????????????????????????-----Java培训.Android培训.iOS培训..Net培训.期待与您交流! 作为本人首篇黑马技术博客有必要交代一下背景.个人理解博客的用作在于于己在于交流,于他在于学习,在交流学习中共同成长.下面进入正题.本文主要是介绍在做黑马入门测试时的一些问题(这个应该不是泄露题库吧). 本文只要是讲述黑马程序员基础测试题的6-10题,回过头来分析明显

黑马程序员-面向对象-Object类

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Unity开发</a>.<a href="http://edu.csdn.net"target="blank">.Net培训</a>.期待与您交流! ---------------------- 一.Object类中的equals(