zoukankan      html  css  js  c++  java
  • JAVA基础之内部类

    JAVA基础之内部类

    2017-01-13

    1、java中的内部类都有什么?!

        成员内部类

        局部内部类

        匿名内部类

        静态内部类

    2、内部类详解

        •成员内部类

          在一个类的内部再创建一个类,成为内部类

          1)在一个类中使用内部类,可以在内部类中直接存取所在类的私有属性或方法

     1 class Outer{
     2     //外部类Outer
     3     private int i = 111 ;//外部类私有变量
     4     class Inner{
     5         //内部类Inner
     6         private int j = 222 ;//内部类私有变量
     7         public void print(){
     8             System.out.println("外部类的私有属性"+ i);
     9             System.out.println("内部类的私有属性"+ j);
    10         }
    11     }
    12 }
    13 public class ClassDemo5 {
    14     public static void main(String[] args) {
    15         Outer o = new Outer() ;
    16         Outer.Inner i = o.new Inner() ; 
    17         i.print() ;
    18     }    
    19 }

           2)内部类的实例化方法

    import 面向对象基础.Outer.Inner;  
    //第一种方式:导入import 面向对象基础.Outer.Inner;包
    Outer.Inner i = o.new Inner() ;
     //第二种方式:外部类.内部类 对象名 = 外部类对象.new 内部类

             3)外部类访问内部类

     1 class Fatch{
     2     //外部类Fatch
     3     public class Student{
     4         //内部类Student
     5         public void show(){
     6             //内部类show()方法
     7             System.out.println("内部类Student的show()方法");
     8         }
     9     }
    10     public void print(){
    11         /**
    12          * 外部类不可以直接访问内部类的属性或方法,
    13          * 必须创建内部类对象才可以访问
    14          */
    15         new Student().show() ;    //使用匿名对象实例化调用内部类的类成员
    16         System.out.println("外部类Fatch的print()方法");
    17     }
    18 }
    19 public class ClassDemo4 {
    20     public static void main(String[] args) {
    21         Fatch f = new Fatch() ;    //实例化外部类对象
    22         f.print() ;    //调用外部类的print()方法
    23     }
    24 }

          4)如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字。

     1 class Outer1 {
     2     //外部类
     3     private int i = 10 ;//外部类私有变量
     4     class Inner1{
     5         //内部类
     6         private int i = 20 ;//内部类私有变量
     7         public void show(){
     8             //内部类方法
     9             System.out.println("内部类的变量"+ this.i );//使用this关键字访问内部类成员
    10             System.out.println("外部类的变量"+ Outer1.this.i);//使用外部类名.this.变量名 来访问外部类成员
    11         }
    12     }
    13     public void print(){
    14         new Inner1().show() ;    //调用内部类方法
    15     }
    16 }
    17 public class ClassDemo6 {
    18     public static void main(String[] args) {
    19         new Outer1().print() ;  
    20     }
    21 
    22 }

       

            •注意点:

              »实例化内部类之前必须实例化外部类

              »内部类可以随意访问他的外部类成员,但外部类不可以直接访问内部类的类成员

              »内部类可以被声明为private 或 protected 权限的访问

              »内部类对象会依赖于外部类对象,除非已经存在一个外部类对象,否则类中不会出现内部类对象

        •局部内部类(方法内部类)

          内部类不仅可以在类中进行定义,也可以在类的局部位置进行定义,例如在类的方法或者任意的作用域中都可以定义内部类

             1)在外部类的方法中定义一个方法内部类

     1 class Demo1{
     2     //外部类Demo
     3      final int I = 10 ;//外部类定义的常量
     4      public void show(){    //外部类的show()方法
     5          class Inne{        //方法内部类
     6              int j = 20 ;    //方法内部类变量
     7              private void inshow() {    //方法内部类中的inshow()方法
     8                  System.out.println("外部类常量"+ I );
     9                  System.out.println("方法内部类变量"+ j );
    10             }
    11          }
    12          Inne in = new Inne()  ;    //实例化内部类对象
    13          in.inshow() ;    //调用内部类方法
    14      }
    15 }
    16 public class ClassDemo7 {
    17     public static void main(String[] args) {
    18         Demo1 d = new Demo1() ;
    19         d.show() ;
    20     }
    21 }

        注意:如果方法中的参数需要被传递进去,就必须把参数声明成final类型

          •静态内部类

          如果一个内部类被声明为static,此内部类就称为外部类 

           1)静态内部类可以通过(new 外部类名.内部类.内部类方法名) ,来调用静态内部类方法

     1 class Outer2{
     2     //外部类
     3     private static String str = "张博杰" ;//外部类的静态变量
     4     static class Inner2{
     5         //使用static声明 的静态内部类
     6         public void fun() {
     7             //静态内部类方法
     8             System.out.println("外部类的静态变量"+" "+ str);
     9         }
    10     }
    11 }
    12 public class ClassDemo8 {
    13     public static void main(String[] args) {
    14         new Outer2.Inner2().fun() ;
    15         //静态内部类可以使用new 外部类名.内部类.内部类方法名 ,来调用静态内部类方法
    16     }
    17 }

           

            •匿名内部类

              匿名内部类也就是没有名字的内部类,正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写.使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

              1)匿名内部类的实现

     1 abstract class A2 {    //抽象类A2
     2     public abstract void eat() ;
     3 }
     4 public class ClassDemo9 {
     5     public static void main(String[] args) {
     6         /**
     7          * 如果A2这个抽象类只用一次,那么就可一使用匿名内部类来实现
     8          */
     9         A2 a = new A2(){
    10             public void eat(){
    11                 System.out.println("我要吃饭");
    12             }
    13         } ;
    14         a.eat() ;
    15     }
    16 }
  • 相关阅读:
    canvas beginPath()的初步理解
    高效取余运算(n-1)&hash原理探讨
    EntityUtils.toString(entity)处理字符集问题解决
    python计算不规则图形面积算法
    VMware与 Device/Credential Guard 不兼容,解决办法及心得
    Java爬取51job保存到MySQL并进行分析
    纯C语言实现循环双向链表创建,插入和删除
    纯C语言实现顺序队列
    纯C语言实现链队
    纯C语言实现链栈
  • 原文地址:https://www.cnblogs.com/zbj815/p/960815_bj.html
Copyright © 2011-2022 走看看