静态方法和实例方法的区别主要体现在两个方面:
在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
下面几个例子展示了这一区别。
1、调用静态方法示例。
//-----------文件名hasStaticMethod.java,程序编号1-----------------public class hasStaticMethod{//定义一个静态方法public static void callMe(){System.out.println("This is a static method.");}}
下面这个程序使用两种形式来调用静态方法。
//-----------文件名invokeStaticMethod.java,2-----------------public class invokeStaticMethod{public static void main(String args[]){hasStaticMethod.callMe(); //不创建对象,直接调用静态方法 hasStaticMethod oa = new hasStaticMethod(); //创建一个对象oa.callMe(); //利用对象来调用静态方法}}
程序3.36两次调用静态方法,都是允许的,程序的输出如下:
This is a static method.This is a static method.
允许不创建对象而调用静态方法,是Java为了减少程序员调用某些常用方法时的麻烦,而允许程序员按照传统的C语言中使用函数的方式来使用方法。典型的例子是前面某些程序中使用"Math.ramdon()"来获取随机数。
2、静态方法访问成员变量示例。
//-----------文件名accessMember.java,程序编号3.37-----------------class accessMember{private static int sa; //定义一个静态成员变量private int ia; //定义一个实例成员变量//下面定义一个静态方法static void statMethod(){int i = 0; //正确,可以有自己的局部变量sa = 10; //正确,静态方法可以使用静态变量otherStat(); //正确,可以调用静态方法ia = 20; //错误,不能使用实例变量insMethod(); //错误,不能调用实例方法}static void otherStat(){} //下面定义一个实例方法 void insMethod(){int i = 0; //正确,可以有自己的局部变量sa = 15; //正确,可以使用静态变量ia = 30; //正确,可以使用实例变量statMethod(); //正确,可以调用静态方法}}
本例其实可以概括成一句话:静态方法只能访问静态成员,实例方法可以访问静态和实例成员。之所以不允许静态方法访问实例成员变量,是因为实例成员变量是属于某个对象的,而静态方法在执行时,并不一定存在对象。同样,因为实例方法可以访问实例成员变量,如果允许静态方法调用实例方法,将间接地允许它使用实例成员变量,所以它也不能调用实例方法。基于同样的道理,静态方法中也不能使用关键字this。
main()方法是一个典型的静态方法,它同样遵循一般静态方法的规则,所以它可以由系统在创建对象之前就调用。
静态方法与静态变量一样,属于类本身,而不属于那个类的一个对象。
调用一个被定义为static的方法,可以通过在它前面加上这个类的名称,也可以像调用非静态方法一样通过类对象调用。实例方法必须通过类的实例来使用。
实例方法可以使用类的非静态成员,也可以使用类的静态成员。类的静态方法,静态变量是在类装载的时候装载的。
但是要特别注意,类的静态变量是该类的对象所共有的,即是所有对象共享变量。所以建议尽量少用静态变量。
尽量在静态方法中使用内部变量。 其中static关键字即表示静态的。
声明静态方法的语法如下:static返回类型 方法名(参数列表){//方法体} 静态方法与实例方法唯一不同的,就是静态方法在返回类型前加static关键字。静态方法的调用有两种途径:(1)通过类的实例对象去调用调用格式为: 对象名.方法名(2) 通过类名直接调用调用格式为: 类名::方法名 我们在使用时要注意:静态方法只能访问类的静态成员,不能访问类的非静态成员;非静态方法可以访问类的静态成员,也可以访问类的非静态成员;静态方法既可以用实例来调用,也可以用类名来调用。
#include using namespace std;class CStaticTest{ public: CStaticTest(int a) { this->a = a; } ~CStaticTest(){}static int add(CStaticTest& c1, CStaticTest& c2) { return c1.a + c2.a; }private: int a; };int main() { CStaticTest tmp1(1); CStaticTest tmp2(2); int sum1 = tmp1.add(tmp1, tmp2); int sum2 = CStaticTest::add(tmp1, tmp2);cout << sum1 << endl; cout << sum2 << endl; return 0; } 1. 有静态属性的类,一般会定义静态方法。2. 没有属性的类,一般会定义静态方法,这样在使用时,通过类名::方法名即可调用,而不用先定义对象,再调用,这样可以省去一行代码。
编程时我们心里一定要清楚静态方法和类的非静态方法方法的区别:
最根本区别从编译角度来说吧:
1)静态(static)方法是编译时直接加载加载到内存中(离cpu最近的一块内存区域也称为堆栈),比如程序的public static main(args []){}方法,你能实例话吗?
静态方法不能被实例化,也不允许被实例化!
现在很多Java集成工具边写边编译的
因此 你可以通过“类名”+“.”+“静态方法的名()”来调用
2)非静态方法(类的非静态方法)通过关键字 “new” 字来实例化一个对象(object),这个对象放在 内存的另一块区域 堆(heap)中。
也就是说编译时,非静态方法必须先实例化类的一个对象,通过“对象名”+“非静态方法名()”来调用;
public class Student
{
private String name;
/************************************************************
*下面两个方法是类的非静态方法封装 属性name,看一下在 main()
*如何调用
************************************************************/
public set(string init_name)
{
this.name = init_name;
}
publc String get()
{
return this.name;
}
//构造函数
public Student(){}
public Student(String init_name)
{
this.name = init_name;
}
//下面是一个静态方法,看一下它在main()中如何调用
public static void PrintClassName()
{
System.out.print("该类的名字:Student");
}
}
//MainClass类
pubic class MainClass
{
public static void main(args[])
{
//先调用静态方法,不需要实例化对象
Student.PrintClassName();
//现在调用非静态方法,一定要实例化对象
Student stu1 = new Student();
stu1.set("Join");
String stu1_name = stu1.get();
}
}
静态方法是使用公共内存空间的,就是说所有对象都可以直接引用,不需要创建对象再使用该方法。
例如,我创建一个类,里面有一个静态方法:
class Test{
public static int z(int xx,int yy){
return xx+yy;
}
public int zz(int xx,int yy){
return xx+yy;
}
}
然后在含有main方法的类中使用这个类时,对与以上非静态和静态方法的引用方式是不同的,如下:
import Test;
public class mainClass{
int sum;
public static void main(String args[]){
sum=Test.z(1,2); //直接用 类.方法或者属性就可以使用该方法或属性。
System.out.println(sum);
Test t=new Test();
sum=t.zz(1,2); //因为zz不是静态方法,所以只能只能用Test类创建一个t对象,然后调用该对象的方法。
System.out.println(sum);
}
}
ls他们说的也是有道理的,静态方法只能被静态方法调用。
静态方法是类的公共方法,即每个对象共有的方法,一般情况下我们习惯通过类名.方法名来调用,但是也可以用某个实例对象来访问。
例如:public class Test{
public static void getStaticTest(){
//////
}
}
第一种:我们通过Test.getStaticTest()来调用
第二种:Test t = new Test();t.getStaticTest()来调用
第二种的调用方式一般不推荐!首先是静态方法不需要实例化对象,实例化之后再调用会造成内存空间的浪费。其次,会让阅读代码的人产生误解,以为此方法为非静态的方法。
静态方法何时使用
如果某些操作不依赖具体实例,那它就是静态的,反之如果某些操作是依赖具体实例的(例如访问一个特定会员的名称),那它就应该是实例化的。
静态方法不用new对象可以直接调用
1.与类相关与对象无关
2.不需要对象的“轻”方法
3.工厂方法
如果某个方法是用频率较高,或者方法本身通用性较强,无需初始化类成员变量,则可以使用静态方法,那样方便,速度也快.
可以直接拿来就用的方法,就算是静态的.
肯定不涉及具体对象,因为静态方法内,是无法直接使用任何非静态成员的。
(1)制作工具类
(2)可以当作"作局"对象或方法来使用
静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。
静态方法不用创建实例就可调用,比较简单从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象 反之使用静态方法
不需要生成对象的
经常频繁使用的
工具类里的(如SqlHelper)
适当地使用static方法本身并没有什么,当一个人从来不懂使用多态、接口设计时,很自然地会滥用static方法。
个人理解在多个类中需要调用并且是与对象无关的方法可设为静态方法,方便调用。
所有对象共有的方法
再不关系到任何于特定对象相关的操作
比如学生的年龄就是学生的相关。
修改学生的年龄就不适合用静态方法。
一般来说,如果你的方法里没有用到this关键字,
那就适合用静态方法
通常通用的类中一些常用的方法可以设计为静态类
只要是没有用到类的状态信息,只从参数获取信息的都可以为静态的
可以实现某些特殊的设计模式:如Singleton
由于没有this指针,可以把某些系统API的回调函数以静态函数的形式封装到类的内部
可以封装某些算法,比如数学函数,如ln,sin,tan等等,这些函数本就没必要属于任何一个对象,所以从类上调用感觉更好
总之,从OOA/OOD的角度考虑,一切不需要实例化就可以有确定行为方式的函数都应该设计成静态的
静态方法与非静态方法最明显的区别就是如果某个方法是公共静态的,那么可以直接通过类名.方法名的方法来调用,而公共实例方法则需要事先实例化对象,然后才能调用。
这些各种说法,基本上都是正确的。
静态变量
可以将静态变量理解为类变量(与对象无关),而实例变量则属于一个特定的对象。
静态变量有两种情况:
静态变量是基本数据类型,这种情况下在类的外部不必创建该类的实例就可以直接使用
静态变量是一个引用。这种情况比较特殊,主要问题是由于静态变量是一个对象的引用,那么必须初始化这个对象之后才能将引用指向它。因此如果要把一个引用定义成static的,就必须在定义的时候就对其对象进行初始化。
静态方法
与类变量不同,方法(静态方法与实例方法)在内存中只有一份,无论该类有多少个实例,都共用一个方法。
静态方法与实例方法的不同主要有:
静态方法可以直接使用,而实例方法必须在类实例化之后通过对象来调用。
在外部调用静态方法时,可以使用“类名.方法名”或者“对象名.方法名”的形式。实例方法只能使用后面这种方式。
静态方法只允许访问静态成员。而实例方法中可以访问静态成员和实例成员。
静态方法中不能使用this(因为this是与实例相关的)。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:2.647秒