インナークラス
クラスの基本的なコンポーネントはメンバーの属性とメソッドですが、どの言語でも、構造をネストすることができ、他のクラスはクラスで定義されます。このようなクラスは内部クラスと呼ばれます。
内部クラスの基本概念
内部クラスは、独立した完全なクラス構造です。属性とメソッドに加えて、クラスを引き続き使用して、クラス内の内部クラスを定義できます。
class Outer{
private String msg = "www.mldn.cn"; //私有成员属性
public void fun(){
// 普通方法
Inner in = new Inner(); //实例化内部类对象
in.print();
}
class Inner{
//在outer内部定义Inner类
public void print(){
print(Outer.this.msg);
}
}
}
main{
Outer out = new Outer(); //实例化外部类对象
out.fun(); //调用外部类中的方法
}
内部クラスの結果を観察することは理解するのが難しくなく、設定の構造は通常のクラスと同じくらい明確で明確であると言えます。では、なぜ内部クラスのような構造が必要なのですか?
全体的な構造に関しては、内部クラスの構造は不合理であるため、内部クラスの最大の欠点は、プログラムの全体的な構造を破壊することですが、内部クラスにはまだ一定の利点があります。
利点:内部クラスは、外部クラスのプライベートプロパティに簡単にアクセスできます。
内部クラスの説明
現在定義されている内部クラスは通常の内部クラスの形式に属しており、通常のクラスは多くの場合、属性とメソッドを提供します。
内部クラスは外部クラスのプライベートメンバーまたはメソッドに簡単にアクセスできますが、同様に、外部クラスも内部クラスのプライベートメンバーおよびメソッドに簡単にアクセスできることに注意してください。
class Outer{
private String msg = "www.mldn.cn"; //私有成员属性
public void fun(){
// 普通方法
Inner in = new Inner(); //实例化内部类对象
in.print();
print(in.info); //访问内部类的私有属性
}
class Inner{
//在outer内部定义Inner类
private String info = "good day"; //私有属性
public void print(){
print(Outer.this.msg);
}
}
}
内部クラスを使用した後、内部クラスと外部クラスの間のプライベート操作メソッドは、setter、getter、およびその他の間接メソッドを完了する必要がなくなり、直接操作できるようになります。
ただし、内部クラス自体もクラスであることに注意してください。ほとんどの場合、内部クラスは外部クラスによってラップされますが、内部クラスのインスタンス化オブジェクトは外部から生成できます。このとき、形式は次のとおりです。
外部类.内部类 内部类对象 = new 外部类().new 内部类();
内部クラスは、コンパイルの完了後に自動的に形成されます。外部内部。クラス「クラスファイル、それらの間」Inner.class「クラスファイル、それらの間」私のnのn E R&LT 。C L A S S 「カテゴリのテキスト要素、中に」 「シンボルプログラムに変更されますが」。」、直接内部の間であなたのカテゴリのプライベートメンバーにアクセスでき、内部クラスがインスタンス化されたオブジェクトを提供する場合は、外部クラスがインスタンス化されていることを確認する必要があります。
現時点で内部クラスが外部クラスの使用のみを許可されている場合は、この場合、プライベート定義にプライベートを使用できます。 。
private class Inner{
//在outer内部定义Inner类
private String info = "good day"; //私有属性
public void print(){
print(Outer.this.msg);
}
}
現時点では、Innerクラスを外部で使用することはできません。
Javaの最も基本的な構造として、クラスには実際には同様の抽象クラスまたはインターフェースがあります。抽象クラスとインターフェースの両方で内部構造を定義できます。
interface IChannel{
public void send(IMessage msg);
interface IMessage{
//内部接口
public String getCon();
}
}
class ChannelImpl implements IChannel{
public void send(IMessage msg){
}
class MessageImpl implements IMessage{
public String getCon(){
}
}
}
main{
IChannel channel = new ChannelImpl();
channel.send(((ChannelImpl)channel).new MessageImpl());
}
内部抽象クラスは、通常のクラス、抽象クラス、およびインターフェイスで定義できます。
interface IChannel{
public void send();
abstarct class AbstractMessage{
public abstarct String getCon();
}
}
class ChannelImpl implements IChannel{
public void send(){
AbstractMessage msg = new MessageImpl();
print(msg.getCon());
}
class MessageImpl extends AbstractMessage{
public String getCon(){
return "www.mldn.cn";
}
}
}
main{
IChannel channel = new ChannelImpl();
channel.send();
}
内部クラスには、さらに興味深い結果がいくつかあります。つまり、ここでインターフェイスを定義すると、クラスを使用してインターフェイスを内部で実装できます。JDK1.8の後に、静的メソッドが追加され、インスタンス化されたオブジェクト。この機能を使用して、機能を完了することができます。
インターフェイス内にインターフェイスを実装する
interface IChannel{
public void send();
class ChannelImpl implements IChannel{
public void send(){
print("www.mldn.cn");
}
}
public static IChannel getInstance(){
return new ChannelImpl();
}
}
main{
IChannel channel = IChannel.getInstance();
channel.send();
}
内部クラスは非常に柔軟性があり、文法が満たされている限り、さまざまな要件を実現できます。
静的定義内部クラス
内部クラスが静的定義を使用する場合、この内部クラスは外部クラスになり、staticによって定義された構造はクラスから独立しており、内部クラス構造は独立したプログラムクラスと同等です。
クラスであろうと静的で定義されたメソッドであろうと、静的メンバーにのみアクセスできるため、静的で定義された内部クラスは外部クラスの静的属性にのみアクセスできます。
class Outer{
private static final String MSG = "www.mldn.cn";
static class Inner{
public void print(){
print(Outer.MSG);
}
}
}
main{
Outer.Inner in = new Outer.Inner(); //实例化static内部类对象
}
現時点では、Innerクラスは独立したクラスです。Innerクラスのオブジェクトをインスタンス化する場合は、外部类.内部类 内部类对象 = new 外部类.内部类();
この時点で「。」を使用したクラス名の
静的定義に基づいて内部インターフェイスを定義するだけで済みます。
interface IMessageWarp{
//消息包装
static interface IMessage{
public String getCon();
}
static interface IChannel{
public boolean connect();
}
public static void send(IMessage msg, IChannel channel){
if(channel.connect()){
print(msg.getCon());
} else{
print("failed");
}
};
}
class DefaultMessage implements IMessageWarp.IMessage{
public String getCon(){
return "www.mldn.cn";
}
}
class NetChannel implements IMessageWarp.IChannel{
public boolean connect(){
return true;
}
}
main{
IMessageWarp.send(new DefaultMessage(), new NetChannel());
}
staticで定義された内部インターフェースを使用する主な理由は、これらの操作が一連の関連する定義に属しているためです。外部インターフェースを使用すると、インターフェースの主な機能をより明確に説明できます。
内部クラス
内部クラスは任意の構造で定義でき、メソッドで定義される内部クラスにはさらに多くの形式があります。
class Outer{
private String msg = "www.mldn.cn";
public void fun(long time){
class Inner{
//内部类
public void print(){
print(Outer.this.msg);
print(time);
}
}
new Inner().print(); //方法中直接实例化内部类对象
}
}
main{
new Outer().fun(2334234L);
}
現時点では、fun()メソッドには内部定義があります。内部クラスは外部クラスのプライベート属性に直接アクセスでき、メソッドのパラメーターにもアクセスできます。メソッドのパラメーターへの直接アクセスはJDK1からサポートされています。 .8。
匿名の内部クラス
匿名内部クラスは、内部クラスの単純化された処理形式であり、主に抽象クラスとインターフェイスサブクラスで使用されます。
interface IMessage{
public void send(String str);
}
class MessageImpl implements IMessage{
public void send(String str){
print(str);
}
}
main{
IMessage msg = new MessageImpl();
msg.send("test");
}
IMessageのMessageImplサブクラスが1回だけ使用される場合は、別のクラスとして定義する必要はありません。この時点で、匿名の内部クラスを使用して問題を解決できます。
interface IMessage{
public void send(String str);
}
main{
IMessage msg = new IMessage(){
//匿名内部类
public void send(String str){
print(str);
}
};
msg.send("test");
}
匿名内部クラスの使用を容易にするために、静的メソッドを使用して内部匿名内部クラスを実装できる場合があります。
interface IMessage{
public void send(String str);
public static IMessage getInstance(){
return new IMessage(){
public void send(String str){
print(str);
}
}
}
}
main{
IMessage.getInstance().send("test");
}
匿名内部クラスは、名前のないサブクラス操作であり、一度しか使用できず、結果は固定されています。