Javaの抽象、パッケージング、継承、マルチステート
15987 ワード
抽象クラス
abstractで修飾されたクラスを抽象クラスと呼ぶ.
オブジェクト指向領域では抽象的な概念は問題領域では対応する具体的な概念がないため,抽象的な概念を特徴付ける抽象クラスはインスタンス化できない.
同時に、抽象類はデータ抽象の思想を体現し、多態を実現するメカニズムである.抽象的な方法のセットを定義し、この抽象的な方法の具体的な表現形式については派生クラスが実現される.同時に抽象クラスは継承の概念を提供し、その出発点は継承のためであり、そうでなければ存在する意味がない.したがって,定義された抽象クラスは継承に用いられるに違いないが,抽象クラスをノードとする継承関係階層チェーンでは,葉ノードが具体的な実装クラスであるに違いない.
抽象クラスを使用する場合は、次の点に注意してください.
1、抽象クラスはインスタンス化できません.インスタンス化の作業はそのサブクラスに任せて完成しなければなりません.参照が1つあればいいです.
2、抽象的な方法はサブクラスで書き直さなければならない.
3、抽象メソッドの抽象クラスが含まれている限り、他のメソッドが含まれているかどうかにかかわらず、そのメソッドを抽象クラスとして定義する必要があります.
4、抽象クラスには具体的な方法を含んでもよいし、もちろん抽象的な方法を含まなくてもよい.
5、子クラスの抽象メソッドは、親クラスの抽象メソッドと同じ名前にすることはできません.
6、abstractはfinalと並んで同じクラスを修飾することはできません.
7、abstractはprivate、static、finalまたはnativeと並んで同じ方法を修飾することはできません.
抽象動物類Animalを定義し、cry()という抽象的な方法を提供し、猫も犬も動物類の子類であり、cry()は抽象的な方法であるためCat、Dogはcry()方法を実現しなければならない.次のようになります.
パッヶージ
物事の持つ属性や動作を隠し、特定の方法だけを外部と結びつける.
なぜカプセル化するのですか?
パッケージは対象設計の原則の第1条に合致します:単一性の原則、1つの類は自分のすべきことをパッケージして、
他の人に露出するのではなく
クラス#クラス#
内部の論理が変化する場合、外部呼び出しはそのために変更する必要はありません.
オープンインタフェースのみを呼び出し
内部に関心を持つ必要はありません
インプリメンテーション
abstractで修飾されたクラスを抽象クラスと呼ぶ.
オブジェクト指向領域では抽象的な概念は問題領域では対応する具体的な概念がないため,抽象的な概念を特徴付ける抽象クラスはインスタンス化できない.
同時に、抽象類はデータ抽象の思想を体現し、多態を実現するメカニズムである.抽象的な方法のセットを定義し、この抽象的な方法の具体的な表現形式については派生クラスが実現される.同時に抽象クラスは継承の概念を提供し、その出発点は継承のためであり、そうでなければ存在する意味がない.したがって,定義された抽象クラスは継承に用いられるに違いないが,抽象クラスをノードとする継承関係階層チェーンでは,葉ノードが具体的な実装クラスであるに違いない.
抽象クラスを使用する場合は、次の点に注意してください.
1、抽象クラスはインスタンス化できません.インスタンス化の作業はそのサブクラスに任せて完成しなければなりません.参照が1つあればいいです.
2、抽象的な方法はサブクラスで書き直さなければならない.
3、抽象メソッドの抽象クラスが含まれている限り、他のメソッドが含まれているかどうかにかかわらず、そのメソッドを抽象クラスとして定義する必要があります.
4、抽象クラスには具体的な方法を含んでもよいし、もちろん抽象的な方法を含まなくてもよい.
5、子クラスの抽象メソッドは、親クラスの抽象メソッドと同じ名前にすることはできません.
6、abstractはfinalと並んで同じクラスを修飾することはできません.
7、abstractはprivate、static、finalまたはnativeと並んで同じ方法を修飾することはできません.
抽象動物類Animalを定義し、cry()という抽象的な方法を提供し、猫も犬も動物類の子類であり、cry()は抽象的な方法であるためCat、Dogはcry()方法を実現しなければならない.次のようになります.
package test;
public abstract class Animal {
public abstract void cry();
public void say(){
}
}
package test;
public class Cat extends Animal{
@Override
public void cry() {
System.out.println(" 。。。");
}
}
package test;
public class Dog extends Animal{
@Override
public void cry() {
System.out.println(" 。。。");
}
}
パッヶージ
物事の持つ属性や動作を隠し、特定の方法だけを外部と結びつける.
なぜカプセル化するのですか?
パッケージは対象設計の原則の第1条に合致します:単一性の原則、1つの類は自分のすべきことをパッケージして、
他の人に露出するのではなく
クラス#クラス#
内部の論理が変化する場合、外部呼び出しはそのために変更する必要はありません.
オープンインタフェースのみを呼び出し
内部に関心を持つ必要はありません
インプリメンテーション
public class Human
{
private int age;
private String name;
public int getAge()
{
return age;
}
public void setAge( int age ) throws Exception
{
// age ,
if( age > 120 )
{
throw new Exception( "Invalid value of age" );
}
this.age = age;
}
public String getName()
{
return name;
}
public void setName( String name )
{
this.name = name;
}
}
Java :
- : class ,
- : abstract class ,
- : inerface ,
:
- extends: 、 ( ), extends , implements ( )
- extends: , ( 、 、 ), implements ( 、 、 )
- extends
:
- private
- ,
- , ,
:
- , super()
- ,
- , super()
, , , , 。 , Human, Programmer。
public class Human
{
// ,
public Human(String name)
{
}
}
public class Programmer
extends Human
{
public Programmer()
{
// ,
//Implicit super constructor Human() is undefined. Must explicitly invoke another constructor
super( "x" );
}
}
:
- , , , Java
, / :
- : public、static+ + + +throw 5
- ,
- , , , ,
:
- ( ) , , 、
- 、 、throw , 2 , ,
//
public class Programmer
extends Human
{
public void coding() throws Exception
{
}
public void coding( String langType )
{
}
public String coding( String langType, String project )
{
return "";
}
}
// , ,
public class Programmer
extends Human
{
public void coding() throws Exception
{
}
public void coding()
{
}
public String coding()
{
return "";
}
}
/ :
-
- , , , 、 、
public class Human
{
public void coding( String langType )
{
}
}
public class Programmer
extends Human
{
// /
public void coding( String langType )
{
}
//
public void coding( String langType, String project )
{
}
}
/ :
- private ,private , private ,
- (public > protected > default > private)
- , throws
- ,
- ,
, :
- “ , ” , ,
- : ( ) ( ), ,
- 、
:
class Human
{
public void showName()
{
System.out.println( "I am Human" );
}
}
//
class Doctor
extends Human
{
//
public void showName()
{
System.out.println( "I am Doctor" );
}
}
class Programmer
extends Human
{
public void showName()
{
System.out.println( "I am Programmer" );
}
}
public class Test
{
//
public Human humanFactory( String humanType )
{
if( "doctor".equals( humanType ) )
{
return new Doctor();
}
if( "programmer".equals( humanType ) )
{
return new Programmer();
}
return new Human();
}
public static void main( String args[] )
{
Test test = new Test();
Human human = test.humanFactory( "doctor" );
human.showName();//Output:I am Doctor
human = test.humanFactory( "programmer" );
human.showName();//Output:I am Programmer
// , ,
}
}
:
- , ,
:
- , , , , , :this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)
:
class Human {
public void fun1() {
System.out.println("Human fun1");
fun2();
}
public void fun2() {
System.out.println("Human fun2");
}
}
class Programmer extends Human {
public void fun1(String name) {
System.out.println("Programmer's fun1");
}
public void fun2() {
System.out.println("Programmer's fun2");
}
}
public class Test {
public static void main(String[] args) {
Human human = new Programmer();
human.fun1();
}
/*
* Output:
* Human fun1
* Programmer's fun2
*/
}
- Programmer fun1(String name) Human fun1(), ,
- Programmer fun2() Human fun2() , Programmer Human fun2()
- Programmer Human ,human.fun1() fun1() , fun1(String name)
- human fun1() fun2() , Programmer , Programmer fun2()
package test;
class A {
public void func() {
System.out.println("func in A");
}
}
class B extends A {
public void func() {
System.out.println("func in B");
}
}
class C extends B {
public void func() {
System.out.println("func in B");
}
}
public class Bar {
public void test(A a) {
a.func();
System.out.println("test A in Bar");
}
public void test(C c) {
c.func();
System.out.println("test C in Bar");
}
public static void main(String[] args) {
Bar bar = new Bar();
A a = new A();
B b = new B();
C c = new C();
bar.test(a);
bar.test(b);
bar.test(c);
/*
func in A
test A in Bar
func in B
test A in Bar
func in B
test C in Bar
*/
}
}