java中public static_对java中public、static的理解
首先是public
在说明这四个关键字之前,我想就class之间的关系做一个简单的定义,对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes,认为都是自己的朋友。
1、public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
2、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
3、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
作用域 当前类 同一package 子孙类 其他package
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×
不写时默认为friendly
然后是static
static在java中表示静态
但是这个静态又是什么意思呢?
最开始接触static的时候看书上的概念根本没弄懂!
接触有一段时间java了,在这里面要总结一下我对static的理解:
(概念)static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
这句话是说,你会用到static修饰一些个变量、方法、方法块什么的,这是你用到static的地方;“但是,java中没有全局变量的概念”,怎么理解这句话?你时刻要记住java是一个面向对象的语言,万事万物皆对象,无论你做什么都需要创建一个对象,然后再调用这个对象的方法,java怎么能允许存在一个在全局都通用的“全局变量”的概念存在呢?所以java中压根就没有所谓的“全局变量”,但是没有这个概念,不代表你不可以实现这个功能,java存在的目的就是让人们使用它去达到人们想要的效果,所以static value就可以达到全局变量的作用,所以,你现在应该可以理解下面这句话了吧。
(概念)用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
现在进一步理解下面两段概念:
(概念)只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
根据实际例子来理解这段概念,现在有两个类,Demo1和Demo2。
此实例还包含对静态方法的操作
public class Demo1 {
public static int i = 1;
public int j = 2;
public static int getNumber(){
return i;
// 这个return返回的是全局变量的i,即前面多创建的i
}
public int getDealNumber(int j){
return j;
// 这个return返回的是所传进来的参数,是(int j)这个东西
}
}
public class Demo2 {
public static void main(String args[]){
// 想要得到Demo1中的静态的(即全局的)变量i,直接用类名引用就可以了
int i = Demo1.i;
// 但是想要得到Demo1中的实例的变量j,我需要怎么做呢?(此刻牢记java面向对象的思想!)
// 首先我要先new一个Demo1的对象,然后才可以通过new出来的对象得到Demo1中的j
Demo1 demo1 = new Demo1();
int j = demo1.j;
// 同理,java中的static方法和非static方法都是一样的区别
// 下面一行的方法是静态的,我可以直接根据类名调用方法
int ii = Demo1.getNumber();
// 但是想要调用实例的方法,就需要利用前面所new出来的Demo1的对象来调用了
int jj = demo1.getDealNumber(1);
// 所以现在你可以理解上文紫色的定义了么?
}
}
(概念)用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
弄懂了上面的代码,这句定义是不是迎刃而解了呢?这里面涉及到堆栈的问题,我现在还没有整理,我会整理的,写完这篇我马上就要巩固一下堆栈的知识,我认为堆栈的知识很重要,如果你也是初学者,关注我吧,嘿嘿~
这里说一下静态变量和实例变量的区别:
两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:
在对象之间共享值时
方便访问变量时
现在理解一下静态方法
2、静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用静态方法。前面的代码中有直接通过类名调用的例子
静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!就是java面向对象的思想,实例是你这个类本身的属性,你会用这个本身的属性去做一些事情,而这些事情不是固定的,不能像静态方法一样一成不变。换位思考,人是一个java类,手是类的实例方法,而人身上有手机,这个手机就是静态方法;人只会用手去玩手机,你见过人用手机玩手么?哈哈
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的
怎么理解上面这句定义呢?记住得了,哈哈。
3、static代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。例如:
public class Test5 {
private static int a;
private int b;
static{
Test5.a=3;
System.out.println(a);
Test5 t=new Test5();
t.f();
t.b=1000;
System.out.println(t.b);
}
static{
Test5.a=4;
System.out.println(a);
}
public static void main(String[] args) {
// TODO 自动生成方法存根
}
static{
Test5.a=5;
System.out.println(a);
}
public void f(){
System.out.println("hhahhahah");
}
}
运行结果:
3
hhahhahah
1000
4
5
利用静态代码块可以对一些static变量进行赋值,最后再看一眼这些例子,都一个static的main方法,这样JVM在运行main方法的时候可以直接调用而不用创建实例。
还用我再说什么么?
有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。
如果读不懂这句话就倒着念,就明白个大概了。
注意一下几点
声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制:
•
它们仅能调用其他的static 方法。
•
它们只能访问static数据。
•
它们不能以任何方式引用this 或super(关键字super 与继承有关,在下一章中描述)。
如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。
下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块:
// Demonstrate static variables,methods,and blocks.
class UseStatic {
static int a = 3;
static int b;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
static {
System.out.println("Static block initialized.");
b = a * 4;
}
public static void main(String args[]) {
meth(42);
}
}
一旦UseStatic 类被装载,所有的static语句被运行。首先,a被设置为3,接着static 块执行(打印一条消息),最后,b被初始化为a*4 或12。然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变量a和b,以及局部变量x 。
注意:在一个static 方法中引用任何实例变量都是非法的。
java中public static_对java中public、static的理解相关推荐
- c语言中关键字static_了解C ++中Static关键字的变体
c语言中关键字static Hello, folks! Today we will be unveiling another important aspect in the series of our ...
- java main方法static_在java中为什么要把main方法定义为一个static方法?
我们知道,在C/C++当中,这个main方法并不是属于某一个类的,它是一个全局的方法,所以当我们执行的时候,c++编译器很容易的就能找到这个main方法,然而当我们执行一个java程序的时候,因为ja ...
- [转] Java中public,private,final,static等概念的解读
作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...
- java 权限修饰符大小_Java中访问权限修饰符public protected private, 缺省默认权限的用法总结...
1.访问权限符: (1)public: 对于成员来说:任何其他类都可以访问它们,不管在同一个包中还是在另外的包中. 对于类来说: 也是一样. (2)friendly: 对于成员老说:如果一个类的成员没 ...
- (转)Java中的private、protected、public和default的区别
1 访问修饰符 1.1 理解 默认什么都不加,就是default(不用把default写出来).意思就是只能由跟这个类在同一个包中的类来访问,比private限制更少,但比protected限制更多. ...
- java 内嵌机制_[转] Java中public,private,final,static等概念的解读
作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...
- java中protect是什么_Java中public、private、protecte、default、public void是什么意思 | 学步园...
类的成员不写访问修饰时默认为default.默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private).受保护(protected)对子类相当于公开, ...
- 对java中public、static的理解
原帖:https://blog.csdn.net/v7595v/article/details/45845347 首先是public 在说明这四个关键字之前,我想就class之间的关系做一个简单的定 ...
- Java中的四种访问权限:public、protected、包访问、private
所谓访问权限,指的就是本类中的成员变量.成员方法对其他类的可见性 试想一想,当我们修改一个非常庞大的项目时,如果所有变量和方法都是公共权限,那么后端中任何类都有权限去修改它的变量和方法,很有可能修改后 ...
最新文章
- coreutils-5.0中几个命令的执行过程
- BOOST_VMD_ASSERT_IS_TUPLE宏相关的测试程序
- boost.asio系列——io_service
- js 字符串插入_Vue.js 条件与循环
- 数字电路实验怎么接线视频讲解_利达:气体灭火接线示意图
- UVM序列篇之一:新手上路
- 世界杯来了!小程序赛事操作来一波~
- NAT with same subnetwork
- 员工离职时,主管应该问相关竞业的两个问题
- MBR磁盘分区见解笔记
- 信号与系统公式笔记(8)——拉普拉斯变换
- 中国鲷鱼养殖产量和捕捞产分析,养殖产业区域集中度高「图」
- 微信小程序毕业设计、基于微信棋牌室管理小程序毕设
- Git for Windows 国内下载站,发布
- Dos攻击的方式及解决方案
- Win7下无法安装CDC Comms Interface驱动的朋友进
- linux 命令是什么的缩写,Linux一部分命令解释(命令缩写代表什么意思)
- Kalman详尽原理介绍合集
- unittest教程(2w字实例合集)——Python自动化测试一文入门
- 玩转华为数据中心交换机系列 | 配置基本QinQ示例
热门文章
- Python frozenset() 函数的使用与作用
- CentOS 修改时间
- 计算机图形学入门(GAMES101)总结01
- 机器学习sklearn(10)集成分类
- 第一次使用VSCode创建vue项目(报错大全)
- 前沿对话 | 深育大讲堂之深入云原生时代微服务架构
- 20171024 三季报业绩上涨个股一览
- 如何测试服务器及端口是否畅通
- “无法访问 E:\ 参数错误” 问题的解决
- [论文笔记]:Image-to-Image Translation with Conditional Adversarial Networks