首先是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的理解相关推荐

  1. c语言中关键字static_了解C ++中Static关键字的变体

    c语言中关键字static Hello, folks! Today we will be unveiling another important aspect in the series of our ...

  2. java main方法static_在java中为什么要把main方法定义为一个static方法?

    我们知道,在C/C++当中,这个main方法并不是属于某一个类的,它是一个全局的方法,所以当我们执行的时候,c++编译器很容易的就能找到这个main方法,然而当我们执行一个java程序的时候,因为ja ...

  3. [转] Java中public,private,final,static等概念的解读

    作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...

  4. java 权限修饰符大小_Java中访问权限修饰符public protected private, 缺省默认权限的用法总结...

    1.访问权限符: (1)public: 对于成员来说:任何其他类都可以访问它们,不管在同一个包中还是在另外的包中. 对于类来说: 也是一样. (2)friendly: 对于成员老说:如果一个类的成员没 ...

  5. (转)Java中的private、protected、public和default的区别

    1 访问修饰符 1.1 理解 默认什么都不加,就是default(不用把default写出来).意思就是只能由跟这个类在同一个包中的类来访问,比private限制更少,但比protected限制更多. ...

  6. java 内嵌机制_[转] Java中public,private,final,static等概念的解读

    作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...

  7. java中protect是什么_Java中public、private、protecte、default、public void是什么意思 | 学步园...

    类的成员不写访问修饰时默认为default.默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private).受保护(protected)对子类相当于公开, ...

  8. 对java中public、static的理解

    原帖:https://blog.csdn.net/v7595v/article/details/45845347 首先是public  在说明这四个关键字之前,我想就class之间的关系做一个简单的定 ...

  9. Java中的四种访问权限:public、protected、包访问、private

    所谓访问权限,指的就是本类中的成员变量.成员方法对其他类的可见性 试想一想,当我们修改一个非常庞大的项目时,如果所有变量和方法都是公共权限,那么后端中任何类都有权限去修改它的变量和方法,很有可能修改后 ...

最新文章

  1. coreutils-5.0中几个命令的执行过程
  2. BOOST_VMD_ASSERT_IS_TUPLE宏相关的测试程序
  3. boost.asio系列——io_service
  4. js 字符串插入_Vue.js 条件与循环
  5. 数字电路实验怎么接线视频讲解_利达:气体灭火接线示意图
  6. UVM序列篇之一:新手上路
  7. 世界杯来了!小程序赛事操作来一波~
  8. NAT with same subnetwork
  9. 员工离职时,主管应该问相关竞业的两个问题
  10. MBR磁盘分区见解笔记
  11. 信号与系统公式笔记(8)——拉普拉斯变换
  12. 中国鲷鱼养殖产量和捕捞产分析,养殖产业区域集中度高「图」
  13. 微信小程序毕业设计、基于微信棋牌室管理小程序毕设
  14. Git for Windows 国内下载站,发布
  15. Dos攻击的方式及解决方案
  16. Win7下无法安装CDC Comms Interface驱动的朋友进
  17. linux 命令是什么的缩写,Linux一部分命令解释(命令缩写代表什么意思)
  18. Kalman详尽原理介绍合集
  19. unittest教程(2w字实例合集)——Python自动化测试一文入门
  20. 玩转华为数据中心交换机系列 | 配置基本QinQ示例

热门文章

  1. Python frozenset() 函数的使用与作用
  2. CentOS 修改时间
  3. 计算机图形学入门(GAMES101)总结01
  4. 机器学习sklearn(10)集成分类
  5. 第一次使用VSCode创建vue项目(报错大全)
  6. 前沿对话 | 深育大讲堂之深入云原生时代微服务架构
  7. 20171024 三季报业绩上涨个股一览
  8. 如何测试服务器及端口是否畅通
  9. “无法访问 E:\ 参数错误” 问题的解决
  10. [论文笔记]:Image-to-Image Translation with Conditional Adversarial Networks