ダークホースプログラマー_JAvaオブジェクト向け(二)
8643 ワード
--------androidトレーニング、JAvaトレーニング、交流を楽しみにしています!--------
一:多態
①マルチステートの親を表す参照自分の子オブジェクトの親を指す参照も自分の子オブジェクトを受け入れることができる②マルチステートの前提はクラスとクラスの関係があるか、継承するか、または、通常は、③マルチステートを上書きする利点があるマルチステートの出現により、プログラムの拡張性が向上する④マルチステートの弊害により拡張性が向上するが、親クラスの参照を使用して親クラスのメンバーにアクセスするしかないという前提がある
二:多態の応用と注意事項
①マルチステートにおけるメンバー関数の特徴コンパイル時期:参照型変数が属するクラスに呼び出し方法があるかどうかを参照.ある場合はコンパイルにパスし、ない場合はコンパイルに失敗します.実行時:オブジェクトが属するクラスに呼び出しがあるかどうかを参照する方法を簡単にまとめます.メンバー関数はマルチステート呼び出し時に、コンパイルは左を見て、実行は右を見てください.
②マルチステートにおけるメンバ変数の特徴コンパイルや実行に関係なく左側(参照型変数が属するクラス)を参照
③マルチステートにおける静的メンバー関数の特徴コンパイルと実行にかかわらず左側を参照
三:内部クラス及び匿名内部クラス
内部クラスのアクセスルール:1内部クラスは外部クラスのメンバーに直接アクセスすることができ、プライベートメンバーが外部クラスのメンバーに直接アクセスできるのは、内部クラスに外部クラスの引用があるためであり、フォーマット:外部クラス名.this②外部クラス内部クラスにアクセスするには、内部クラスオブジェクトを作成する必要があります
③外部の他のクラスで内部クラスにどのようにアクセスするか、アクセスフォーマット:外部クラス名.内部クラス名変数名=外部クラスオブジェクト.内部クラスオブジェクト、eg:Outer.Inner in=new Outer().new Inner();④内部クラスがメンバーの位置にある場合、privateが内部クラスを外部クラスにカプセル化してstatic内部クラスをカプセル化するようにメンバー修飾子で修飾することができる(この場合、静的内部クラスは外部クラスの静的メンバーにしかアクセスできない)
a:外部の他のクラスでstatic内部クラスの非静的メンバーに直接アクセスするにはどうすればいいですか. new Outer.Inner().function();b:外部の他のクラスでstatic内部クラスの静的メンバーに直接アクセスするにはどうすればいいですか. Outer.Inner.function();
注意:内部クラスに静的メンバーが定義されている場合、内部クラスはstaticでなければなりません.外部クラスの静的メンバーが内部クラスにアクセスする場合、内部クラスは静的でなければなりません.
内部クラス定義がローカルの場合①メンバー修飾子で修飾できない②外部クラスのメンバーに直接アクセスできる.外部クラスの参照を持っているがローカルの変数にアクセスできないため、finalで修飾されたローカル変数にのみアクセスできる
匿名内部クラス:①匿名内部クラスは実は内部クラスの略写フォーマットである②内部クラスを定義する前提:内部クラスは1つのクラスを継承するかインタフェースを実現しなければならない③匿名内部クラスのフォーマット:new親クラスまたはインタフェース(){サブクラスの内容を定義する;}④実は匿名の内部クラスは匿名のサブクラスのオブジェクトであり、しかもこのオブジェクトは少し太っているので、内容のあるオブジェクトと理解できる⑤匿名の内部クラスで定義する方法は3つを超えないほうがよい
--------androidトレーニング、JAvaトレーニング、交流を楽しみにしています!--------
一:多態
①マルチステートの親を表す参照自分の子オブジェクトの親を指す参照も自分の子オブジェクトを受け入れることができる②マルチステートの前提はクラスとクラスの関係があるか、継承するか、または、通常は、③マルチステートを上書きする利点があるマルチステートの出現により、プログラムの拡張性が向上する④マルチステートの弊害により拡張性が向上するが、親クラスの参照を使用して親クラスのメンバーにアクセスするしかないという前提がある
abstract class Student
{
abstract public void show();
public void sleep()
{}
}
class BaseStudent extends Student
{
public void show()
{
System.out.println("base student");
}
public void sleep()
{
System.out.println(" 。。");
}
}
class AdvStudent extends Student
{
public void show()
{
System.out.println("advanced student");
}
public void sleep()
{
System.out.println(" 。。");
}
}
class DuotaiDemo1
{
public static void main(String[] args)
{
//BaseStudent bs=new BaseStudent();
//bs.show();
//bs.sleep();
//StudentDo(new BaseStudent());
//StudentDo(new AdvStudent());
DoStudent ds=new DoStudent();
ds.studentDo(new BaseStudent());
ds.studentDo(new AdvStudent());
}
/* //
public static void StudentDo(Student s)
{
s.show();
s.sleep();
}
*/
}
class DoStudent
{
public static void studentDo(Student s)
{
s.show();
s.sleep();
}
}
二:多態の応用と注意事項
①マルチステートにおけるメンバー関数の特徴コンパイル時期:参照型変数が属するクラスに呼び出し方法があるかどうかを参照.ある場合はコンパイルにパスし、ない場合はコンパイルに失敗します.実行時:オブジェクトが属するクラスに呼び出しがあるかどうかを参照する方法を簡単にまとめます.メンバー関数はマルチステート呼び出し時に、コンパイルは左を見て、実行は右を見てください.
②マルチステートにおけるメンバ変数の特徴コンパイルや実行に関係なく左側(参照型変数が属するクラス)を参照
③マルチステートにおける静的メンバー関数の特徴コンパイルと実行にかかわらず左側を参照
class Fu
{
static int num_1=5;
int num_2=30;
public void method1()
{
System.out.println("fu_method_1");
}
public void method2()
{
System.out.println("fu_method_2");
}
public static void method4()
{
System.out.println("fu_method_4");
}
}
class Zi extends Fu
{
static int num_1=8;
int num_2=20;
public void method1()
{
System.out.println("zi_method_1");
}
public void method3()
{
System.out.println("zi_method_3");
}
public static void method4()
{
System.out.println("zi_method_4");
}
}
class DuotaiDemo2
{
public static void main(String[] args)
{
//
Fu f=new Zi();
f.method1(); //zi_method_1
f.method2(); //fu_method_2
//f.method3(); , ( method3() , ),
f.method4(); //fu_method_4 : , ( )
// : , ( )
System.out.println(f.num_1); //5
System.out.println(f.num_2); //30
System.out.println("----------------");
//
Zi z=new Zi();
z.method1(); //zi_method_1
z.method2(); //fu_method_2
z.method3(); //zi_method_3
z.method4(); //zi_method_4
System.out.println(z.num_1); //8
System.out.println(z.num_2); //20
}
}
abstract class Animal
{
abstract void eat();
}
class Cat extends Animal
{
public void eat()
{
System.out.println("eat fish");
}
public void catchMouch()
{
System.out.println("catch mouch");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("eat bone");
}
public void lookHome()
{
System.out.println("look home");
}
}
class Pig extends Animal
{
public void eat()
{
System.out.println("eat siliao");
}
public void gongDi()
{
System.out.println("gogn di");
}
}
class DuotaiDemo
{
public static void main(String[] args)
{
function( new Cat() );
// Animal a=new Cat(); ,
// Cat c=(Cat)a; ( , )
/*
,
Animal a=new Animal();
Cat c=(Cat)a;
, ,
*/
}
public static void function(Animal a)
{
a.eat();
// ,
if(a instanceof Cat) //a==Cat, , a , instanceof
{
Cat c=(Cat)a;
c.catchMouch();
// Animal a=new Cat();
// Cat c=(Cat)a
// c.catchMouch();
}
else if(a instanceof Dog)
{
Dog d=(Dog)a;
d.lookHome();
}
else if(a instanceof Pig)
{
Pig p=(Pig)a;
p.gongDi();
}
}
}
三:内部クラス及び匿名内部クラス
内部クラスのアクセスルール:1内部クラスは外部クラスのメンバーに直接アクセスすることができ、プライベートメンバーが外部クラスのメンバーに直接アクセスできるのは、内部クラスに外部クラスの引用があるためであり、フォーマット:外部クラス名.this②外部クラス内部クラスにアクセスするには、内部クラスオブジェクトを作成する必要があります
③外部の他のクラスで内部クラスにどのようにアクセスするか、アクセスフォーマット:外部クラス名.内部クラス名変数名=外部クラスオブジェクト.内部クラスオブジェクト、eg:Outer.Inner in=new Outer().new Inner();④内部クラスがメンバーの位置にある場合、privateが内部クラスを外部クラスにカプセル化してstatic内部クラスをカプセル化するようにメンバー修飾子で修飾することができる(この場合、静的内部クラスは外部クラスの静的メンバーにしかアクセスできない)
a:外部の他のクラスでstatic内部クラスの非静的メンバーに直接アクセスするにはどうすればいいですか. new Outer.Inner().function();b:外部の他のクラスでstatic内部クラスの静的メンバーに直接アクセスするにはどうすればいいですか. Outer.Inner.function();
注意:内部クラスに静的メンバーが定義されている場合、内部クラスはstaticでなければなりません.外部クラスの静的メンバーが内部クラスにアクセスする場合、内部クラスは静的でなければなりません.
class Outer
{
private int x=3;
class Inner
{
int x=4;
public void function()
{
int x=5;
// ,
System.out.println("innner_1="+x); // :5
System.out.println("innner_1="+this.x); // :4
System.out.println("innner_1="+Outer.this.x); // :3
}
}
void method()
{
// ,
Inner in=new Inner();
in.function();
}
}
class InnerClassDemo
{
public static void main(String[] args)
{
//
Outer.Inner in=new Outer().new Inner();
in.function(); // inner=3
}
}
内部クラス定義がローカルの場合①メンバー修飾子で修飾できない②外部クラスのメンバーに直接アクセスできる.外部クラスの参照を持っているがローカルの変数にアクセスできないため、finalで修飾されたローカル変数にのみアクセスできる
匿名内部クラス:①匿名内部クラスは実は内部クラスの略写フォーマットである②内部クラスを定義する前提:内部クラスは1つのクラスを継承するかインタフェースを実現しなければならない③匿名内部クラスのフォーマット:new親クラスまたはインタフェース(){サブクラスの内容を定義する;}④実は匿名の内部クラスは匿名のサブクラスのオブジェクトであり、しかもこのオブジェクトは少し太っているので、内容のあるオブジェクトと理解できる⑤匿名の内部クラスで定義する方法は3つを超えないほうがよい
abstract class AbsInner
{
abstract void show();
}
class Outer
{
private int x=3;
/*
class Inner extends AbsInner
{
void show()
{
System.out.println("x=="+x);
}
}
*/
public void function()
{
//new Inner().show(); ①
//AbsInner ai=new Inner(); ②
//ai.show();
AbsInner ai=new AbsInner() // " () "
{
void show()
{
System.out.println("x=="+x);
}
void show1()
{
System.out.println("hello");
}
}; // ②
ai.show();
//ai.show1();
/*
show1() , , ,
AbsInner show1()
*/
}
}
class InnerClassDemo3
{
public static void main(String[] args)
{
Outer out=new Outer();
out.function();
}
}
--------androidトレーニング、JAvaトレーニング、交流を楽しみにしています!--------