举报投诉联系我们 手机版 热门标签 编程学
您的位置:编程学 > java内部类的类型 Java 内部类类型

java内部类的类型 Java 内部类类型

2023-04-23 09:18 Java教程

java内部类的类型 Java 内部类类型

java内部类的类型

Java内部类是指定义在另一个类里面的类,它可以访问外部类的所有成员属性和方法,包括私有的。Java内部类分为四种:静态内部类、成员内部类、局部内部类和匿名内部类。

静态内部类是指在另一个类里面定义的静态的类,它不能访问外部类的非静态成员变量和方法。它可以被声明为public、protected、private和包访问权限。

public class OuterClass {

    private static int outerStaticNum = 10;

    static class StaticInnerClass {

        public void printOuterStaticNum() {
            System.out.println("OuterClass static num is : " + outerStaticNum);
        }

    }
}

成员内部类是指在另一个类里面定义的成员变量(即实例变量),它能够访问外部类的所有成员和方法(包括private成员和方法)。

public class OuterClass {

    private int outerNum = 10;

    class InnerClass {

        public void printOuterNum() {
            System.out.println("OuterClass num is : " + outerNum);
        }

    } 
}

局部内部类是指在一个方法中定义的一个小的class(即使用class关键字声明一个新的class)。这样声明出来的class小而特别(即不能在其他地方使用这个class了)。这样声明出来的class不能有修饰词修饰(public、protected、private之外还有default修饰词)。

public class OuterClass {

    public void method() {

        class LocalInnerClass {

            public void printSomething() {   // 在此处不能使用修饰词修饰  

                System.out.println("Local Inner Class");   // 圆括号中是局部内部类  

            }   // 此处必须要加上分号  

        }   // 此处必须要加上分号  

        LocalInnerClass inner = new LocalInnerClass();   // 圆括号中是创建对象  

        inner.printSomething();   // 调用对象中的方法  

    }  // 此处必须要加上分号  

匿名内部累是没有名字但是有特征衔接代衩作电当前对责今时今日使电当前对责今时今日使电当前对责今时今日使电当前对责今时今日使电当前对责今时今日使电当前对责今时今日使电当前对责今时今日使电当前对责今时今日使电当前对责。通常情况下会作为其它已存土耳其控制某些衔接代衩作电当前对应已存土耳其控制某些衔接代衩作电当前对应已存土耳其控制某些衔接代衩作电当前对应已存土耳其控制某些衔接代衩作电当前对应已存土耳其控制某些衔接代衩作电当前对应已存土耳其控制某些衔接代衩作电当前对应已存土耳其控制。

public class OuterClass{     public void method(){         new Object(){             public void printSomething(){                 System.out.println("Anonymous Inner Class");             }         };     }}

Java 内部 的 的 的 的 的 的 的 的 的 的 的 的 的 炫目 高效 地 能 够 达 到 高 效 地 能 够 达 到 高 效 地 能 够 达 到 高 效 地 能 够 达 到 高 效能力 ,并带来很大便利 ,因此 Java开发者应详尽理会采集并正常运用 Java内部吗 !

Java 内部类类型

Java面向对象设计 - Java内部类类型


您可以在类中的任何位置定义内部类,您可以在其中编写Java语句。

有三种类型的内部类。内部类的类型取决于位置和声明的方式。

  • 成员内部类
  • 局部内部类
  • 匿名内部类

成员内部类

成员内部类在类中声明的方式与声明成员字段或成员方法相同。

它可以声明为public,private,protected或package-level。

成员内部类的实例可以仅存在于其封闭类的实例内。

以下代码创建了一个成员内部类。

class Car {
  private int year;

  // A member inner class named Tire public
  class Tire {
    private double radius;
    public Tire(double radius) {
      this.radius = radius;
    }
    public double getRadius() {
      return radius;
    }
  } // Member inner class declaration ends here

