• static关键字用处

    1. 用于修饰成员变量和成员函数

  • 被修饰后的成员具有以下特点:

      1. 随着类的加载而加载

      2. 优先于对象存在

      3. 被所有对象所共享

      4. 可以直接被类名调用

  • 使用注意

      1. 静态方法只能访问静态成员;非静态方法也可以访问静态成员

      2. 静态方法中不可以写this,super关键字

      3. 主函数是静态的

  • 实例变量(成员变量)和类变量(静态变量)的区别

    1. 生命周期不同

成员变量随着对象的创建而存在,随着对象的回收而释放;

静态变量随着类的加载而存在随着类的消失而消失

2.   调用方式不同

成员变量只能被对象调用
                           静态变量能被对象调用也能被类名调用(一般建议使用类名调用)

3.   别名不同

成员变量也叫实例变量
                          静态变量也叫类变量

4.   数据的存储位置不同

成员变量数据存储在堆内存中的对象中,所以是对象的特有数据 
                          静态变量数据存储在方法区(数据区或共享数据区)的静态区中,所以也叫对象的共享数据

  • 内存图解

以下代码在内存中的执行:

class Person{

    private String name;
private int age;
static String country = "CN";
public Person(String name, int age){
this.name = name;
this.age = age;
}
public void show(){
System.out.println(Person.country+":"+this.name+":"+this.age);
}
public static void method(){
System.out.println(Person.country);
}
}
class StaticDemo2{
public static void main(String[] args){
Person.method(); Person p = new Person("java",20);
p.show();
}
}

内存图解为:

说明:

  1. 当执行StaticDemo2这个类时,就会在方法区中创建一个属于该类的区域,并且加载默认的构造函数,接着在StaticDemo2的静态区中加载main方法。
  2. main方法进栈,并开始执行第一句代码:Person.method(); 由于是类名的调用,虚拟机会在classpath环境变量下找Person类(没有配置classpath则在当前目录下找),找到后,就会把该类加载进方法区,同StaticDemo2也会分为静态和非静态区。
  3. 要执行method方法,所以method方法进栈,运行 System.out.println(Person.country);代码,输出“CN”。return掉该方法后,该方法出栈。
  4. 执行new Person对象的操作,该操作前上篇随笔(构造函数中)已有分析,这里不累述。
  5. 执行完所有代码后,main方法出栈。
  • 静态代码块
static {
System.out.println("这是静态代码块");
}

1.静态代码块

随着类的加载而执行,并且执行一次。属于类。

2.作用

用于给类进行初始化。比如像javaAPI提供的Math类,全部为静态的方法,不允许创建对象,这个时候不能用构造 函数进行初始化,因为构造函数一般是给对象初始化,不能创建对象时不可使用。所以就要使用静态代码块来进行一些初始化的操作。

  • 构造代码块

不同于静态代码块,是属于类的代码块,如:

class Demo{
{
System.out.println("这是构造代码块");
}
    //。。。
}

和对象有关

可以给所有对象进行初始化,构造函数是给对应的对象进行针对性的初始化。

每次创建对象时都会执行。静态代码块是在类加载时执行一次。

 

[java学习笔记]java语言核心----面向对象之static关键字的更多相关文章

  1. Java学习笔记(十八):static关键字

  2. [java学习笔记]java语言核心----面向对象之this关键字

    一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理:         代表的是当前对象.         this就是所在函数 ...

  3. [java学习笔记]java语言核心----面向对象之构造函数

    1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用:                给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...

  4. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  5. 【疯狂Java学习笔记】【理解面向对象】

    [学习笔记]1.Java语言是纯粹的面向对象语言,这体现在Java完全支持面向对象的三大基本特征:封装.继承.多态.抽象也是面向对象的重要组成部分,不过它不是面向对象的特征之一,因为所有的编程语言都需 ...

  6. 我的Java学习笔记-Java面向对象

    今天来学习Java的面向对象特性,由于与C#的面向对象类似,不需详细学习 一.Java继承 继承可以使用 extends 和 implements 这两个关键字来实现继承. extends:类的继承是 ...

  7. java学习笔记(3)——面向对象

    this关键字 this是当前对象的引用,是运行期间当前对象本身. 可以使用this明确的访问当前对象的属性或者方法,类似于“我” this()可以调用本类的其他构造器,可以使用构造器的重用简化代码的 ...

  8. Java学习笔记-Java概述和环境配置

    基础常识 软件:一系列按照特定顺序组织的计算机数据 和指令的集合 常见的软件: 系统软件:如:DOS,windows,Linux等 应用软件:如:扫雷,迅雷,QQ等 软件的出现实现了人与计算机之间的更 ...

  9. java学习笔记----java入门

    java基础 一.java语言跨平台原理 1.什么是跨平台? 跨平台就是一个软件可以在不同的操作系统中运行,但是不需要对其修改.换句话说,java语言编写的软件在不做修改的情况下就能在不同的系统平台上 ...

随机推荐

  1. JS来推断文本框内容改变事件

       oninput,onpropertychange,onchange的使用方法 onchange触发事件必须满足两个条件: a)当前对象属性改变,而且是由键盘或鼠标事件激发的(脚本触发无效) b) ...

  2. iOS开发——UI篇OC篇&UIView/UIWindow/UIScreen/CALayer

    UIView/UIWindow/UIScreen/CALayer 1.UIScreen可以获取设备屏幕的大小. 1 2 3 4 5 6 7 // 整个屏幕的大小 {{0, 0}, {320, 480} ...

  3. ios--uitextfield动态限制输入的字数(解决方式)

    1.定义一个事件: -(IBAction)limitLength:(UITextField *)sender { bool isChinese;//推断当前输入法是否是中文 if ([[[UIText ...

  4. Spark on Yarn遇到的问题及解决思路

    原文:http://www.aboutyun.com/thread-9425-1-1.html 问题导读1.Connection Refused可能原因是什么?2.如何判断内存溢出,该如何解决?扩展: ...

  5. 中兴电信光纤猫F612管理员密码获取方法

    1.telnet 192.168.1.1 账号:root 密码:Zte521 2.输入命令: sendcmd 1 DB p DevAuthInfo 得到管理员账号密码如下: <DM name=& ...

  6. Ubuntu 下安装VNC server

    尽管我们在大部分情况下用ssh登录Ubuntu服务器就好了,但是有时候我们的程序需要在图形界面下运行,这时我们就要用到vnc server这个软件了.在Ubuntu下安装vnc server很简单的, ...

  7. css笔记01:CSS例子

    body { margin:0; padding:0; background:#000 url('images/backgrounds/star.png') no-repeat fixed; font ...

  8. 用DAEMON TOOLS打开rational ross 的bin文件并安装过程梳理

    最近要开始准备毕业设计了,学习熟悉了一些UML用例图.类图之类的,开始准备用自家PC电脑画图的时候发现Rational Ross没安装. 本以为简单,却碰上bin文件.琢磨好久,终于把Ross安上了. ...

  9. SQL 生成一个日期范围

    有时想按日或月生成一个序列,就像2014-1-1.2014-1-2.2014-1-3... 在sql server中可以写个函数来实现. /* 生成一个日期范围,如2014.01.2014.02... ...

  10. Python学习笔记 第二课 循环

    >>> movies=["The Holy Grail", 1975, "The Life of Brian", 1979, "Th ...