我在哪里可以使用实例方法,在哪里使用类方法?
我知道类和实例方法的术语。
答案 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 - 是静态的,处理与所有对象有关的特定主题