  // A constructor for the Car class
  public Car(int year) {
    this.year = year;
  }
  public int getYear() {
    return year;
  }
}

局部内部类

一个局部内部类在块中声明。其范围仅限于声明它的块。

由于其范围限于其封闭块,因此其声明不能使用任何访问修饰符,例如public,private或protected。

通常,在方法内定义局部内部类。但是,它也可以在静态初始化器,非静态初始化器和构造器中定义。

下面的代码显示了一个局部内部类的例子。

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
  public static void main(String[] args) {
    StringList tl = new StringList();
    tl.addTitle("A");
    tl.addTitle("B");

    Iterator iterator = tl.titleIterator();
    while (iterator.hasNext()) {
      System.out.println(iterator.next());
    }
  }
}
class StringList {
  private ArrayList<String> titleList = new ArrayList<>();

  public void addTitle(String title) {
    titleList.add(title);
  }

  public void removeTitle(String title) {
    titleList.remove(title);
  }

  public Iterator<String> titleIterator() {
    // A local inner class - TitleIterator
    class TitleIterator implements Iterator<String> {
      int count = 0;
      @Override
      public boolean hasNext() {
        return (count < titleList.size());
      }

      @Override
      public String next() {
        return titleList.get(count++);
      }
    }

    TitleIterator titleIterator = new TitleIterator();
    return titleIterator;
  }
}

上面的代码生成以下结果。

例子

下面的代码有一个局部内部类继承自另一个公共类。

import java.util.Random;

abstract class IntGenerator {
  public abstract int getValue() ;
}
class LocalGen {
  public IntGenerator getRandomInteger() {
    class RandomIntegerLocal extends IntGenerator {
      @Override
      public int getValue() {
        Random rand = new Random();
        long n1 = rand.nextInt();
        long n2 = rand.nextInt();
        int value = (int) ((n1 + n2) / 2);
        return value;
      }
    }

    return new RandomIntegerLocal();
  } // End of getRandomInteger() method
}

public class Main {
  public static void main(String[] args) {
    LocalGen local = new LocalGen();
    IntGenerator rLocal = local.getRandomInteger();
    System.out.println(rLocal.getValue());
    System.out.println(rLocal.getValue());
  }
}

上面的代码生成以下结果。

匿名内部类

匿名内部类没有名称。因为它没有名称,它不能有一个构造函数。

匿名类是一次性类。您定义一个匿名类并同时创建它的对象。

创建匿名类及其对象的一般语法如下:

new Interface()  {
// Anonymous  class body  goes  here
}

new Superclass(<argument-list-for-a-superclass-constructor>)  {
// Anonymous  class body  goes  here
}

new运算符用于创建匿名类的实例。

它后面是现有的接口名称或现有的类名称。

接口名称或类名称不是新创建的匿名类的名称。

如果使用接口名称,则匿名类实现接口。

如果使用类名,则匿名类继承自类。

仅当新运算符后面跟有类名时,才使用<argument-list>。如果新运算符后跟接口名称,则它为空。

如果<argument-list>存在,它包含要调用的现有类的构造函数的实际参数列表。

匿名类主体像往常一样在大括号中。

匿名类主体应该简短,以便更好的可读性。

下面的代码包含一个简单的匿名类,它在标准输出上打印一条消息。

public class Main {
  public static void main(String[] args) {
    new Object() {
      // An instance initializer
      {
        System.out.println("Hello from  an  anonymous class.");
      }
    }; // A semi-colon is necessary to end the statement
  }
}

上面的代码生成以下结果。

例2

以下代码使用匿名类来创建Iterator。

import java.util.ArrayList;
import java.util.Iterator;

public class Main {
  private ArrayList<String> titleList = new ArrayList<>();

  public void addTitle(String title) {
    titleList.add(title);
  }

  public void removeTitle(String title) {
    titleList.remove(title);
  }

  public Iterator<String> titleIterator() {
    // An anonymous class
    Iterator<String> iterator = new Iterator<String>() {
      int count = 0;

      @Override
      public boolean hasNext() {
        return (count < titleList.size());
      }

      @Override
      public String next() {
        return titleList.get(count++);
      }
    }; // Anonymous inner class ends here

    return iterator;
  }
}
阅读全文
以上是编程学为你收集整理的java内部类的类型 Java 内部类类型全部内容。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
相关文章
© 2024 编程学 bianchengxue.com 版权所有 联系我们
桂ICP备19012293号-7 返回底部