对JAVA的static深刻理解(结合C语言的思考)

 1 public class statictest {
 2
 3
 4     String X = "我是非静态变量";
 5
 6
 7     static int butterfly =0;
 8     static String staticX = "我是静态变量" ;
 9     static String staticZ="我也是静态变量";
10
11
12     statictest(){
13         System.out.println("我是构造器");
14     }
15
16
17
18     public static void main(String[] args) {
19         statictest this1 =new statictest();//new出这个对象只是为了下面的fangfa2()用,但即使你用static块里的构造器也没关系
20         //System.out.println(ff3);  错,说明静态方法中的变量也是个临时变量,并不是全局的
21         //System.out.println(staticY);  错,说明即使在STATIC块里定义的量,也是一个临时变量,并不是全局的,也不是这个类中的
22         //this.fangfa2();  错,说明this是一个对象,不能用在static方法中
23         this1.fangfa2();
24         fangfa4();//单纯的想说明不需用this1引用
25
26     }
27
28
29     static{
30         statictest this2 =new statictest();//只为了说明可以在static块中就早点进行new出一个对象,目的是运行一下构造器
31         String staticY ="staticy";
32         //System.out.println(x);错
33         System.out.println(staticY);
34         //this.fangfa1();这样写错,因为this是表示自己这个对象,是一个对象值,而static是先于对象加载的
35         fangfa1();//说明static块可以调用静态方法方法
36 //        if(true){} 对的,说明其实static块就可以当成一个没有名字,不能被调用的特殊的静态方法,它的实质是一个静态方法,同时还相当于main方法一样可以
37 //        运行,而且比main先运行
38     }
39
40     static void fangfa0(){
41         System.out.println("我是蝴蝶");
42     }//这个方法只是想表明我喜欢蝴蝶,没什么具体用处
43
44
45
46
47     static void fangfa1(){
48         System.out.println(staticX);
49         //System.out.println(X);错,因为静态方法不能调用非静态量
50         System.out.println(fangfa3());
51         //System.out.println(ff3) ;错,说明ff3即使在静态方法中定义的,但是它还是一个临时变量,但是如果在它前面加上static就不会错了
52
53
54     }
55
56     static String fangfa3(){
57          String ff3 ="我是fangfa3";
58         return ff3;
59
60     }
61
62     static void fangfa4(){
63          fangfa0();
64     }
65
66
67     void fangfa2(){
68         System.out.println(staticZ);//静态方法可以调用静态量
69         this.X ="2";
70     }
71
72
73
74 }
75 /*打印结果:*/
76 //我是构造器
77 //staticy
78 //我是静态变量
79 //我是fangfa3
80 //我是构造器
81 //我也是静态变量
82 //我是蝴蝶
83
84
85 /* 总结过程:1、static加载并初始化:先对静态量(变量和方法)进行初始化,对方法的初始化的意思是说,对这个变量名进行指针的赋值;对变量的初始化的就是
86  * 直接对这个变量进行一般数据类型的赋值
87  *      2、static执行:然后对static块中的内容进行执行,它相当于main方法一样先被执行,是静态的执行入口好比“main”,
88  *      3、非静态的加载并初始化:轮到所以的非静态的变量和方法的加载及它的赋值
89  *      4、执行构造器
90  *      5、非静态的执行:对main方法进行执行
91  * 注意:方法的赋值和调用是2个概念,方法的赋值是对这个方法名的也就是间接变量进行地址指针的赋值;而方法的调用是调用这个方法
92  * 注意:还有非静态块没提到
93  * 注意:执行和加载和初始化这3个概念一定要分清楚
94  * 注意:static是所有的该类的对象所共有,也就是一个 只有这1个,而非static量是每一个对象自己就有一个,好比最开始新建的变量X,this2.X和this1.X并不是
95  * 同一个
96  * 注意:因为static量是共有的,所以还是前面不要加对象名而直接调用比较好,这样对概念的理解有帮助
97  */
时间: 2024-10-18 23:57:30

对JAVA的static深刻理解(结合C语言的思考)的相关文章

Java中static的理解

static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享. 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是

Java之继承深刻理解

1.关于私有成员变量 无论父类中的成员变量是私有的.共有的.还是其它类型的,子类都会拥有父类中的这些成员变量.但是父类中的私有成员变量,无法在子类中直接访问,必须通过从父类中继承得到的protected.public方法(如getter.setter方法)来访问.子类对象内存区域中会划一部分区域给父类的数据的存储,即子类对象内存中封装了父类的初始化数据,创建子类对象时,父类的数据就是子类的对象的一部分 2.关于静态成员变量 无论父类中的成员变量是静态的.还是非静态的,子类都会拥有父类中的这些成员

深刻理解Java中形参与实参,引用与对象的关系

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/30989755 我们都知道,在Java中,除了基本数据类型之外,其他的都是引用类型,当它们作为函数参数时,传递的也是引用,通过引用可以改变对象的值,很多人便因此而忽略形参与实参,引用与对象的关系问题.废话不多说,先看下面一个例子: import java.util.*; public class Student { private String

深刻理解Java中final的作用(一):从final的作用剖析String被设计成不可变类的深层原因

声明:本博客为原创博客,未经同意,不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(原文链接为http://blog.csdn.net/bettarwang/article/details/26744661),看代码和提问.讨论都更方便. Java中final的作用主要表如今三方面:修饰变量.修饰方法和修饰类.以下就从这两个方面来解说final的作用.在文末从final及类的设计安全性出发,论述了Java中String为何要被设计成不可变类. 1.final修饰变量 fina

深刻理解Java中的String、StringBuffer和StringBuilder的差别

声明:本博客为原创博客,未经同意.不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(链接为http://blog.csdn.net/bettarwang/article/details/26412497),看代码和提问.讨论都更方便. 首先简单地来梳理一下Java中String.StringBuffer和StringBuilder各自的含义. 1.String类 首先.它是线程安全的,即能够用于多线程编程中. 其次,String类的对象是不可变的,即在定义时就确定了,类似St

深刻理解Java中的String、StringBuffer和StringBuilder的区别

首先简单地来梳理一下Java中String.StringBuffer和StringBuilder各自的含义. 1.String类 首先,它是线程安全的,即可以用于多线程编程中: 其次,String类的对象是不可变的,即在定义时就确定了,类似String str="Hello";str+="Java";的语句其实是生成了新的对象,只是我们未察觉到而已.但是注意在大量的字符串新建对象时消耗就很可观,这时必须考虑采用StringBuffer或StringBuilder,否

java中static关键字的理解(转载)

static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin05

畅销书对Java中Iterator的理解误区

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/28110615 最近放假,闲来无事,便翻看以前看过的一些书,竟然发现有些书本(甚至是一些畅销书)对Java中Iterator有很大的误解,比如某畅销书在Collection那一章有这么一句话:"当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集

ThreadLocal类深刻理解

synchronized这类线程同步的机制可以解决多线程并发问题,在这种解决方案下,多个线程访问到的,都是同一份变量的内容.为了防止在多线程访问的过程中,可能会出现的并发错误.不得不对多个线程的访问进行同步,这样也就意味着,多个线程必须先后对变量的值进行访问或者修改,这是一种以延长访问时间来换取线程安全性的策略. 而ThreadLocal类为每一个线程都维护了自己独有的变量拷贝.每个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了,那就没有任何必要对这些线程进行同步,它们也能最大限度的由CP