调用类的方法而不创建它的对象

class A{ String z(){ System.out.println("a"); return "sauarbh"; } } class B{ A a; A x(){ return a; } } public class runner { public static void main(String[] args) { B b = new B(); A a2=bx(); a2.z(); // Calling A class method without creating object of it } } 

另一个例子

 class Person { private String lastName; private String firstName; private int age; //-------------------------------------------------------------- public Person(String last, String first, int a) { // constructor lastName = last; firstName = first; age = a; } //-------------------------------------------------------------- public void displayPerson() { System.out.print(" Last name: " + lastName); System.out.print(", First name: " + firstName); System.out.println(", Age: " + age); } //-------------------------------------------------------------- public String getLast() // get last name { return lastName; } } // end class Person //////////////////////////////////////////////////////////////// class ClassDataArray { private Person[] a; // reference to array private int nElems; // number of data items public ClassDataArray(int max) // constructor { a = new Person[max]; // create the array nElems = 0; // no items yet } //-------------------------------------------------------------- public Person find(String searchName) { // find specified value int j; for(j=0; j<nElems; j++) // for each element, if( a[j].getLast().equals(searchName) ) // found item? break; // exit loop before end if(j == nElems) // gone to end? return null; // yes, can't find it else return a[j]; // no, found it } // end find() //-------------------------------------------------------------- // put person into array public void insert(String last, String first, int age) { a[nElems] = new Person(last, first, age); nElems++; // increment size } //-------------------------------------------------------------- public boolean delete(String searchName) { // delete person from array int j; for(j=0; j<nElems; j++) // look for it if( a[j].getLast().equals(searchName) ) break; if(j==nElems) // can't find it return false; else // found it { for(int k=j; k<nElems; k++) // shift down a[k] = a[k+1]; nElems--; // decrement size return true; } } // end delete() //-------------------------------------------------------------- public void displayA() // displays array contents { for(int j=0; j<nElems; j++) // for each element, a[j].displayPerson(); // display it } //-------------------------------------------------------------- } // end class ClassDataArray //////////////////////////////////////////////////////////////// class ClassDataApp { public static void main(String[] args) { int maxSize = 100; // array size ClassDataArray arr; // reference to array arr = new ClassDataArray(maxSize); // create the array // insert 10 items arr.insert("Evans", "Patty", 24); arr.insert("Smith", "Lorraine", 37); arr.insert("Yee", "Tom", 43); arr.insert("Adams", "Henry", 63); arr.insert("Hashimoto", "Sato", 21); arr.insert("Stimson", "Henry", 29); arr.insert("Velasquez", "Jose", 72); arr.insert("Lamarque", "Henry", 54); arr.insert("Vang", "Minh", 22); arr.insert("Creswell", "Lucinda", 18); arr.displayA(); // display items String searchKey = "Stimson"; // search for item Person found; found=arr.find(searchKey); if(found != null) { System.out.print("Found "); found.displayPerson(); } else System.out.println("Can't find " + searchKey); System.out.println("Deleting Smith, Yee, and Creswell"); arr.delete("Smith"); // delete 3 items arr.delete("Yee"); arr.delete("Creswell"); arr.displayA(); // display items again } // end main() } // end class ClassDataApp 

在上面的代码中,我调用类A的z()方法,引用a2而不创建类A的对象,因为我是java的新手,我想知道在显示的代码中java中的这个概念是什么? 现在我只知道如果我们想要在不创建对象的情况下调用方法,我们必须将该方法设置为静态。

在使用person引用的第二个示例中,我们可以调用displayPerson()方法而不使用空指针exception

致电:

 String z(){ System.out.println("a"); return "sauarbh"; } 

如果没有类A的对象,方法z必须是静态的:

 static String z(){ System.out.println("a"); return "sauarbh"; } 

因此,请按以下方式更改代码:

 class A{ static String z(){ System.out.println("a"); return "sauarbh"; } } class B{ A a; A x(){ return a; } } public class runner { public static void main(String[] args) { B b = new B(); bx(); Az(); } } 

输出:

 a 

B类方法x()不返回A的新对象。而是返回具有空值的A类对象。

 A a; // value of a is null A x() { return a; } 

在跑步者class

 A a2=bx(); // bx() will return a, which is null. so A a2=null a2.z(); // Equivalent to null.z() throws NullPointerException 

Class B代码中进行以下更改:

 class B{ A a; A x(){ return new A();// return new object of Class A; } } 

要么

 class B{ A a= new A(); // Initialize Class A with new object A x(){ return a; } } 

是,如果要调用方法,则不实例化该类,应使用static关键字。

你在这里做什么?

你是间接尝试获取A实例。 但是这种情况下你会得到NullPointerException因为你只返回A的引用(变量)

 B b = new B(); A a2=bx(); a2.z(); // NullPointerException from here 

NPE?

 class B{ A a; A x(){ return a; // you just return the reference // it should be return new A(); } } 

为了您的编辑:

看一下insert()方法。 它正在创建Person实例。