内部クラスとは何ですか
内部クラスとは何ですか?
名前が示すように、それは別のクラスの内部に配置されたクラスを定義することです。
明確な概念は、感が非常に簡単であり、実際にキーの位置はクラス内に配置され、クラスがメソッドコードブロックの範囲の範囲または範囲の範囲内であってもよいです。
だから私は完全に内部に取得するには、Javaクラスの機能の詳細を習得するための最初の一歩のコンセプトを理解しています。
例を見て、これは最も一般的な内部クラスです。
public class Product1 {
class Design{
private String name = "P30 pro";
public String showName() {
return name;
}
}
class Content{
private int i;
Content(int value){
i = value;
}
int value() {return i;}
}
public void show(int value) {
Content c = new Content(value);
Design d = new Design();
System.out.println(d.showName());
System.out.println(c.value());
}
public static void main(String[] args) {
Product1 p = new Product1();
p.show(6000);
}
}
注:
上記の例では、最も基本的な内部クラスの使用方法を示し、それは内周の内側に1つ以上のクラスを定義することです。差がないように、それは、使用のshow()メソッドおよび一般的なカテゴリで見ることができます。
さらに、クラスの非静的メソッドの周縁外の位置は、クラスオブジェクトは、内部新しいクラス方法内に直接作成できません。コンパイルエラーが報告されます。
このように:
これがあります:
あなたは、囲むクラス非静的メソッドの外に内部クラスのオブジェクトを作成したい場合。どのようにそれを行うには?
正しい姿勢はこれです:
周辺2つのパブリックメソッドクラスの増加は、内部クラスを返します。
public Design design() {
return new Design();
}
public Content content(int value) {
return new Content(value);
}
内部クラスのオブジェクトは、callメソッドによって外部オブジェクトを取得します。
public static void main(String[] args) {
Product2 p = new Product2();
p.show(6000);
Product2.Content c1 = p.content(100);
Product2.Design d1 = p.design();
}
他のクラスが、彼らは外部クラスの外部クラスのクラスオブジェクトの内部に外に直接アクセスすることができない、ということは注目に値します。
コンパイルエラーが報告されます。これはまあ囲むクラスのサービスのために、ある内部クラスの定義、とラインでもあります!
クラス内の特長
図1は、外部クラスにリンクすることができます
内部クラスのオブジェクトを生成するときに、このオブジェクトおよびオブジェクトの周囲との間のリンクがので、すべてのメンバーが特別な条件なしに、周辺オブジェクトにアクセスすることができ、それがなされています。
次の例ではでは、「Javaプログラミングのアイデア」の一例である
第1のセレクタのインターフェイスを定義します
public interface Selector {
boolean end();
Object current();
void next();
}
シーケンスはその後、クラス、内部プライベートを定義するクラスを定義します。
public class Sequence {
private Object[] items;
private int next = 0;
public Sequence(int size) {items = new Object[size];}
public void add(Object x) {
if(next < items.length) {
items[next++] = x;
}
}
private class SequenceSelector implements Selector{
private int i = 0;
public boolean end() {
return i == items.length;
}
public Object current() {
return items[i];
}
public void next() {
if(i < items.length) {i++;}
}
}
public Selector selector() {
return new SequenceSelector();
}
public static void main(String[] args) {
Sequence sequence = new Sequence(10);
for(int i = 0; i < 10; i++) {
sequence.add(Integer.toString(i));
}
Selector selector = sequence.selector();
while(!selector.end()) {
System.out.print(selector.current() + " ");
selector.next();
}
}
}
説明:
(SequenceSelector内部クラスを参照している端部()、(電流)と次)は、両方のプライベートアイテム周辺クラスフィールドを使用します。
2.使用.thisと.new
.this使い方は
あなたが外部のクラスオブジェクトへの参照を生成する必要がある場合は、ドットと、この続く外側のクラスの後ろに名前を使用することができます。
次のように:
public class DotThis {
void name() {System.out.println("name");}
public class Inner{
public DotThis outer() {
return DotThis.this;
}
}
public Inner inner() {return new Inner();}
public static void main(String[] args) {
DotThis dt = new DotThis();
DotThis.Inner inner = dt.inner();
inner.outer().name();
}
}
注DotThis.thisはちょうど正しい外部クラスの参照を持っていました。これは、外部クラスのオブジェクトを作成できません。
.new使い方は
文法を介して内部クラスのオブジェクトを作成していますが、クラス外でオブジェクトを作成するために使用することに注意することができます。
public class DotNew {
public class Inner{}
public static void main(String[] args) {
DotNew dn = new DotNew();
DotNew.Inner dnInner = dn.new Inner();
}
}
内部クラス分類
図1に示すように、部分的な内部クラス
方法またはプロセスの範囲内のクラスの定義。ローカル内部クラスと呼ばれます。
public class Product3 {
public Section section(String inputName) {
class ASection implements Section{
private String name;
private ASection(String name) {
this.name = name;
}
@Override
public String hello() {
return name + " say hello";
}
}
return new ASection(inputName);
}
public static void main(String[] args) {
Product3 p = new Product3();
Section section = p.section("aaaaa");
System.out.println(section.hello());
}
}
ASectionインターフェイスは、次のようにセクション、セクション・インタフェース・コードを達成することです。
public interface Section {
String hello();
}
説明:
- この内部クラスセクション()メソッドは、この方法はASectionクラス外でアクセスすることはできません。
- 方法インナークラスは、アクセス修飾子(パブリック、プライベート、保護された)許可されていません。
- この方法は、上方遷移があることセクションへの参照を返すことに注意してください。
また、if文ブロックとして、処理するために、一つのブロックの内部クラスに定義することができます。
public class Product4 {
public String check(boolean flag) {
String checkId = null;
if(flag) {
class DetailCheck{
private String id;
private DetailCheck(String id) {
this.id = id;
}
String getId() {
return id;
}
}
DetailCheck dc = new DetailCheck("1111");
checkId = dc.getId();
}
return checkId;
}
public static void main(String[] args) {
Product4 p = new Product4();
System.out.println(p.check(true));
}
}
説明:
DetailCheck内部クラスのブロックであれば、その文ブロックの範囲内でもその範囲であれば。この範囲外では使用できません。たとえば、これはエラーをコンパイルします:
2、匿名内部クラス
匿名の内部クラスは、実際には内部クラス(部分的な内部クラス)のための特別な方法です。これは、その一つのオブジェクトの作成に組み込まれた内部を規定する特別なクラスです。内部クラス名は、classキーワードで文を表示しないように「匿名」。
コードサンプルを見てください:
public class Product5 {
public Section section() {
return new Section() {
private String name = "hayli";
@Override
public String hello() {
// TODO Auto-generated method stub
return name + " haha";
}
};
}
public static void main(String[] args) {
Product5 p = new Product5();
p.section();
}
}
説明:
ここでは、セクションは、インタフェースが、また、ベースクラスかもしれません。
図3に示すように、ネストされたクラス(静的内部クラス)
また、ネストしたクラスとして知られている静的な内部クラスと呼ばれる静的なキーワード修正内部クラスを使用します。
クラスと共通の内部ネストされたクラス間の最大の違いは以下のとおりです。
- 一般的な内部クラスのオブジェクトは、暗黙的に作成した外部のクラスオブジェクトへの参照を保持しています。ネストされたクラスは、オブジェクトを作成し、外部のクラスオブジェクトを必要としません。
- あなたは、オブジェクトクラスから非staticネストされた外部のオブジェクトにアクセスすることはできません。
- 一般的な内部クラスは静的データと静的フィールドを持つことができない、とネストされたクラス、ネストされたクラスを含めることはできませんが、これらの事のすべてを含んでいてもよいです。
public class Product6 {
private static int id = 100;
private static class BSection implements Section{
private String name = "bbbb";
@Override
public String hello() {
return name + " hello";
}
// 只能访问外部类的静态数据或字段
public int getId() {return id;}
// 可以包含静态数据或方法
static int x = 200;
public static void test1() {}
// 可以再嵌套一层
static class BInner{
private String name;
static void test1() {System.out.println("inner ===");}
}
}
public static void main(String[] args) {
Section section = new BSection();
section.hello();
}
概要
クラス内にあるもののこの導入は、いくつかの特定のタイプは内部メソッドとJavaの内部クラスの最も一般的な定義を詳細。クラス内の仕事の機会を使用することはありませんが、最も基本的な知識を理解しますが、内部クラスは本当に、プロジェクト内の文言をヒットするだけでなく、それが起こるかを理解すること。
マイクロチャネル公共番号を懸念スキャンコード:2つのノート大隊の司令官。「2人の大隊の司令官」への返信、Java関連の技術情報を受け取ることができます。