/ *
- クラスメンバーのクラスの内部構造を使用して
- 1、Javaは、クラスA、クラスB、クラスA外部クラス、Bクラス内部で定義することができます
- クラスBの内部クラス名がユニークな外のクラスAでなければならないことに注意してください
- 内部クラスコンパイラのメンバーは、後に、外部内部クラス名クラス名$の.classバイトコードファイルを生成します
- 部分的な内部クラスコンパイルされたクラス名は、(同じ名前を防止するために、プラスの数字)外部デジタル内部名クラスのバイトコードの.class後のファイルを$
- 図2に示すように、クラス宣言内の位置に応じに分割されます。
- 内部クラスのメンバー(静的および非静的)
- 図1に示すように、外側のクラスのメンバーとして
-
あなたは、外部のクラス構造を呼び出すことができます
-
外部静的クラスを変更することはできませんとは異なり、内部クラスがstaticと宣言することができます。
-
外部クラスにのみ使用することが可能と違い、またはデフォルト公的機関、内部クラスは、プライベートと修正の保護を使用することができます
- 2、クラスとして
-
このクラスは、属性、メソッド、コンストラクタ、コードブロック、内部クラスを持っていること
-
クラスは継承できません、それはまた、最後の文を変更することができ、継承することができます
-
内部クラスは、抽象、抽象クラスで変更することができます
- 3、内部クラスの使用のメンバー:
- 3.1クラスのメンバー内の変数を作成します
- 内部の静的クラスオブジェクト:外部内部クラス名クラス名外部変数名=クラス名内に新しいクラス名();.
- 非静的内部クラス・オブジェクト:インスタンス化オブジェクトは、クラス名のインスタンス変数名=外部オブジェクト名.new内部クラス名(内部、外部クラスのクラス名を作成するために、外部コールの使用を必要とする);.
- 内部クラスのコール外部のクラス構造の3.2メンバー
-
参照方法と同じ名前で呼び出します。
- 外部名クラス名は、()メソッドを.this。
- このメソッド名();
- 名前(上の同じメソッドの直接的な使用が存在しない場合)、自動的な方法を識別することができます
-
同じ属性を呼び出します。
- .thisクラスのプロパティ名の外部名();
- このプロパティ名();
- 直接、同じ名前の属性名が存在しない場合に自動的な方法や手段を識別することができます。
- 内部クラス3.3のメンバーの使用を注意してください
-
クラスメンバーの内側非静的メンバは、staticとして宣言することはできない、とだけ静的な内部クラスや外部クラスのメンバーで静的メンバを宣言すること。(ビューのライフ・サイクル・ポイントのメンバーから、我々は一貫している必要があります)
-
内部クラスのアクセス外部メンバーにクラスのメンバーは、我々はする必要があり、「内部クラス。メンバー」(静的な内部クラス)、または「内部クラスのオブジェクト。メンバー」(非静的内部クラス)の方法
-
内部クラスのメンバーは、プライベートデータを含むすべてのクラスの外部メンバーとして使用することができます
-
あなたはクラスの外部の静的メンバクラスの内部の部分を使用したい場合は、内部クラスを考慮静的である必要が外部クラスの静的メソッドを呼び出すことができ、(クラスなどの外部クラスの内部構造、および属性同様の方法staticとして宣言)
- 概要:つ以上の修飾子のアクセス許可を使用することができます外側のクラスに比べて内部クラスのメンバーは、静的な構造を持つことができない非静的内部クラスに限られ、staticとして宣言することができます。
- 図4に示すように、ローカル内部クラス(コンストラクタで定義され、メソッド本体のコードブロック、最初の使用後のステートメントクラスを使用することができない以外の場所)
- オブジェクト・クラス内の4.1戻り値は、ローカル外部使用法復帰することができ、戻り型は部分的にしか内部スーパークラスまたはインタフェース型の親であることができます
- 4.2内部パーシャルクラスは、プライベートを含め、クラスの外部メンバーを使用することができます。
- 4.3ローカル内部クラスとローカル変数同様の位置、あなたが公共の、保護された、デフォルトを使用することはできません、プライベート
- 4.4ローカル内部クラスは、静的な変更を使用することはできませんので、静的メンバを含めることはできません
- クラスメソッドの外にあるが、4.5ローカル内部のローカル変数は、最終的にする必要があります。別のローカル変数のために、ローカルおよび内部クラスのライフサイクル。
- 4.6部分的な内部クラスは最終との抽象宣言しました
- 概要:ほとんど使用されないローカル内部クラス、内部クラスのメンバーよりも多くの制限。典型的には、インタフェースの実現に使用されます。内部には、唯一の抽象メソッドのインターフェースを書き換える必要があります。
- 5、匿名内部クラス
- 5.1匿名内部クラスは匿名内部クラスのインスタンスを作成することができ、任意の静的メンバ、メソッドやクラスを定義することはできません。匿名内部クラスは、暗黙的にクラスを実装するためのインタフェースまたはを使用して実装され、新しい背後に配置する必要があります。
- 5.2匿名内部クラスは親クラスを継承するか、インタフェースを実装する必要があります
- 5.3匿名の内部クラス唯一のオブジェクト、オブジェクト参照のみ多形体
- 同じフォーマットと親クラスと匿名クラスのインタフェースの使用を使用して5.4匿名内部クラス。
* /
package object_chapter2;
public class Object_InnerClass {
static int number = 10;
int arguments = 20;
public static void main(String[] args) {
//创建静态成员内部类对象
Vehicle.Engine e = new Vehicle.Engine();
System.out.println("发动机有" + e.cylinderNumber + "个汽缸");
new Vehicle.Engine().work();
//创建非静态成员内部类对象
Vehicle v = new Vehicle();
Vehicle.Room r = v.new Room();//或者v.new Vehicle.Room()
System.out.println("车里有" + r.chair + "个座位");
r.reName("车名:五菱之光");
new Vehicle().new Room().set();
v.getInstance().compare(v);
}
public static void method() {
int num = 11;
//方法体内的局部内部类
class InnerClass{
void show() {
// num = 12;
System.out.println(num);//局部内部类的方法中可以调用内部类所在方法的局部变量。不能修改
//在JDK1.7及以前,局部变量想要被局部内部类调用必须显式的被声明为final类型的,JDK1.8后会自动识别为final的。
//由于局部内部李生成的字节码文件是独立的,外部类中的变量想要被内部类使用只能是常量,内部类使用的是外部类变量的副本
//只能使用,无法修改。
}
}
// num++;//final的变量不能修改,否则局部内部类调用时会报错。
}
public Object_InnerClass() {
//构造器中定义的局部内部类
class InnerClass{
}
}
{
//代码块中定义的局部内部类
class InnerClass{
}
}
//静态内部类
private static final class InnerClass1{
void method() {
number = 110;
// Object_InnerClass.this.arguments = 20;//静态内部类中无法调用非静态结构
}
}
//非静态内部类
protected class InnerClass2{
void method() {
Object_InnerClass.number = 110;
Object_InnerClass.this.arguments = 20;//非静态内部类中可以调用非静态结构
}
}
class InternalClass{
//内部类中也可以嵌套一个内部类
class InnerInternalClass{
}
}
}
class Vehicle{
static int wheelNumber = 4;
String name = "号称秋名山之神";
void run() {
System.out.println("可以在各种路况上跑");
}
//静态成员内部类
static class Engine{
int cylinderNumber = 4;
void work() {
System.out.println("输出200匹马力的动力");
}
}
//非静态成员内部类
class Room{
//static int chair = 4;//非静态内部类不允许使用静态结构
int chair = 7;
String name = "内部空间极大";
void set() {
Vehicle.this.run();//内部类可以调取外部类的结构
carry();//不重名的情况下可以省略前面的部分
System.out.println("可以坐很多个人");
}
void reName(String name) {
System.out.println(name);//调用方法形参
System.out.println(this.name);//调用内部类属性
System.out.println(Vehicle.this.name);//调用外部类同名属性
}
}
void carry() {
System.out.println("能拉人能载货");
}
//局部内部类的常见场景,方法返回值是一个接口或者抽象类
Comparable getInstance() {
//创建一个内部类为借口的实现类
class MyCompareable implements Comparable{
@Override
public void compare(Vehicle v) {
System.out.println("不管什么车都挡不住五菱的光辉!!");
}
}
//返回内部类的实例
// return new MyCompareable();
//方式二,使用匿名内部类
return new Comparable() {
@Override
public void compare(Vehicle v) {
System.out.println("天下无敌");
}
};
}
}
interface Comparable{
void compare(Vehicle v);
}