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语句。
有三种类型的内部类。内部类的类型取决于位置和声明的方式。
成员内部类在类中声明的方式与声明成员字段或成员方法相同。
它可以声明为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 } }
上面的代码生成以下结果。
以下代码使用匿名类来创建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枚举方法因为枚举类型实际上是一个类类型,所以我们可以在枚举类型体中声明一切,我们可以在类体中声明它...
Java数据类型教程 -Java字符串编辑修剪字符串我们可以使用trim()方法从字符串中删除所有前导和尾随空格和控制字符。tri ...
JavaFX教程 -JavaFX拖放例子import javafx.application.Application;import javafx.event.EventHandler;import javafx.scene.Gro...
Java 实例 - 获取目录最后修改时间 Java 实例以下实例演示了使用 File 类的 file.lastModified() 方法来获取目录的最后修改时间...
Java 实例 - 查看当前工作目录 Java 实例以下实例演示了使用 System 的 getProperty() 方法来获取当前的工作目录:class Main { ...