呼び出しオブジェクトがオブジェクトを渡す必要があるかどうか(初心者はこの問題に注意してください)



 
クラスとオブジェクトの简単な复习、プロジェクトをする过程の中で时にはどのようにクラスの作成したオブジェクトを呼び出すことを知らないで、简単ないくつかのクラスははっきり见ることができて、普通はプロジェクトの中で10数のクラスを作成してよくどのように见ることを知りません
 
後ではっきり見えるように、クラスとオブジェクトの作成、オブジェクトの呼び出しと伝達(前に書いた)を振り返ってみましょう.
 
クラスとオブジェクトの基本概念:
 
JAVAの中で万事万物はすべてクラスがフィールド(属性)があるので、方法、入れ子のクラスと入れ子のインタフェースはその他のクラスあるいはインタフェースの中で宣言する内部の宣言のクラスとインタフェースです
 
  a,クラスの修飾子 ;public private  protected  デフォルト
  
  b,フィールド:final最後の可変,修飾方法,属性,
  
  static:静的フィールド:呼び出すときにオブジェクトを作成する必要はなく、クラス名でメソッドを直接呼び出す
  ,静的フィールドは共有されており、1つの変更がすべて変更される限り、静的フィールドはmainメソッドで使用できません.
  
 //静的フィールド、直接クラス名で呼び出す
 
 public  class Demo{
   public static void main(String[] args){
     Demo.init();
   }
   public static void init(){
   System.out.println("        ");
   }
  }

 
  
 //静的フィールドはmainメソッドでは使用できません
  
  
  
  
       非静的フィールド:
 
 
  クラスの初期化:
    クラスは単純な初期化に加えて、newでオブジェクトを参照するための文ブロックであるコンストラクタを含むこともできます.
    戻る前にオブジェクトを初期化し、
   
 class demo{
     public int count;
     private static long nextID = 1;
     demo(){
       count  = nextID ++;
     }
    }

 
  
   イニシャルブロック
      class demo{
     public int count;
     private static long nextID = 1;
     {
       count  = nextID ++;
     }
    }


 
    
    
  静的初期化:
  
     
class demo{
     public int count;
     private static long nextID = 1;
     static{
       count  = nextID ++;
     }
    }

 
    
    
    メソッド異常と戻り;
     メソッドを呼び出すと、呼び出されたメソッドから呼び出されたメソッドに制御フローが入力され、呼び出された文はその意味順に実行されます.
     ,次の3つのリクエストに遭遇すると、メソッドは実行を終了し、呼び出し元に戻ります.return文を実行し、メソッドの最後に達します.
     キャプチャされた例外として放出
     
     
   
   オブジェクトAに作成 AA   a = new AA()   ,B類はA類の中のaを必要として、直接AAを a;Bクラスの属性に設定すればいいですか?次のコードを見てください.
 
package     ;
/**
 * 
 * @author Administrator
 *     this   
 */
public class Animal {
int legs;
String name;
//       
Animal(){
this(" ",4);  //  this  Animal(String , int)    ;
System.out.println("           ");
}
//       
Animal(String name){
this(name,4);  //  this  Animal(String , int)    ;
System.out.println("          ");
}
//       
Animal(String name,int legs){
this.name = name;
this.legs = legs;
System.out.println("           ");
}
void play(){
System.out.println(name +" " + legs + "  ");
}
}

 //
しゅほうしき スレッドの開始
package     ;

public class AnimalTest {
//   
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal dog = new Animal();

Animal cat = new Animal();
Animaldemo de = new Animaldemo();
de.start();
}

}

 
//スレッドクラス、スレッドにパラメータが渡されていません.
package     ;
//   
public class Animaldemo extends Thread {

private Animal dog;
private Animal cat;
private boolean islive = true;

@Override
public void run() {
try {
while (islive) {
                 dog.play();
                 cat.play();
}
} catch (Exception e) {
islive = false;
e.printStackTrace();
}
}

}

 
//    ;
           
           
           
           
java.lang.NullPointerException
at     .Animaldemo.run(Animaldemo.java:22)

  :       main        ,                         
         null;               

 
解決策は2つあります.
1つ目は、スレッドを作成するときにオブジェクトをスレッドに渡し、スレッドがコンストラクション関数を起動することで受信します.
 1,スレッド作成時にパラメータを渡す
package     ;

public class AnimalTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
Animal dog = new Animal();
Animal cat = new Animal();
Animaldemo de = new Animaldemo(dog, cat);

de.start();
}

}

 
package     ;
//   
public class Animaldemo extends Thread{
//      
private Animal dog;
private Animal cat;
public Animaldemo(Animal dog,Animal cat){
this.dog = dog;
this.cat = cat;
}
private boolean islive = true;

@Override
public void run() {
try {
while (islive) {
                 dog.play();
                 cat.play();
}
} catch (Exception e) {
islive = false;
e.printStackTrace();
}
}

}

    ;
           
           
           
           
  4  
  4  
  4  
  4  
.......

 
 
2つ目:オブジェクトがスレッドに直接作成されます.
//主関数
package     ;

public class AnimalTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
Animaldemo de = new Animaldemo();
de.start();
}

}


 
//
package     ;
//   
public class Animaldemo extends Thread {
//        
Animal dog = new Animal();
    Animal cat = new Animal();
private boolean islive = true;

@Override
public void run() {
try {
while (islive) {
                 dog.play();
                 cat.play();
}
} catch (Exception e) {
islive = false;
e.printStackTrace();
}
}

}

 
 
実行結果:
2つのパラメータを必要とするコンストラクション関数
パラメータなしの構築方法
2つのパラメータを必要とするコンストラクション関数
パラメータなしの構築方法
犬は足が4本ある
犬は足が4本ある
犬は足が4本ある
犬は足が4本ある
.......