繁体   English   中英

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

[英]Where can i use class methods and instance methods in java

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

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

静态方法是类级别的方法,它们适用于实用程序方法,例如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());
    }
  }

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

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

为什么和何时的简单答案是“何时有意义”。如果方法需要在类中而不是与对象绑定,那么它就有意义。如果方法在逻辑上是对象的一部分,则它不应该

Main是静态的,因为Sun的某个人认为JVM可以不先创建对象就调用main会更好。 它可能简化了JVM的设计。

i

我可以添加以下参考:

约书亚·布洛赫(Joshua Bloch)的“有效Java”节选

或作为打印:

有效的Java(第2版)[平装本]

这本书真的很棒,任何想编写更好代码的人都应该至少略读一下^^

cu

这是Java教程的链接,该教程具有很好的概述,并提供示例和代码:

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

您不能使用继承(多态性)覆盖静态方法-您只能对其进行阴影处理。 在OOD中,阴影遮盖是反专利的。

静态方法不应成为面向对象设计的一部分-只能将其用作技术助手。

科特迪瓦·霍顿(Ivor Horton)的著作《 Sphere课堂》就是一个很好的例子。 他将getCount()定义为类方法,因为它使您能够计算已创建的Sphere数,即使没有Sphere对象也返回0。另一方面, volume()是实例方法,因为它会计算特定球体的体积,并且每个Sphere实例的体积都不同。

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());
   }
}

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

如果您有一个代表某个人的课程,则所有人可能共享相同的属性,但是他们的特定属性会有所不同。 因此,每个人都有一个身高,但有些人矮一些而另一些高一些。 要代表一个人,您需要一个特定的实例,说“我的名字叫鲍勃,身高2m”,或者“我的名字叫萨莉,身高1.9m”。 您对人的代表取决于具体情况。

但是,有些东西可以通用地表示。 例如,将一个数字加到另一个数字将始终得到相同的结果,因此不需要很多表示。 因此,Math类具有静态方法。

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

由于我本人正在学习Java,因此我给出了一个简短的解释,但是我用简单的语言理解的是-

实例方法-动态的,可以与问题类实例中对象的全部目标或目的一起工作-静态,可以处理与所有对象有关的特定主题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM