[英]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的设计。
这是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.