我在哪里可以使用java中的类方法和实例方法

时间:2012-03-16 13:36:04

标签: java oop

我在哪里可以使用实例方法,在哪里使用类方法?

我知道类和实例方法的术语。

8 个答案:

答案 0 :(得分:5)

静态方法是类级方法,它们适用于Java中的Math类的实用方法。这些类通常需要一些输入,并提供所需的输出(例如Math.pow(4,5))。

实例方法相当适用于整个对象。好的例子几乎是任何类的Java。还是,例如; FileInputStream,其中read()方法从底层流中读取数据。

静态方法的例子是

class Math(){
public static long multiply(long a, long b){
   return a*b;
}
public static void main(String[]args){
  System.out.println(Math.multiply());
}
}

实例方法的示例可以是

class User(){
private String pass;
private String uname;

    public User(String p,String u){
      pass=p;
      uname=u;
    }
    public boolean authenticate(){
      if("secret".equals(this.pass) && "Grrrr".equals(this.uname){
         return true;
      }else{
         return false;
      }
    }
    public static void main(String[]args){
     User u = new User("wrong secret","grrr");
     System.out.println(u.authenticate());
    }
  }

在第二个例子中,要注意这样一个事实:要使用实例方法,我们必须先创建一个对象,然后才调用该方法。

答案 1 :(得分:3)

静态方法在概念上与静态变量相同,因此使用或不使用它们的原因是相似的。它们属于类,而不属于该类的特定对象。 java API的一个例子是Math,所有变量都是静态的。为了调用单个方法而必须创建Math对象是否有意义?除了方法执行某些数学运算的事实之外,它们之间几乎没有关系。换句话说,没有将数学方法联系在一起的逻辑实例变量。顺便说一句,你不能实例化数学,所以不要浪费时间尝试。

一个简单的答案,为什么以及什么时候“只要它有意义”。如果一个方法需要在一个类中,但没有绑定到一个对象,那么它是有意义的。如果该方法在逻辑上是一个对象的一部分,那不应该是

Main是静态的,因为Sun的某个人认为如果JVM可以在不首先创建对象的情况下调用main更好。它可能简化了JVM的设计。

答案 2 :(得分:2)

海,

我可以添加以下参考:

Excerpt of Joshua Bloch's "Effective Java"

或打印:

Effective Java (2nd Edition) [Paperback]

这本书真的很棒,任何想要编写更好代码的人都应该至少浏览它^^

答案 3 :(得分:1)

以下是Java教程的链接,该教程具有良好的概述,包含示例和代码:

答案 4 :(得分:1)

静态方法适用于实用程序类和创建单例。基本上90%你会避免使用静态方法。

您不能使用继承(多态)覆盖静态方法 - 您只能隐藏它。在OOD中,暗影是反人格的。

静态方法不应该是面向对象设计的一部分 - 仅将它们用作技术助手。

答案 5 :(得分:1)

Ivor Horton在他的book中有一个很好的例子,有一个Sphere类。他将getCount()定义为一个类方法,因为它使您能够计算您创建的球体数量,即使没有Sphere对象它返回0.另一方面,volume()是实例方法,因为它计算特定球体的体积,并且每个球体实例都有不同的体积。

public class Sphere {
   static final double PI = 3.14; // Class variable that has a fixed value
   static int count = 0; // Class variable to count objects
   // Instance variables
   double radius; // Radius of a sphere
   double xCenter; // 3D coordinates
   double yCenter; // of the center
   double zCenter; // of a sphere

   // Class constructor
   public Sphere(double theRadius, double x, double y, double z) {
      radius = theRadius; // Set the radius
      // Set the coordinates of the center
      xCenter = x;
      yCenter = y;
      zCenter = z;
      ++count; // Update object count
   }

   // Static method to report the number of objects created
   public static int getCount() {
      return count; // Return current object count
   }

   // Instance method to calculate volume
   public double volume() {
      return 4.0/3.0*PI*radius*radius*radius;
   }
}

尝试使用此课程:

public class CreateSpheres {
   public static void main(String[] args) {
      System.out.println(“Number of objects = “ + Sphere.getCount());
      Sphere ball = new Sphere(4.0, 0.0, 0.0, 0.0); // Create a sphere
      System.out.println(“Number of objects = “ + ball.getCount());
      Sphere globe = new Sphere(12.0, 1.0, 1.0, 1.0); // Create a sphere
      System.out.println(“Number of objects = “ + Sphere.getCount());
      // Output the volume of each sphere
      System.out.println(“ball volume = “ + ball.volume());
      System.out.println(“globe volume = “ + globe.volume());
   }
}

答案 6 :(得分:1)

这是关于理解表示及其用途。

如果您有一个代表一个人的班级,所有人可能会共享相同的属性,但他们的特定属性会有所不同。所以每个人都有一个高度,但有些人更矮,有些人更高。要代表一个人,你需要一个特定的例子,上面写着“我的名字是鲍勃,我身高2米”,或者“我的名字真的是我身高1.9米”。您对某人的陈述取决于具体情况。

然而,有些事情可以普遍表现出来。例如,将一个数字添加到另一个数字将始终产生相同的结果,因此不需要许多表示。因此Math类具有静态方法。

在实践中,使用Java,jvm将加载一个类并将其用作创建实例的“蓝图”(所有人将共享相同的属性,即使它们的实际值不同),或者作为通用定义(对于静态宣称的东西)。对于静态方法,您应该警惕同步(它有助于理解堆/堆栈)以及潜在的瓶颈。在分布式应用程序中,通用定义可以加载多次(每个jvm)。

答案 7 :(得分:0)

我正在简要解释,因为我自己正在学习java,但我用简单的语言理解的是 -

实例方法 - 动态,与所讨论对象的整个目标或目的一起工作 class instances - 是静态的,处理与所有对象有关的特定主题