黑马程序员技术交流社区
标题:
【求助】关于初始化
[打印本页]
作者:
田旭阳
时间:
2012-9-10 18:04
标题:
【求助】关于初始化
本帖最后由 田旭阳 于 2012-9-11 18:28 编辑
各位高手看一下,这个有点不明白:
package com.test1;
public class ExplicitStatic {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Inside in main()");
Cups.cup1.f1(99);
}
}
class Cup
{
Cup(int marker)
{
System.out.println("Cup("+ marker+")");
}
void f1(int marker)
{
System.out.println("f1("+ marker+ ")");
}
}
class Cups
{
static Cup cup1;
static Cup cup2;
static {
cup1=new Cup(1);
cup2=new Cup(2);
}
Cups(){
System.out.println("Cups()");
}
}
/*output
Inside in main()
Cup(1)
Cup(2)
f1(99)
Cups这个对象的都没有创建,也就是没有用Cups cups=new Cups();
怎么就可以使用Cups.cup1.f(99);
他具体是怎么调用的?
我不是很明白。
谢谢!
作者:
孙沛
时间:
2012-9-10 18:38
本帖最后由 孙沛 于 2012-9-10 21:05 编辑
你的程序中定义了static Cup cup1;和 static Cup cup2;这两个静态变量随着类的加载而加载,意思就是Cups类加载的时候cup1和cup2也加载了,
这时对象还没加载。当调用Cups.cup1.f1(99);时,程序就直接找了Cups1.cup1。所以不需要新建对象的,画个图给你看看
如果用new Cup()时,则是在堆内存中建立一个对象,其实是不需要的,内存中已经有了cup1,cup2对象了
dd1.jpg
(26.66 KB, 下载次数: 38)
下载附件
2012-9-10 21:04 上传
作者:
王陶成
时间:
2012-9-10 18:49
因为cup1在cups里面是static修饰的
static修饰属性(类变量):
那么这个属性就可以用" 类名.属性名 "来访问,也就是使这个属性成为本类的类变量,为本类对象所共享。
类变量,会在加载时自动初始化,初始化规则和实例变量相同。
注意:
类中的实例变量是在创建对象时被初始化的
static修饰的属性,是在类加载时被创建并进行初始化,类加载的过程只进行一次,也就是类变量只会被创建一次。
作者:
Tesla时光
时间:
2012-9-10 21:59
首先要对二个知识点搞清楚.
一,方法是如何调用?
方法调用方式存在两种,一是对象调用.二种类直接调用.
二,static修饰方法时,具有什么特点?
一旦方法被static所修饰,那么其又具有一种特性,可以被类直接打点调,当然,也可以被对象调.
package com.test1;
public class ExplicitStatic {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Inside in main()");
Cups.cup1.f1(99);
//从这个语句可以看出,这是调用了一个方法,那么想想方法只能要么对象调,在么类直接调,
所以你折分出来方法f1(99)和前面的调用者,那么这个方法的前面的调用者Cups.cup1,要么是类名,要么是对象
Cups.cup1显然不是类名,所以,它只能是对象.
再折分:Cups是一个类名 cup1是一个静态成员变量,那么显然,类直接调用了这个成员,那么调用这个成员得到什么,
就要看这个成员代表什么?
cup1在类加载时,就通过静态代码块给其初始化了创建了一个对象 cup1=new Cup(1);那么cup1就代表一个对象
所以,Cups.cup1也就是代表一个对象,且是Cup的对象.
}
}
class Cup
{
Cup(int marker)
{
System.out.println("Cup("+ marker+")");
}
void f1(int marker)
{
System.out.println("f1("+ marker+ ")");
}
}
class Cups
{
static Cup cup1;
static Cup cup2;
static {
cup1=new Cup(1);
cup2=new Cup(2);
}
Cups(){
System.out.println("Cups()");
}
}
/*output
Inside in main()
Cup(1)
Cup(2)
f1(99)
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2