静态语句块有什么用

java的,举个例子... java的,举个例子 展开
 我来答
我宜4507
2009-10-08 · TA获得超过979个赞
知道小有建树答主
回答量:1852
采纳率:0%
帮助的人:950万
展开全部
1.static的用法:

static用于修饰:属性,方法,语句块,内部内

语句块:在类内直接有大括号{},括号内有语句

内部类:类内有另外的类

作用:如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象,声明为static的变量实质上就是全局变量,所以对象共享。(类相关:类属性,类方法)

内存池:常驻内存,反复利用(数据库连接池常用)

静态池:static属性

class A{

static int b = 0;

}

A a1 = new A();

A a2 = new A();

内存图:栈:a1,a2,分别指向堆内的两个对象

堆:new A(),new A(),分别指向静态池中的静态值0

静态池:0

静态的属性/方法可以按照以下两种方式调用:

a.new 对象(), 对象. 调用

b.不创建对象,直接用类名.调用

静态的属性/方法是在类加载时完成处理的,静态语句块仅在类加载时调用一次,非静态语句块在对象创建时调用。加载发生的条件:new 对象(声明不加载类,也不创建对象)

类名.调用属性/方法

静态方法的特征:

类名.调用

静态方法不能使用非静态变量,也不能调用非静态方法,反之可以

父类静态方法只能被子类静态方法重写,发生多态时,静态方法调用父类重写前的

例子1:父类静态方法只能被子类静态方法重写,发生多态时,静态方法调用父类重写前的

public class Super {
public static void test(){
System.out.println("super");
}
public static void main(String[] args) {
Super s = new Sub();
s.test(); //发生多态是调用重写前的,得super,相当于Super.test();
}
}
class Sub extends Super{
public static void test(){ //只能被子类静态方法重写
System.out.println("sub");
}
}

例子2:静态语句块仅在类加载时调用一次,非静态语句块在对象创建时调用,加载发生的条件:new 对象, 类名.调用属性/方法,声明不加载类,也不创建对象

public class TestBlock {
static int i;
static{ //静态语句块
System.out.println("classLoading...");
}
{ //非静态语句块
System.out.println("instance");
}

}

public class Test {
public static void main(String[] args) {
System.out.println("begin");
TestBlock tb; //声明既不加载类,也不创建对象
System.out.println("declear");
tb = new TestBlock(); //new对象,加载类,并创建对象
System.out.println("over");
TestBlock.i = 9;
System.out.println(TestBlock.i);
}
}

所以打印的结果:begin
declear
classLoading...
instance
over
9

但是以下将main方法和类写在一起,所得结果注意:

public class TestBlock {
static int i;
static{
System.out.println("classLoading...");
}
{
System.out.println("instance");
}
public static void main(String[] args) {
System.out.println("begin");
TestBlock tb;
System.out.println("declear");
tb = new TestBlock();
System.out.println("over");
TestBlock.i = 9;
System.out.println(TestBlock.i);
}
}

所以打印的结果:classLoading...
begin
declear
instance
over
9

例子3: 静态方法不能使用非静态变量,也不能调用非静态方法,反之可以

public class TestMethod {
int i1 = 0;
static int i2 = 0;
public void test1(){
i1 = 0; //非静态方法可以使用非静态变量
i2 = 0; //非静态方法也可以使用静态变量
System.out.println("no static");
}
public static void test2(){
//i1 = 0; //静态方法不能使用非静态变量
i2 = 0; //静态方法可以使用静态变量
System.out.println("static");
}
public static void main(String[] args) {
TestMethod.test2(); //静态方法可以直接用类名.调用
//TestMethod.test1(); //非静态方法不能直接调用,需要new对象来调用
}
}

例子4:static变量是全局变量,每个对象共享

public class TestField {
static int i1 = 0; //类变量
int i2 = 0; //实例变量
public TestField(){
i1++;
i2++;
}
public static void main(String[] args){
System.out.println(TestField.i1); //0
TestField tf1 = new TestField();
TestField tf2 = new TestField();
System.out.println(tf1.i1); //2
System.out.println(tf2.i1); //2
System.out.println(tf1.i2); //1
System.out.println(tf2.i2); //1
}
}

需要说明的是:类名.调用的时候,只类加载,不创建对象,所以不执行构造器中的代码,所以结果为0

i1为全局变量,每次创建对像的时候,执行构造器中的代码,数据更新一次,所以结果为2

i2为实例变量,每个用户访问数据都不变,只执行一次构造器中的代码,所以结果为1

例子5:Singleton 单例设计模式:类外只能有一个对象

私有构造:private 构造

提供一个static方法,返回本类对象

单例的目的:保证一个类只有单一的实例,也就是说你无法通过new来创建这个类的一个新实例。

单例的好处:当一个对象在程序内部只能有一个实例的时候,它可以保证我们不会重复创建,而是始终指向同一个对象

代码:

第一种:在声明变量时实例化(也叫饿汉式单例模式),代码如下:

public class Singleton {

private static Singleton instance = new Singleton();

private Singleton(){}

public static Singleton getInstance() {

return instance;

}

}

第二种:把对象的创建放到方法里面去(也叫懒汉式单例模式),代码如下:

public class Singleton {

private static Singleton instance = null;

private Singleton(){}

public static synchronized Singleton getInstance() {

//也可以这样写:synchronized public static Singleton getInstance() {

if (instance == null){

instance = new Singleton();

}

return instance;

}

}

各自的优缺点:

第一种饿汉式:

优点:在类加载初始化的时候就创建对象,调用getInstance的时候,没有同步方法,运行时性能较高。

缺点:类加载速度慢,占用太多大的资源空间。

第二种懒汉式:

优点:避免了第一种方式的缺点, 同时,可以在多线程下运行安全。

缺点:因为他使用了锁,在运行中效率慢。

测试:

public class Test {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s3 = Singleton.getInstance();
System.out.println(s1==s3);
}
}

运行的结果:true

2.final的用法:

final用于修饰:类,方法,变量(包括成员变量和局部变量)

final的类无法继承,例:String/System类不可继承

final的方法无法重写/覆盖,final类中所有方法都无法重写,因为final类无法继承

final的变量必须显示赋值一次(only one)

父类中非final的方法可以在子类中重写为final的方法

final的属性没有set方法,可以有get方法,赋值可以直接赋,也可以在构造中赋

只用final修饰的不是常量,因为final只管一层

常量: 用static+final修饰的属性变量必须声明的同时赋初值,而且访问权限为public

public static final int LIMIT = 9999; 常量名所有字母都大写,不同单词之间用下划线隔开

例子1:

public /*final*/ class Super {
public /*final*/ void test(){}
}
class Sub extends Super{
public final void test(){}
}
Storm代理
2023-08-29 广告
"StormProxies是全球大数据IP资源服务商,其住宅代理网络由真实的家庭住宅IP组成,可为企业或个人提供满足各种场景的代理产品。点击免费测试(注册即送1G流量)StormProxies有哪些优势?1、IP+端口提取形式,不限带宽,I... 点击进入详情页
本回答由Storm代理提供
freish
推荐于2016-10-12 · TA获得超过2878个赞
知道大有可为答主
回答量:3153
采纳率:0%
帮助的人:2679万
展开全部
public class Test {
private Test(){}
private static int num;
static {
//可能你的这个类是单例的,外界没办法调用构造方法,而你需要给num赋值,而又不是简单的赋值,需要从数据库中查询再赋值,就可以在这里做了
String sql = "select count(*) from table";
....

num = rs.getInt(1);
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式