我们先来解决这样一个简单的需求:
创建一个类,实现求两数之和的功能
则我们可以创建如下使用普通方法完成功能的类:
class MyTools{ public double calSum(double n1,double n2){ return n1+n2; } }
下面只需再主函数中创建类对象并且调用calSum函数即可完成需求
但是,这样的处理方式也存在一个问题:即当我们想要完成求和的功能时,就至少要创建一个对象,而实际上我们执行这个方式其实并不需要涉及任何和对象相关的成员,这就造成了我们空间的浪费,使得开发效率低下,为了解决这类问题,我们就可以使用类(静态)方法来解决问题
类方法也叫静态方法,在类加载时就已初始化,因此可以直接通过类名.类方法名来调用,无需创建对象,这也是其区别于普通方法的一个特点,借助这一特点,我们可以创建一些包含类方法的工具类来帮助我们提高开发效率,如本例中的求和需求中出现的问题就可通过将calSum方法改成类方法来解决,代码如下:
class MyTools{ public static double calSum(double n1,double n2){ return n1+n2; } }
类方法定义形式如下:
1.访问修饰符 static 数据返回类型 方法名(){ } 【常用】
2. static 访问修饰符 数据返回类型 方法名(){ }
1.类名.方法名()
我们使用类方法的目的就是减少因为创建对象而浪费的空间,因此,我们更多会去使用类名.方法名()的调用方式
2.对象名.方法名()
1.类方法和普通方法都是随着类的加载而加载,将结构信息存储在方法区
类方法无this的参数
普通方法中隐含this的参数
2.类方法可以通过类名调用,也可以通过对象名调用(更多推荐用类名调用)
3.普通方法和对象有关,需要通过对象名调用,不能通过类名调用
4.类方法中不允许使用和对象有关的关键字,比如this和super(因为this和super会不知道该指向哪个对象),而普通方法可以
5.类方法(静态方法)中只能访问静态变量和静态方法
6.普通方法既可以访问普通变量,也可以访问静态变量
5和6总结:静态方法只能访问静态的成员,非静态的方法,可以访问静态成员和非静态成员
下面通过案例来一一说明:
public class StaticMethod { public static void main(String[] args) { Student tom = new Student("tom"); Student mary = new Student("mary"); //3.普通方法和对象有关,需要通过对象名调用,不能通过类名调用 tom.payFee02(100); mary.payFee02(200); //2.类方法可以通过类名调用,也可以通过对象名调用(更多推荐用类名调用) Student.showFee(); mary.showFee();//不推荐 } } class Student{ private String name; private static double fee=0; public Student(String name) { this.name = name; } //4.类方法中不允许使用和对象有关的关键字,比如this和super(因为this和super会不知道该指向哪个对象),而普通方法可以 public static void payFee01(double fee){ //this.fee+=fee;//只演示this Student.fee+=fee; } public void payFee02(double fee){ this.fee+=fee; } public static void showFee(){ System.out.println("总学费为:"+Student.fee); } public static void visit01(){ //5.类方法(静态方法)中只能访问静态变量和静态方法 fee=100.0;//没问题 showFee();//没问题 // name="张三";//不行 // payFee02();//不行 } public void visit02(){ //6.普通方法既可以访问普通变量,也可以访问静态变量 fee=100.0;//没问题 showFee();//没问题 name="张三";//没问题 payFee02(100.0);//没问题 } }