zoukankan      html  css  js  c++  java
  • java学习面向对象之内部类

    什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中。

    那么内部类都有什么特点呢?

    1、内部类可以访问包裹他的类的成员。

    2、如果包裹他的类想访问被其包裹的类的话就得实例化,才可以访问。

    代码示例:

     1 class Outer
     2 {
     3     
     4     int num = 10;
     5 
     6     void show()
     7     {
     8 
     9         System.out.println("Outer Show method!!");
    10 
    11     }
    12 
    13     void method()
    14     {
    15 
    16         Inner a  = new Inner();
    17         a.innerShow();
    18 
    19     }
    20 
    21 
    22     static class Inner
    23     {
    24 
    25         static final int num = 20;
    26 
    27         void innerShow()
    28         {
    29 
    30             System.out.println("The num is "+num);
    31             //show();
    32             staticShow();
    33 
    34         }
    35 
    36         static void staticShow()
    37         {
    38 
    39             System.out.println("Static Inner Show");
    40 
    41         }
    42 
    43     }
    44 
    45 }
    46 
    47 class Inner
    48 {
    49     
    50 
    51     void innerShow()
    52     {
    53 
    54         System.out.println("The num is ");
    55 
    56     }
    57 
    58 }
    59 
    60 class InnerClassDemo1
    61 {
    62     
    63 
    64     public static void main(String[] args) {
    65         
    66         Outer.Inner out = new Outer.Inner();
    67         out.innerShow();
    68 
    69     }
    70 
    71 }

    内部类的作用:

      一般用来作为类的设计。

      当我们描述事物的时候,发现其中还有事物,并且这个事物还在访问被描述事物的内容。这个时候就用到了内部类。

     内部类还有哪些特点呢?

    1、内部类中有静态变量的话,内部类必须是静态的。也就是说内部类可以被修饰符修饰,因为他本身也是类内部的成员。

    2、如果想从外部直接调用内部类,必须按照这种方式来调用:

     1 class InnerClassDemo1
     2 {
     3 
     4     public static void main(String[] args) {
     5         
     6         Outer.Inner inner = new Outer().new Inner();
     7         inner.showInner();
     8 
     9     }
    10 
    11 }

    内部类细节注意:

    1、this变量,我们知道一个类对象被new之后肯定有一个this与之相关联,那么类当中有内部类的时候,如果单凭一个this的话可能就会造成混淆。我们来写段代码来测试一下:

     1 class Outer
     2 {
     3 
     4     private int num = 10;
     5 
     6     class Inner
     7     {
     8         int num = 15;
     9         void showInner()
    10         {
    11 
    12             System.out.println("The Outer num is " + this.num);
    13             System.out.println("The Inner num is " + Inner.this.num);
    14             system.out.println("The Oute num is "+Outer.this.num);
    15 
    16         }
    17 
    18     }
    19 
    20     void method()
    21     {
    22 
    23         Inner inner = new Inner();
    24         inner.showInner();
    25 
    26     }
    27 
    28 }
    29 
    30 class InnerClassDemo1
    31 {
    32 
    33     public static void main(String[] args) {
    34         
    35         Outer.Inner inner = new Outer().new Inner();
    36         inner.showInner();
    37 
    38     }
    39 
    40 }

    2、为什么内部类能够直接访问外部类的成员呢,因为内部类持有外部类的引用,书写格式就是外部类.this.

    内部类的另外一个特点就是,可以放在局部位置上,什么是局部位置呢,形象一点来说的话,就是可以放到函数当中。示例:

     1 class Outer
     2 {
     3 
     4     private int num = 10;
     5 
     6     void method()
     7     {
     8      int num = 9;//必须用final关键字修饰之后,在Inner但中才可以访问这个值。
     9         class Inner
    10         {
    11             //int x = 9;
    12             void show()
    13             {
    14 
    15                 System.out.println("the num is :"+num);
    16 
    17             }
    18 
    19         }
    20 
    21         Inner inner = new Inner();
    22         inner.show();
    23 
    24     }
    25 
    26 }
    27 
    28 class InnerClassDemo1
    29 {
    30 
    31     public static void main(String[] args) {
    32         
    33         Outer out = new Outer();
    34         out.method();
    35 
    36     }
    37 
    38 }

    内部类在局部位置上只能,访问局部但中由final关键字修饰的局部变量。为什么呢?因为当类在局部的时候,当局部方法进栈之后,变量生成,出栈之后变量消失,如果在方法外调用局部作用域的话,因为方法已经出栈了,那么局部变量已经消失了,释放了。此时若要保证外部能够访问局部位置上的内部类中的调用了局部位置的变量的方法,只能够把局部位置上的局部变量用final修饰成常量,这样才可以供外部访问。java是一门严谨性的语言。

  • 相关阅读:
    原生js 异步请求,responseXML解析
    asp.net中Page.ClientScript.RegisterStartupScript用法小结
    asp.net 在repeater控件中加按钮
    无法打开物理文件 操作系统错误 5:拒绝访问 SQL Sever
    js 注册控件的onclick事件
    js控件设置只读属性和不可用属性
    js CheckBox只读
    js时间日期格式
    js正则判断日期
    UIPickerView的使用(三)
  • 原文地址:https://www.cnblogs.com/sunchuanzhen/p/3353511.html
Copyright © 2011-2022 走看看