`

java 用 static修饰属性,以及线程

    博客分类:
  • java
阅读更多

1. What will happen when you attempt to compile and run the following code?


public class Tux extends Thread {
static String sName = "vandeleur";
public static void main(String argv[]) {
Tux t = newTux();
t.piggy(sName);
System.out.println(sName);                           //静态属性的调用,不改变原来的值,Tux.sName="abc"可以改变静态值。 而实例属性,值会跟着改变。
}
public void piggy(String sName){
 sName = sName + " wiggy";                   //不会改变静态属性值
start();
}
public void run(){
for(int i=0;i<4; i++) {
sName = sName + "" + i;
}
}
}
A) Compile time error
B) Compilation and output of "vandeleur wiggy"
C) Compilation and output of "vandeleur wiggy 0 12 3"
D) Compilation and probably output of "vandelur" but possible output of "vandeleur 0 1 2

 

D是正确的。注意线程的使用,是无序执行的,所以sName也会跟着变

 

静态方法
通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。

静态变量
静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一

块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。

 

class Value{static int c=0;static void inc(){c++;}}
class Count{public static void prt(String s){System.out.println(s);}
public static void main(String[] args){
Value v1,v2;v1=new Value();
v2=new Value();
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c); }} 

//结果如下:
v1.c=0 v2.c=0
v1.c=1 v2.c=1

 

 

class Value{static int c=0;Value(){c=15;}
Value(int i){c=i;}static void inc(){c++;}
}
class Count{public static void prt(String s){System.out.println(s);}
Value v=new Value(10);
static Value v1,v2;

static{prt("v1.c="+v1.c+" v2.c="+v2.c);                            //static 程序块
v1=new Value(27);prt("v1.c="+v1.c+" v2.c="+v2.c);
v2=new Value(15);prt("v1.c="+v1.c+" v2.c="+v2.c);}

public static void main(String[] args){

Count ct=new Count();

prt("ct.c="+ct.v.c);

prt("v1.c="+v1.c+"

v2.c="+v2.c);

v1.inc();

prt("v1.c="+v1.c+" v2.c="+v2.c);

prt("ct.c="+ct.v.c);}}

 

结果如下:

v1.c=0 v2.c=0
v1.c=27 v2.c=27
v1.c=15 v2.c=15
ct.c=10
v1.c=10 v2.c=10
v1.c=11 v2.c=11
ct.c=11

 

static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中

所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在

static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一

次,且在类被第一次装载时。

 

 

 

 

 

分享到:
评论

相关推荐

    java static方法 引用static属性 存在线程安全问题-原理分析

    Java中的静态方法和静态属性是线程安全问题的常见触发点。线程安全问题通常发生在多个线程同时访问和修改共享资源时,如果没有适当的同步机制,可能会导致数据不一致或出现不可预测的结果。 首先,我们要理解`...

    Java 模拟线程并发

    在Java中,线程并发可以通过多种方式实现,包括继承Thread类、实现Runnable接口以及使用ExecutorService和Future等高级API。下面将详细探讨这些知识点。 首先,Java中创建线程主要有两种方法。一种是通过继承Thread...

    Java访问修饰符

    "Java 访问修饰符详解" Java 访问修饰符是 Java 编程语言中的一种重要机制,它控制着类、方法和变量的访问权限。访问修饰符可以分为四种:public、protected、private 和缺省(无访问修饰符)。 public 访问修饰符...

    java常用的修饰符

    Java修饰符是编程中至关重要的概念,它们用于定义类、接口、变量和方法的访问权限、行为和特性。本文将详细介绍Java中常见的修饰符及其用途。 1. **类的修饰符** - **public**: 公共访问控制符,允许任何地方的...

    java视频 static关键字

    在Java编程语言中,`static`关键字是一个非常重要的修饰符,它有多种用途,涉及到类、对象以及变量和方法的生命周期。本视频教程详细讲解了`static`关键字在Java中的应用及其背后的原理。 首先,我们要理解`static`...

    java线程.pdf

    根据提供的信息,我们可以推断出这份文档主要关注的是Java线程的...理解线程的创建、生命周期管理以及线程间的同步和通信机制对于开发高质量的Java应用至关重要。希望以上内容能够帮助您更好地掌握Java线程的相关知识。

    JAVA访问修饰符大归纳

    根据 JAVA 访问修饰符的特性和使用范围,我们可以将其分为三类:修饰符类的访问修饰符、属性的访问修饰符和方法的修饰符。 一、修饰符类的访问修饰符 修饰符类的访问修飾符共有四种:默认、public、abstract 和...

    Java编程中常用修饰词使用方法

    Java 编程中常用修饰词使用方法 Java 语言中定义了 11 个常用的修饰词,每个修饰词都有其特定的使用场景和作用。下面对这 11 个 Java 修饰词进行详细的介绍: 1. public 修饰词 修饰对象:类、接口、成员 介绍:...

    Java入门——Java修饰词总结

    Java作为一门广泛使用的编程语言,拥有丰富的语法结构和关键字,其中修饰词(modifiers)是Java语言中的重要组成部分,用于限定类、方法、字段等的访问级别、生命周期以及特性。以下是对Java中11个修饰词的详细介绍...

    第04章 面向对象(上) 10 Static关键字修饰属性和方法

    在Java中,`static`关键字是面向对象编程的一个重要组成部分,它用于修饰类的成员变量和成员方法。本章节将深入探讨`static`关键字在Java中的应用及其原理。 首先,我们要理解`static`关键字的基本概念。`static`...

    Java修饰符总结

    在Java中,某些修饰符可以组合使用,如`public static`、`protected final`等,以达到更精细的控制效果。例如,`public static`方法表示该方法是公共的且与类实例无关,而`protected final`变量则表示受保护的且不可...

    Java重写重载线程

    ### Java中的方法重载与重写以及线程概念详解 #### 一、方法重载(Overloading) 在Java中,**方法重载**是指在同一个类中定义多个具有相同名称但参数列表不同的方法。这里提到的“参数列表不同”不仅包括参数的...

    java修饰符介绍

    在Java编程语言中,修饰符是用来限制或指定代码元素(如类、方法、变量)的访问权限、特性或行为的关键词。以下是对标题和描述中提及的Java修饰符及其相关知识点的详细介绍: 1. 类的访问控制修饰符: - **public*...

    java 多线程

    Java中的线程优先级用整数表示,范围从1(`MIN_PRIORITY`)到10(`MAX_PRIORITY`),默认优先级是5(`NORM_PRIORITY`)。但实际执行时,线程调度受操作系统调度策略影响,不一定优先级高的线程先执行。 六、线程...

    Java线程讲解Java线程讲解

    本篇内容将围绕Java线程的基础知识、创建方式、生命周期以及线程同步等核心概念进行深入探讨。 #### 一、Java线程基础知识 1. **线程与进程的区别**:线程是进程中可独立调度和执行的基本单元,而进程则是资源分配...

    JAVA线程深入了解

    ### JAVA线程深入了解 #### 一、JAVA线程启动方式详解 ##### 1. 利用`Thread`类的子类启动线程 在Java中,可以通过继承`Thread`类来创建一个新的线程。这种方式相对直观,易于理解。具体做法是创建一个`Thread`类...

    java实现音频文件播放功能

    对象共用被static修饰的代码和属性。需要注意static的使用,以免出现问题。 七、代码实现 在代码实现中,使用了JFrame、JLabel、JComboBox和JButton等控件来实现界面。使用了listener来监听按钮的点击事件,并实现...

    JAVA多线程编程技术探讨.pdf

    1. **使用`synchronized`关键字**:可以修饰方法或者代码块,确保同一时刻只有一个线程可以访问被标记为同步的方法或代码块。 ```java public class SynchronizedExample { private int counter = 0; public ...

    java多线程关键字final和static详解

    在上面的例子中,我们使用static关键字修饰了value变量,以确保该变量的值在多线程环境中是一致的。 四、结论 在本文中,我们探讨了final和static关键字在Java多线程编程中的应用和特点。final关键字可以确保对象...

Global site tag (gtag.js) - Google Analytics