-
2021-03-05 22:58:12
首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在建立对象的时候,即new 操做的时候才初始化的;函数
前后顺序是先加载,才能初始化,那么加载的时候初始化static的成员,此时非static的成员尚未被加载必然不能使用,而非static的成员是在类加载以后,经过new操做符建立对象的时候初始化,此时static 已经分配内存空间,因此能够访问!this
简单点说:静态成员属于类,不须要生成对象就存在了.而非静态须要生成对象才产生.因此静态成员不能直接访问非静态. spa
下面说说静态的特色:code
1.随着类的加载而加载对象
也就是,说静态会随着类的消失而消失,说明静态的生命周期最长
2.优先于对象的存在
明确一点:静态是先存在的对象是后存在的
3.被全部对象共享
4.能够直接被类名多调用
实例变量和类变量的区别
1.存放位置
类变量随着类的加载存在于方法区中,实例变量随着对象的创建存在于堆内存里
2.生命周期
类变量生命周期最长,随着“类”的加载而加载,随着类的消失而消失,实例变量随着“对象”的消失而消失
静态的使用注意事项:
1.静态方法只能访问静态成员(包括成员变量和成员方法)
非静态方法能够访问静态也能够访问非静态
2.静态方法中不能够定义this,super关键字
由于静态优先于对象存在,因此静态方法中不能够出现this,super关键字
3.主函数是静态的。
blog
静态的利弊
利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每个对象中都存储一份
能够直接被类名所调用
弊:生命周期过长,访问出现局限性(只能访问静态)生命周期
更多相关内容 -
Java静态和非静态成员变量初始化过程解析
2020-08-25 04:07:54主要介绍了Java静态和非静态成员变量初始化过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 -
Java静态方法[Static]
2021-01-20 03:01:22作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 被static 修饰后的成员变量只有一份 当成员被static修饰之后,多了一种访问方式,除了可以对象调用之外,还可以被类直接调用(类名.静态成员) static的特点 ... -
JAVA 静态方法和成员方法、静态方法的调用
2020-02-03 17:42:12静态方法与成员方法 定义方法的时候,有static和没有static有什么区别? 1.有static的方法,叫静态方法。 2.没有static的方法,叫成员方法(实例方法)。 定义静态方法的格式: public static 返回值类型 方法名称...静态方法与成员方法
定义方法的时候,有static和没有static有什么区别?
1.有static的方法,叫静态方法。
2.没有static的方法,叫成员方法(实例方法)。定义静态方法的格式:
public static 返回值类型 方法名称(参数类型 参数名称){ //方法体 }
定义成员方法的格式:
public 返回值类型 方法名称(参数类型 参数名称){ //方法体 }
调用静态方法的格式:
方法名(参数值); //直接调用本类当中的静态方法 类名称.方法名(参数值); //调用另一个类中的静态方法
调用成员方法的格式:
类名称 对象名 = new 类名称(); //首先创建对象 对象名.成员方法名(参数值); //通过对象名调用成员方法
1.如果不创建对象,那么通过类名称只能调用静态方法。
2.如果创建了对象,那么可以通过对象名调用成员方法。
3.通过对象名也可以调用静态方法,但是不推荐这么做。public class StaticVsInstance { public static void main(String[] args) { method1(); //调用本类当中的静态方法 //1.本类中的静态方法也可以通过类名称进行调用 StaticVsInstance.method1(); //2.调用另一个类当中的静态方法 MyClass.method2(); //3.需要调用成员方法,就必须借助对象 MyClass obj = new MyClass(); //一定要先创建对象 obj.method3(); //然后才能通过对象去调用成员方法 obj.method2();// 这种写法也可以,但是不推荐 //应该以静态方式访问类型 MyClass 中的静态方法 method2() } public static void method1() { System.out.println("静态方法method1执行"); } }
public class MyClass { //静态方法 public static void method2() { System.out.println("静态方法method2执行"); } //成员方法(实例方法:Instance Method),没有static public void method3() { System.out.println("成员方法method3执行"); } }
静态方法的调用举例:
public class Cook { //这是一个静态方法,可以通过类名称进行调用 public static void makeFood(String food) { System.out.println(food); } }
public class StaticInovoke { public static void main(String[] args) { //希望调用cook这个类当中的静态方法makeFood //类名称.静态方法名(参数值) Cook.makeFood("西红柿"); } }
-
Java之静态成员
2018-12-29 16:12:34在Java中声明类的成员变量和方法时,可以使用static关键字把成员声明为静态成员。静态变量也叫类变量,非静态变量也叫实例变量;静态方法也叫类方法,非静态方法也叫实例方法。静态成员最主要的特点是它不属于任何...-
前言
在Java中声明类的成员变量和方法时,可以使用static关键字把成员声明为静态成员。静态变量也叫类变量,非静态变量也叫实例变量;静态方法也叫类方法,非静态方法也叫实例方法。静态成员最主要的特点是它不属于任何一个类的对象,它不保存在任意一个对象的内存空间中,而是保存在类的公共区域中,所以任何一个对象都可以直接访问该类的静态成员,都能获得相同的数据值,修改时,也在类的公共区域进行修改。下面将介绍静态成员、包含静态方法、变量和常量,以及一些特殊的静态方法,如main方法和factory方法。
-
静态变量和常量
在Java中没有一个直接的修饰符来实现常量,而是通过静态成员变量的方式来实现的,如下代码:
public static final int x=10;
static public final int y=20;
final static public int z=40;static表示属于类,不必创建对象就可以使用,因为常量应该不依赖任何对象,final表示值不能改变。一般用作常量的静态成员访问权限都设置为public,因为常量应该允许所有类或对象访问。
另外需要注意的是,static可以与其他修饰符组合使用,且顺序可以任意调换。
在Java中,静态成员变量的的初始化要求在静态语句块结束之前必须完成,即Java中静态成员变量的初始化时机有两个,在声明的同时进行初始化或在静态语句中初始化。例如:
public class Sample3_14 { public static final int const1=11; public static final int const2; static //静态语句 { const2=22; } public static void main(String[] args) { // TODO Auto-generated method stub System.out.print(const1 +" " +const2); } }
-
静态成员的访问
静态成员是属于类的,因此对其访问不需要创建对象,可以使用<类名> . <静态成员名>的语法调用静态成员变量。
1、静态方法访问非静态成员
首先参考以下代码:
public class Sample3_16 { static int staticVar=13; public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("成员变量staticVar的值为:"+ staticVar +"."); } }
静态成员的生命周期比非静态的长,即使访问时存在非静态成员,静态方法也不知道访问的是哪一个对象的成员,因为静态方法属于类,非静态方法属于对象,所以静态方法将不知道关于其所属类的对象信息。
main方法之所以被定义为静态也因为如此,其只是程序开始执行的入口,不需要依赖任何对象,若要在静态方法中访问非静态成员只要使用指定特定对象的引用即可。而静态方法访问访问静态成员时,自然是任何时候都没有问题,静态成员都属于类,只要类关系存在,静态成员都将村在。
同样的道理,在静态方法中是不能使用this预定义对象的引用的,即使其后边所操作的也是静态成员也是不行,因为this代表指向自己对象的引用,而静态方法是属于类的,不属于对象,其成功加载后,对象还不一定存在,即使存在,也不知道this指向的是哪一个对象。
2、非静态方法访问静态成员
非静态方法访问静态成员的时候,规则就比较简单,非静态成员的生命周期被静态成员所包含,因此非静态成员存在的时候,静态成员一定存在,故非静态成员任何时候都可以访问静态成员。
public class Sample3_18 { static int s=1000; //在非静态方法中调用静态成员 public void showStatic() { System.out.println("非静态方法getStatic()成功调用静态成员s,其值为:"+Sample3_18.s); } public static void main(String[] args) { // TODO Auto-generated method stub Sample3_18 sa=new Sample3_18(); sa.showStatic(); } }
-
main() 方法
main方法是Java程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main方法,这个方法与其他方法有很大不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等。
因为main方法是由Java虚拟机调用的,所以必须为public,虚拟机调用main方法不需要产生任何对象,所以main方法声明为static,且不需要返回值,所以声明为void。既然是类,Java允许类不加public关键字作为约束,当然类的定义只能限制为public或者无限制关键字。为什么要这么定义,这和JVM的运行有关。main方法中还有一个输入参数,类型为String[] ,这个也是Java的规范,main方法中必须有一个入参,类型必须为String[] ,至于字符串数组的名字,这个是可以自己设定的,根据习惯,这个字符串数组的名字一般和Sun Java规范范例main的参数名保持一致,取名为args。而main方法不准抛出异常,因此main方法中的异常要么处理要么不处理,不能继续抛出。
当一个类中由main方法时,则执行命令“Java 类名” 则会启动虚拟机执行该类中的main方法,由于JVM在运行这个Java程序的时候,首先会调用main方法,调用时不实例化这个类的对象,而是通过类名直接调用,因此需要限制其为public static。
-
Factory 方法
Java的静态方法有一种常见的用途,就是使用 Factory方法产生不同风格的对象,例如NumberFormat类使用 Factory方法产生不同风格的格式对象。 Factory Method是最常用的模式了,Factory方法在Java程序系统中可以说是随处可见。Factory方法就相当于创建实例对象的new,我们经常要根据类 Class生成实例对象,如A a= new A( ), Factory Method也是用来创建实例对象的,所以以后new时可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给系统带来更大的可扩展性和尽量少的修改量。
下面以类 Sample为例,如果要创建 Sample的实例对象。
Sample sample-new Sample();
但实际情况是,通常用户都要在创建 sample实例时做初始化的工作,例如赋值、查询数据库等。首先想到的是,可以使用 Sample I的构造函数,这样生成实例就写成:
Sample sample- new Sample(参数)
但是,如果创建 sample实例时所做的初始化工作不是像赋值这样简单的事,可能是很长一段代码,如果也写入构造函数中,那么代码就很难看了。初始化工作如果是很长一段代码,说明要做的工作很多,将很多工作装入一个方法中,相当于将很多鸡蛋放在一个篮子里,是很危险的,这也是有悖于Jaa面向对象的原则的,面向对象的封装( Encapsulation)和分派( Delegation)告诉我们,尽量将长的代码“切割”成段,将每段再“封装”起来(减少段和段之间耦合性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再发生牵一动百的事情。
所以,首先需要将创建实例的工作与使用实例的工作分开,也就是说,让创建实例所需要的大量初始化工作从 Sample的构造函数中分离出去。这时就需要使用 Factory方法来生成对象了,不能再用上面的" new Sample(参数) "了。还有,如果 Sample有个继承如 MySample,如按照面向接口编程,则需要将 Sample抽象成一个接口。现在 Sample是接口,有两个子类 MySample和 HisSample,要实例化它们:
(1) Sample mysample=new Mysample();(2)Sample hissample=new Hissample();
上面所示的 Sample类可能还会“生出很多儿子出来”(继承),那么要对这儿子一个个实例化,而且可能还要对以前的代码进行修改,加入到后来生出的儿子的实例中下面是一个简单的 Factory例子:
interface Fruit { void plant();//种植 void grow();//生长 void harvest();//收割 } class Apple implements Fruit { private int treeAge; public void plant() { System.out.println("苹果已种植"); } public void grow() { System.out.println("苹果正在生长中。。。。"); } public void harvest() { System.out.println("苹果已经收获"); } public void setTreeAge(int treeAge)//设置树的年龄 { this.treeAge=treeAge; } } class AppleGardeber { public static Apple factory() { Apple f=new Apple(); System.out.println("水果工厂成功创建一个水果:苹果!"); return f; } } public class Sample3_20 { private void test() { Apple a=AppleGardeber.factory(); } public static void main(String[] args) { // TODO Auto-generated method stub Sample3_20 test=new Sample3_20(); test.test(); } }
在上面的例子中,苹果实现了水果接口。苹果的生产由专门的苹果Factory负责,这样,在不涉及苹果的具体子类的情况下,达到了封装效果,也减少了错误;
-
-
【Java】静态方法只能访问静态成员
2020-08-17 11:43:08静态方法只能访问静态成员是常见的java知识点,这个知识点是针对于静态方法在本类中只能直接访问静态成员,而不能访问直接访问非静态成员变量。 原因: 静态的内容是随着类的加载而加载,所以当类加载时,静态方法和...静态方法只能访问静态成员是常见的java知识点,这个知识点是针对于静态方法在本类中只能直接访问静态成员,而不能访问直接访问非静态成员变量。
原因:
静态的内容是随着类的加载而加载,所以当类加载时,静态方法和静态成员是先进入内存的,而此时的非静态成员变量是不在内存里的,因此静态方法找不到其他非静态成员。例子:
1.静态方法访问静态成员和非静态成员时:
2.创建本类对象访问(即非静态成员变量也加载时):
由此也可以看出静态内容是比其他非静态内容先进入内存的。 -
关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍
2013-09-23 16:41:25详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序 -
java 静态成员三种初始化方法
2019-09-26 17:02:34声明的时候初始化 在 static block中初始化 class Demo { public static int z; static { z = 10;... 写一个私有静态方法去初始化 class name { public static varType myVar = initi... -
JAVA静态成员和实例成员的加载时机
2019-01-02 11:17:48JAVA静态成员和实例成员的加载时机,先有对象还是先load类的静态成员,先有实例还是先调用构造方法等 -
java中什么叫静态成员变量
2021-02-26 08:24:08静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。... -
在JAVA静态方法中只能调用静态成员,怎么才能调用非静态成员?
2019-07-26 10:38:17在JAVA静态方法中只能调用静态成员。 main方法是静态方法,如果想调用其它的方法,只能是其它的静态方法。 public class Test{ public static void main(String[] args) { fangFa(100,100); //这里直接调用... -
[java]静态方法访问非静态方法的方法
2021-02-25 18:38:26是不是是有点拗口哈,在刚开始的开发中,经常会碰到"无法访问非静态方法",如下:Test.javapublic Test{public void notStatic(){System.out.println("我访问了非静态方法");}public static void main(String[] args){... -
java中 静态方法和非静态方法的调用
2021-03-07 21:38:43静态方法里面不能调用非静态方法packagecom.zqz.image; publicclassHellowWord{ publicvoidsay(Stringword){//非静态方法,需要new一个对象后,使用new出来的对象调用, System.out.println(word); } ... -
java静态变量、静态方法和静态代码段
2021-03-06 01:06:03先上实例public classTestStatic {public static String staticString = "this is a static String"; //静态变量public String instanceString = "this is ...//实例变量//静态方法public static voidstaticMethod()... -
Java中静态方法的调用格式
2022-04-04 15:55:06Java中不带返回值的静态方法调用 格式: &... -
static的用法(一):静态成员变量和静态成员方法
2018-03-15 18:02:47被static修饰的成员变量和成员方法独立于该类的任何对象。 被类所有的实例所共享。 当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例对象共用同一个static变量。这也就是说不管创建多少对象,... -
详解Java中静态方法
2019-05-20 17:01:40注意: 非静态方法既可以访问静态数据成员 又可以访问非静态数据成员,而静态方法只能访问静态数据成员; 非静态方法既可以访问静态方法又可以访问非静态方法,而静态方法只能访问静态数据方法。 原因: 因为静态... -
java的静态方法访问静态成员问题
2015-10-11 10:00:21java中静态方法只能访问静态成员为什么main方法前面有static没什么还可以访问飞静态成员呢 -
java中静态方法调用非静态成员变量、非静态方法
2017-03-27 13:32:11public class Circle { private double radius = 1.0; double getAre() { return radius * radius * Math.PI;... //radius不是静态的,静态方法可以通过类对象调用非静态成员变量、非静态方法 } } -
Java中的Static静态方法
2022-01-23 15:54:09与静态变量相似,用static修饰符修饰的方法属于类的静态方法,又称为类方法。静态方法的实质是属于整个类的方法,而不加static... 由于static方法是属于整个类的方法,故不能直接操作和处理属于某个对象的成员,而只能 -
java静态方法的线程安全问题
2021-02-12 18:24:35类的成员分为两类,静态成员(static member)和实例成员(instance member)。静态成员属于类,实例成员则属于对象,即类的实例。简单讨论一下在一个类中使用静态字段(static field)和静态方法(static method)是否会有... -
java中静态方法为什么无法调用非静态变量或者方法
2019-02-07 23:23:32如果静态方法能调用动态方法的话,那如果别人通过类名调用静态方法时实例对象可能并不存在,但是方法内又调用了对象的方法,由于对象不存在,所以动态方法也不存在,程序肯定报错,所以java直接在编译阶段检查这种... -
JAVA_静态泛型方法及静态泛型成员变量
2019-03-17 11:29:04泛型类中的静态方法不能使用类的泛型,而应该将该方法定义为泛型方法 1.错误示范: class demo<T>{ public static T show(T temp) { return temp; } } 2.正确示范: class demo<T&... -
Java 静态类、静态方法和静态变量
2017-11-06 15:44:52转载自Java 静态类、静态方法和静态变量Java 静态类、静态方法和静态变量static 是Java中的一个关键字,我们不能声明普通外层类或者包为静态的。static用于下面四种情况。1.静态变量:我们可以将类级别的变量声明为... -
java中静态方法与非静态方法的区别
2020-09-24 23:15:16其次,静态方法中只能调用静态成员或者方法,不能调用非静态方法或者非静态成员,而非静态方法既可以调用静态成员或者方法又可以调用其他的非静态成员或者方法。总的来说非静态方法啥都可以调用。 注意main方法一定... -
java-静态方法中调用构造方法
2020-06-21 20:29:37静态成员包括静态方法(static method)和静态变量(static variable)。 如果想要一个类的所有实例共享数据,那么就要使用静态变量,也称为类变量(class variable)。静态变量将变量值存储在一个公共的内存地址。因为它... -
Java基础学习笔记-类的静态属性和静态方法
2022-01-28 23:57:43用static修饰的方法称为静态方法,又叫类方法(静态方法里,无this) 用来修饰初始化语句块,称为静态初始化语句块 类的静态属性和静态方法 即使没有创建该类的具体对象,类中的static类成员也会存在,这时可以... -
Java基础——java静态变量面试题
2021-03-12 23:50:34下面就为大家准备了10道java静态变量面试题,希望可以帮助到有面试需要的朋友们。1、static在java语言中怎么用?答:static是一个修饰符,用于修饰成员(成员变量和成员函数)。当成员被静态修饰后,就多了一个调用... -
java中静态变量和成员变量的区别
2021-04-26 20:58:06java中静态变量和成员变量的区别 1、静态变量。 由static修饰的变量称为静态变量,其实质上就是一个全局变量。如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰;没有被静态修饰的内容,其实是属于对象... -
Java中静态方法中调用非静态方法
2019-08-20 17:52:30java初学者经常会遇到的问题:无法从静态上下文中引用非静态变量 ...因为我们知道静态的方法可以在没有创建实例时使用,而申明为非静态的成员变量是一个对象属性,它只有在对象存在时引用,因此如果在对象未创建实...