静态类(static class)即定义了静态方法,静态变量,静态代码块或者内部静态类的类。这些静态成员不需要实例化即可直接引用。
- 静态方法:不需要实例化,可直接引用。
- 静态变量:不需要实例化,可直接引用。
- 静态代码块:在系统初始化时时使用
- 静态内部类:不能操作访问外部数据。
静态的类在运行时加载到内存中,不需要实例化,在类的内部也不能使用this。
1. 在类中生命一个方法为static,可以直接点用词方法,而不需要对该类进行实例化,调用格式为“类名.静态方法名”
2.如果在类中定义了静态变量(static field),在类装载时,只分配一块存储空间。也就是说对于该类的所有对象,都是在操作同一块存储空间。示例代码如下:
(1) StaticClass.java文件
package com.chensl.staticTest; public class StaticClass { public static int i = 0; public static int j = 0; public static void addTest(){ i++; } }
(2)StaticClassTest.java文件
package com.chensl.staticTest; public class StaticClassTest { public static void main(String[] args) { StaticClass sc1,sc2; sc1= new StaticClass(); sc2= new StaticClass(); System.out.println("sc1.i = "+sc1.i+" sc2.i = "+sc2.i); System.out.println("sc1.j = "+sc1.j+" sc2.j = "+sc2.j); sc1.i++; sc1.j--; System.out.println("sc1.i = "+sc1.i+" sc2.i = "+sc2.i); System.out.println("sc1.j = "+sc1.j+" sc2.j = "+sc2.j); System.out.println("StaticClass.i = "+StaticClass.i+" StaticClass.j = "+StaticClass.j); } }
3.静态代码块
静态代码块有点类似于C中的全局变量的概念,修改上面示例代码如下:
(1)StaticJava.java文件
package com.chensl.staticTest; public class StaticClass { public static int i = 0; public StaticClass(){ i=15; } public StaticClass(int n){ i=n; } public static void addTest(){ i++; } }
(2)StaticJavaTest.java文件
package com.chensl.staticTest; public class StaticClassTest { StaticClass sc=new StaticClass(10); static StaticClass sc1,sc2; //静态代码块在系统启动时自动加载执行 static{ System.out.println("初始化:sc1.i= "+sc1.i +" sc2.i= "+ sc2.i); sc1 = new StaticClass(27); System.out.println("初始化:sc1.i= "+sc1.i +" sc2.i= "+ sc2.i); sc1 = new StaticClass(15); System.out.println("初始化:sc1.i= "+sc1.i +" sc2.i= "+ sc2.i); } public static void main(String[] args) { // TODO Auto-generated method stub StaticClassTest test = new StaticClassTest(); System.out.println("sc1.i= "+sc1.i); System.out.println("sc1.i= "+sc1.i +" sc2.i= "+ sc2.i); StaticClass.addTest(); System.out.println("sc1.i = "+sc1.i+" StaticClass.i = "+StaticClass.i); } }
注,以上有些字段的访问可以不用声明对象,而直接使用静态类名即可
4.静态内部类
static 不但可以添加到字段、方法、静态模块中,还可以添加到类名称前,将类声明为静态的,不过普通类不可以声明为static,只有内部类才可以声明成static,这时,这个声明的静态内部类可以直接使用,而不需要实例化外部类。
使用内部类可以把一个类隐藏在另外一个类的内部,且不需要内部类引用外围类的对象。声明在接口中的内部类,自动成为static和public
简单静态内部类示例:
package com.chensl.staticTest; public class InnerClassTest { //定义一个内部静态类 public static class InnerClass{ InnerClass(){ System.out.println("InnerClass"); } public void print(String string){ System.out.println(string); } } public static void main(String[] args) { // TODO Auto-generated method stub //引用静态内部类 InnerClassTest.InnerClass IC = new InnerClassTest.InnerClass(); IC.print("this is a test"); } }
输出结果为:
InnerClass
this is a test
典型静态内部类范例:计算数组中最小值和最大值的问题。
package com.chensl.staticTest; /** * This program demonstrates the use of static inner classes. * @version 1.01 2004-02-27 * @author Cay Horstmann,添加部分注释by_村夫 */ public class StaticInnerClassTest { public static void main(String[] args) { double[] d = new double[20]; for (int i = 0; i < d.length; i++){ d[i] = 100 * Math.random(); System.out.println("d["+i+"]= "+d[i]); } ArrayAlg.Pair p = ArrayAlg.minmax(d); System.out.println("min = " + p.getFirst()); System.out.println("max = " + p.getSecond()); } } class ArrayAlg { /** * 内部静态类,在内部类不需要访问外围对象的时候,应该使用静态内部类, * 有的使用嵌套类(nested class)表示静态内部类 * A pair of floating-point numbers */ public static class Pair { /** * Constructs a pair from two floating-point numbers * @param f the first number * @param s the second number */ public Pair(double f, double s) { first = f; second = s; } /** * Returns the first number of the pair * @return the first number */ public double getFirst() { return first; } /** * Returns the second number of the pair * @return the second number */ public double getSecond() { return second; } private double first; private double second; } /** * 通过使用静态内部类,经过一次遍历,可以找到最大最小值两个结果,并返回。如果只使用方法, * 一次只能返回一个类,所以需要遍历两次数组,才能找到最大值和最小值 * Computes both the minimum and the maximum of an array * @param values an array of floating-point numbers * @return a pair whose first element is the minimum and whose second element * is the maximum */ public static Pair minmax(double[] values) { double min = Double.MAX_VALUE; double max = Double.MIN_VALUE; for (double v : values) { if (min > v) min = v; if (max < v) max = v; } return new Pair(min, max); } }
发表评论
-
Java添加UTF-7字符集支持(转)
2014-08-16 16:20 866这段时间在做PushServer时,需要对编码过的邮件标题及 ... -
问题记录
2012-05-02 20:58 451. 如何使java打印byte类型数据? 如: / ... -
利用java反射机制实现IoC容器
2011-07-05 17:44 0P717 -- P719 -
网址资源保存
2011-05-18 18:20 90xwork 下载地址: http://release.ope ... -
JAVA工具类(暂保存草稿,如果发表的话需要分别修改验证工具类内容)
2010-09-15 00:02 0(暂保存草稿,如果发表的话需要分别修改验证工具类内容) ... -
Collection之映射表(Maps)
2010-09-07 11:08 1366映射表(map)用来存放键/值对,如果提供了键,就能够找到值, ... -
Collection之双端队列与优先级队列(Priority queue)
2010-09-06 10:28 1989双端队列 在Java SE6中,引入了Deque接口,并由A ... -
Collection之树集(TreeSet)
2010-09-04 23:50 1127TreeSet与HashSet类似,不过TreeSet是一个有 ... -
Collection之散列表(hash table)
2010-09-04 22:10 903链表和数组中元素是按一定次序进行排列的,散列表不在意元素的顺序 ... -
Collection之数组列表
2010-09-02 17:52 882数组列表(ArrayList)和上文中介绍的链表(Li ... -
Collection之链表
2010-09-02 11:00 903在Java语言中,所有的链表都是双向链接的(doubly li ... -
Concrete Collection集合概要
2010-09-02 00:22 776Java类库中的具体的集合: ArrayList 一种可以 ... -
泛型代码与虚拟机
2010-08-31 22:27 856虚拟机没有泛型对象,所有对象都属于普通类,使用当前Sun的编译 ... -
JAVA集合接口
2010-08-31 16:49 1277集合接口,JAVA集合类库 ... -
Java数据结构和算法--树(转)
2010-08-25 18:16 750(1)二叉树 class Tree { cl ...
相关推荐
### Java 利用反射获取内部类静态成员变量的值操作 #### 一、引言 在Java编程中,反射是一个非常强大的工具,它允许程序在运行时检查类、接口、字段和方法的信息,并且能够创建和操作对象。本文将详细介绍如何使用...
2. **不能访问外部类的非静态成员**:由于静态内部类与外部类的静态属性和方法处于相同的静态上下文中,因此静态内部类无法访问外部类的非静态成员变量或方法。 3. **命名空间独立**:静态内部类有自己的命名空间,...
Java语言中的静态内部类,也称为嵌套类,是内部类的一种特殊形式,它与非静态内部类(也称为成员内部类)相比有着独特的特点和使用场景。在深入探讨其使用规范之前,我们先理解静态内部类的基本概念。 静态内部类不...
注意,Kotlin中的`companion object`常用于模拟Java中的静态成员,而`object`关键字则可以创建单例对象,同时包含类的静态方法和属性。 对比Java和Kotlin,我们可以看到Kotlin的语法更简洁,更符合面向对象的设计...
在静态嵌套类内部,不能访问外部类的非静态成员变量,这是由 Java 语法中“静态方法不能直接访问非静态成员”所限定。若想访问外部类的变量,必须通过其他方法解决。由於这个原因,静态嵌套类使用很少。 三、非静态...
Java 中的静态变量、静态方法、静态块和静态类 Java 中的静态变量、静态方法、静态块和静态类是 Java 编程语言的四个重要概念,它们之间存在着紧密的关系。下面将对这四个概念进行详细的介绍。 一、静态变量...
内部类可以分为四种类型:静态内部类、成员内部类(非静态内部类)、局部内部类和匿名内部类。 1. **静态内部类**: 静态内部类与普通的成员内部类不同,它不持有对外部类的引用。因此,可以像其他静态成员一样,...
Java中的静态内部类(Static Class),也称为嵌套静态类,是Java语言提供的一种独特机制,它允许我们在一个外部类内部定义一个静态的类。这种类的声明前面带有`static`关键字,与普通的内部类(非静态内部类)有所...
2. **访问限制**:静态内部类只能访问外部类的静态成员(包括变量和方法),而不能访问外部类的非静态成员。这是因为静态内部类并不依赖于外部类的实例,因此不能访问非静态成员。 3. **命名空间**:静态内部类和...
总之,内部类和静态内部类是Java中独特的类设计方式,它们提供了灵活的代码组织和访问控制手段。成员内部类适合处理需要紧密关联的情况,而静态内部类则适用于实现工具类或辅助功能,并且在单例模式中有独特的优势。...
- 不同类型的内部类(静态内部类、成员内部类、局部内部类和匿名内部类)的区别和用法 - 内部类的优缺点以及使用场景 这些目标将帮助你理解和掌握内部类的概念,并能够在适当的时候使用内部类来解决问题...
静态嵌套类不能访问外部类的非静态成员变量和方法,但是可以访问外部类的静态成员变量和方法。 方法内部类 方法内部类是指定义在外部类的方法中的内部类。方法内部类可以访问外部类的所有成员变量和方法,包括私有...
静态内部类可以访问外部类的静态成员变量和静态成员方法,同时也可以被外部类访问。 匿名内部类是指没有名称的内部类。匿名内部类可以访问外部类的成员变量和成员方法,同时也可以被外部类访问。 内部类是Java编程...
- 静态内部类和成员内部类在内存管理上有差异,静态内部类不会引起外部类的实例化,而成员内部类会。 - 匿名内部类不能包含任何静态声明,因为它们没有名称。 总的来说,Java 内部类是强大且灵活的工具,有助于构建...
静态内部类不能访问外部类的非静态成员和非静态方法。 静态内部类与其它内部类的区别在于非静态内部类在编译完成之后会隐含地保存一个引用,该引用是指向创建它的外部类,但是静态内部类却没有。静态内部类只是嵌套...
3. 静态内部类:静态内部类是指在外部类的静态成员中定义的内部类。 4. 匿名内部类:匿名内部类是指没有名字的内部类,通常用在创建实例时使用。 为什么需要内部类? 内部类提供了某种进入其外围类的窗口。使用...
静态内部类可以拥有静态成员变量和静态方法。由于静态内部类不依赖于外部类的实例,因此可以直接通过外部类名访问其静态成员。例如,在 `AccessStaticInnerClass` 类中,我们可以通过 `StaticInnerClass.prop1` 的...
1. **分类**:成员内部类分为两种,静态内部类(Static Inner Class)和非静态内部类(Non-static Inner Class)。非静态内部类可以直接访问外部类的实例变量和方法,而静态内部类不能直接访问,需要通过外部类的...
4. **静态内部类成员**:静态成员内部类的成员变量和方法都是静态的。 #### 四、局部内部类 局部内部类是在方法或构造函数内部定义的类,具有以下特点: 1. **访问权限**:局部内部类可以访问方法内的局部变量,...
总结来说,Java SE中的静态内部类提供了一种在同一个源文件中组织和封装代码的手段,它可以方便地访问外部类的静态成员,并且可以像其他静态成员一样被外部类的静态方法直接引用。在设计上,它们通常用于实现与外部...