对象变量又称为引用变量,当声明一个对象类型的变量时并没有创建一个对象,此变量为空(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);
}
}
运行结果:
标签:初始化,Java,语言,System,Mid,println,程序设计,public,out From: https://www.cnblogs.com/yansans/p/16814708.html