对象变量又称为引用变量,当声明一个对象类型的变量时并没有创建一个对象,此变量为空(String str = null),但是当定义一个原始类型的变量时会马上为其分配内存(int i = 100):在定义一个(对象)变量时必须显式初始化,否则无法通过编译

 

当对象不再使用时JVM会回收对象所占的内存,即内存回收。

在对象中,“=”是指将对象地址的复制,相当于两个指针指向同一个内存空间,并没有进行新对象的创建

同理“==”比较的也是内存空间的地址二不是两个对象内容是否一致,因此需要通过equals()方法来进行对象判等。

当定义一个类的时候如果不显式的知名父类,则默认其父类是Object;Object是Java的最顶层基类,equals()就是在其中定义的。

 

类的构造方法与C中的构造函数类似。

 

代码如下:

public class Main {
public static void main(String[] args) {
InitializeBlockClass obj = new InitializeBlockClass();
System.out.println(obj.field);

obj = new InitializeBlockClass(300);
System.out.println(obj.field);
}
}

class InitializeBlockClass{
{
field = 200;
}
public int field = 100;
public InitializeBlockClass(int value){
this.field = value;
}
public InitializeBlockClass(){}
}
运行截图:

 

由上图可知,在类中进行field的赋值之后第一次调用无参构造方法生成对象,此时field的值并没有发生改变依旧为100

之后调用有参方法生成对象,此时对field进行了第一次赋值,field值更改为300;field = 200;的语句并未被使用。

 

静态初始化块的执行顺序:

代码如下:

class Root
{
static
{
System.out.println("Root的静态初始化块");
}
{
System.out.println("Root的普通初始化块");
}
public Root()
{
System.out.println("Root的无参数的构造器");
}
}
class Mid extends Root
{
static
{
System.out.println("Mid的静态初始化块");
}
{
System.out.println("Mid的普通初始化块");
}
public Mid()
{
System.out.println("Mid的无参数的构造器");
}
public Mid(String msg)
{
//通过this调用同一类中重载的构造器
this();
System.out.println("Mid的带参数构造器,其参数值:" + msg);
}
}
class Leaf extends Mid
{
static
{
System.out.println("Leaf的静态初始化块");
}
{
System.out.println("Leaf的普通初始化块");
}
public Leaf()
{
//通过super调用父类中有一个字符串参数的构造器
super("Java初始化顺序演示");
System.out.println("执行Leaf的构造器");
}

}

public class Main {
public static void main(String[] args) {
new Leaf();
}
}
运行截图:

 

Leaf继承自Mid,Mid继承自Root;

由图可以看到,创建Leaf对象时首先执行的是爷类的静态初始化块,之后是父类的静态初始化块,最后是子类的静态初始化块;之后执行爷类的普通初始化块和无参构造器,然后是父类的普通初始化块和无参构造器,因为子类使用了super语句所以调用了父类的有参构造器;最后是子类的普通初始化块和无参构造器

因此我们得知,首先按照继承顺序依次调用静态初始化块,之后再次按照继承顺序一次调用静态初始化开和构造器,如果子类使用了super语句那还需要相应调用父类的有参构造器。

 

静态方法中只允许访问静态数据, 那么,如何在静态方法中访问类的实例成员(即使是没有附加static关键字的字段会方法)?

代码:

public class Main {
public static void main(String[] args) {
Main.Method();
Main ex = new Main();
System.out.println("x = " + ex.x);
}
int x = 10;
static int y = 20;
public static void Method() {//静态方法
System.out.println("实例变量x = " + new Main().x);
System.out.println("静态变量y = " + y);
}
}
运行结果:

 

原文地址:http://www.cnblogs.com/yansans/p/16814708.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性