-
2018-12-29 12:18:27
java类中的成员分为两种:实例成员和静态成员
在静态成员方法中,不能访问实例成员,不能使用this引用。
不能声明方法的局部变量为static
更多相关内容 -
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负责,这样,在不涉及苹果的具体子类的情况下,达到了封装效果,也减少了错误;
-
-
静态数据成员受private控制符的作用
2017-02-25 09:57:01p173面试题:对静态数据成员的正确描述是: A.静态数据成员可以在类体内进行初始化 B.静态数据成员不可以被类对象调用 C.静态数据成员不受private控制符作用 D.静态数据成员可以直接用类名调用 这里...今日在看《c/c++程序员面试秘笈》时,有如下题,
p173面试题:对静态数据成员的正确描述是:
A.静态数据成员可以在类体内进行初始化
B.静态数据成员不可以被类对象调用
C.静态数据成员不受private控制符作用
D.静态数据成员可以直接用类名调用
这里答案给的是CD,对于C有所疑问,于是写下如下代码进行测试:
#include <iostream> #include <conio.h> using namespace std; class test { public: static int i; test() {} void print(); private: static int j; }; int test::i = 0; int test::j = 0; void test::print() { cout << "i = "<< i << endl;//对比参照项1 cout << "j = "<< j << endl;//对比参照项2 } int main() { test t; t.print(); cout << "i = "<< t.i << endl;//对比参照项3 cout << "j = "<< t.j << endl;//测试是否可以不受private作用 getch(); return 0; }
编译平台是win10+vs2015结果是报错
- cout << "j = "<< t.j << endl;
于是可知C选项错误,这是这本书上的失误
-
关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍
2013-09-23 16:41:25详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序 -
【Java】静态成员变量与非静态成员变量的区别
2020-11-23 00:29:571) 静态的成员变量的作用是共享一个数据给所有的对象使用。 2)非静态的成员变量的作用是描述一类事物的公共属性。 数量与存储位置上的区别: 1)静态成员变量是存储方法 区内存中,而且只会存在一份数据。 2)非...静态的成员变量与非静态的成员变量的区别:
- 作用上的区别:
1) 静态的成员变量的作用是共享一个数据给所有的对象使用。
2)非静态的成员变量的作用是描述一类事物的公共属性。 - 数量与存储位置上的区别:
1)静态成员变量是存储方法 区内存中,而且只会存在一份数据。
2)非静态的成员变量是存储在堆内存中,有n个对象就有n份数据。 - 生命周期的区别:
1)静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
2)非静态的成员数据是随着对象的创建而存在,随着对象被垃圾回收器回收而消失。
- 作用上的区别:
-
java静态成员和非静态成员的区别
2018-08-27 21:01:08static(静态)关键字 static关键字: 用于修饰成员(成员变量和成员函数) 被修饰后的成员具备以下特点... 静态方法只能访问静态成员 静态方法中不可以写this,super关键字 主函数是静态的 stati... -
java中静态变量和成员变量的区别
2021-04-26 20:58:06java中静态变量和成员变量的区别 1、静态变量。 由static修饰的变量称为静态变量,其实质上就是一个全局变量。如果某个内容是被所有对象所共享,那么该内容就应该用静态修饰;没有被静态修饰的内容,其实是属于对象... -
【Java】静态方法只能访问静态成员
2020-08-17 11:43:08静态方法只能访问静态成员是常见的java知识点,这个知识点是针对于静态方法在本类中只能直接访问静态成员,而不能访问直接访问非静态成员变量。 原因: 静态的内容是随着类的加载而加载,所以当类加载时,静态方法和... -
java之成员变量(实例成员变量和静态成员变量)
2021-01-16 12:44:45在java中,成员变量分为两种:实例成员变量和静态成员变量。 1.1.1实例成员变量 实例成员变量:是定义在方法外部和类内部的且不被static所修饰的变量.用于描述一个类中包含哪些数据 代码示例: class Person ... -
静态数据成员和静态方法
2018-09-23 08:31:01(1)在开发的过程中,静态数据成员推荐使用类来访问 Student.name之所以会错是因为每一个人都有一个名字,不会共有。 (2)统计个数 这时候输出的值是2,但是JAVA中没有办法–,所以应当怎么办呢? 2、静态... -
Java小知识--直接调用静态方法 和 先新建对象再调用实例方法的区别
2021-03-06 21:18:28以下内容全是抄的网上先辈们的经验,字太多,懒得自己再敲一遍了:2020.05.25更新过了一段时间,会看之前的东西,有了新的体会:实例方法--也就是 普通成员方法 。想调用实例方法,就需要先new出一个对象,再用 对象... -
详解Java静态数组
2021-02-12 23:31:16说到Java静态数组,我们第一时间可能就会想到相应的动态数组,两者看上去挺相似,实质却大不一样。Java静态数组是一定义出来就创建了,而动态数组则是定义时不创建,使用时才创建,一定意义上节省了内存空间。本文... -
Java 静态与动态的区别
2021-02-12 20:18:02Java 静态与动态的区别1、静态的属性是类共同拥有的,而动态的属性是类各对象独立拥有的。2、静态上内存空间上是固定的,动态中内存空间在各个附属类里面分配。3、分配顺序不同,先分配静态对象的空间,继而再对非... -
静态成员的特性
2019-05-16 21:59:44在java中获取数据库数据时,手贱在成员变量中加了静态修饰符导致数据一直有问题,因为习惯性在方法写静态; 我这里说的是静态的唯一性,下面我通过模仿数据库取值来验证静态成员的唯一性; 这里写了主要方法,第一... -
Java-静态成员变量值到底能不能变?
2018-01-23 19:10:53Java-静态成员变量值到底能不能变?? -
Java 静态内部类 的详细解释
2021-03-11 02:30:4701:静态内部类 的成员可以是 静态的数据域 和 静态的方法 ,因为这个类是静态的, 在加载的时候一并被加载进去如下图: //解释: 这个Outer在被虚拟机加载的时候, name被初始化, 因为StaticInner 依然是一个静态的... -
Java基础——java静态变量面试题
2021-03-12 23:50:34下面就为大家准备了10道java静态变量面试题,希望可以帮助到有面试需要的朋友们。1、static在java语言中怎么用?答:static是一个修饰符,用于修饰成员(成员变量和成员函数)。当成员被静态修饰后,就多了一个调用... -
[java]静态方法访问非静态方法的方法
2021-02-25 18:38:26是不是是有点拗口哈,在刚开始的开发中,经常会碰到"无法访问非静态方法",如下:Test.javapublic Test{public void notStatic(){System.out.println("我访问了非静态方法");}public static void main(String[] args){... -
Java 静态变量的初始化
2021-08-21 14:04:10静态变量的初始化 转载 https://blog.csdn.net/wanghao109/article/details/49591815 class Singleton{ public static Singleton singleton = new Singleton(); public static int a; public static int b = 0;... -
Java静态变量,成员变量,局部变量的默认值
2019-10-25 14:21:10Java静态变量,成员变量,局部变量的默认值 1.静态变量 public class GlobalVar { public static char aChar; public static int anInt; public static long aLong; public static float aFloat; public static... -
Java内部类应用之静态内部类应用示例
2020-08-25 14:06:10主要介绍了Java内部类应用之静态内部类应用,结合实例形式分析了Java静态内部类的原理、功能、用法及相关操作注意事项,需要的朋友可以参考下 -
Java中成员变量、局部变量、全局变量、静态变量存在位置及初始化
2021-03-08 09:17:50成员变量是 定义在一个类的变量:类中方法外局部变量是定义在一个方法内的变量:方法中成员变量分为:静态属性:随类的存在而存在,是在类加载的初始化非静态属性:随实例的属性存在而存在。局部变量:局部变量不能... -
java中的静态是什么?如何理解?
2021-02-12 13:00:48在Java语言中,static表示“静态”的意思,使用场景可以用来修饰成员变量和成员方法,当然也可以是静态代码块。static的主要作用在于创建独立于具体对象的域变量或者方法。格式:修饰变量:static 数据类型 变量名... -
Java如何读取配置文件并赋值静态变量
2021-03-03 13:43:04应用场景项目开发中某个功能需要抽取成方法写成一个工具类,...由于我写的这个工具类中需要读取配置文件中的内容,可是常规方式注入成员变量时都不是静态的,不能直接调用,比如这种方式:@Data@Componentpublic c... -
Java静态变量和成员变量初始化顺序
2018-08-01 19:22:491.当一个类(假定Darker类)的静态变量或者静态方法首次被访问的时候,Java的解释器必须查找类的路径,定位Darker.class文件。 2.载入Darker.class文件(创建一个Class对象),有关静态的初始化的所有动作都会执行。... -
java私有静态方法
2021-03-16 03:34:01一、private static我们都知道想要保护一些数据,只要设置为private,并且在java中static多少有“共享”的意味存在,那么既然已经private了,为什么还要static?编译器对标记为静态的函数无需检测this指针是否为空,... -
java变量之全局变量(静态变量,成员变量),局部变量,的关系和区别
2021-09-24 12:40:34可能刚学java对这些变量很懵,直接上图,接下来进行代码解释 ...2:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。 3:简单来说就是被static修饰后的值可以直接类... -
Java中的static———静态变量
2021-09-05 18:15:40引言 static 是 java 语言中的关键字,意思是“静态的”,它可以用来修饰变量、方法、代码块等,修饰的变量叫做静态变量,修饰的方法叫做静态方法,修饰的代码块叫做静态代码块。 初学static的最大的问题就是:... -
java中静态方法中调用非静态方法的详解
2021-03-05 22:58:12首先static的成员是在类加载的时候初始化的,JVM的CLASSLOADER的加载,首次主动使用加载,而非static的成员是在建立对象的时候,即new 操做的时候才初始化的;函数前后顺序是先加载,才能初始化,那么加载的时候初始... -
java的静态方法
2021-06-18 11:33:46Java中方法分为静态方法和普通方法 所谓静态方法,就是方法前面...注意:非静态方法既可以访问静态数据成员又可以访问非静态数据成员,而静态方法只能访问静态数据成员; 非静态方法既可以访问静态数据方法又可以访问.