类与对象课件问题解答

结果:true

 

结果:false

原因:当“==”施加于原始数据类型变量时,是比较变量所保存的数据是否相等。

         当“==”施加于引用类型变量时,是比较这两个变量是否引用同一对象。

         引用代表地址,所以“==”实际上相当于比较两个引用类型变量中保存的对象地址是否相同。

 

错误:构造方法有参,而main方法中new 后边的Foo()无参。

结论:如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。


package Test;
public class InitializeBlockDemo
{

/**
* @param args
*/
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�ֶεij�ʼֵ
//public int field=100;
{
field=200;
}
public int field=100;
public InitializeBlockClass(int value)
{
this.field=value;
}
public InitializeBlockClass()
{
}
}
结果:100
300

java字段初始化规律

在Java中定义一个类后,有三种方式可以对其中的变量进行初始化:直接输入,初始化块,构造函数。

而对于这三者的优先级,其应该是:

1.类的构造函数(构造方法)

当创建一个对象时,其构造函数就会自动调用。构造方法必须与类名相同,无返回值。

如果程序员没有定义一个构造函数时,系统会自动定义一个不含参数的“默认构造函数”,在自定义构造函数后就不再产生默认的构造函数了。

对于同一个类来说,可以有很多个构造函数,也就是所谓方法重载的运用。其之间可以相互调用。

2.类的初始化块

指的是在类中用{}括起来的几行代码,可以直接作为类的成员。多用于类中变量的初始化。

3.在执行类成员的时候默认给出的值


package Test;


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 TestStaticInitializeBlock
{
public static void main(String[] args)
{
new Leaf();
}
}

结果

Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:Java初始化顺序演示
Leaf的普通初始化块
执行Leaf的构造器

结论:java静态初始化块的执行顺序,首先是各个类的静态初始化块先按照先父类后子类的顺序先后执行;

然后再次由父类到子类开始依次执行它们的普通初始化块和无参构造器,若是子类初始化中需要为父类传参,

那么在执行子类普通初始化内容前就要先执行父类的含参构造函数。

静态初始化块只执行一次。 创建子类型的对象时,也会导致父类型的静态初始化块的执行。

 

问题:

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

 

类的静态方法是不能直接访问实例的成员的,它只能访问同类的静态成员。访问实例的成员的话,可以把静态方法的参数设置为类的实例,这样通过参数传递的方式就可以访问实例的成员了,例子如下:

package trr;

public class trr
{

public static void main(String[] args)
{
x w;
w=new x();
x.show(w);//直接用类名调用静态方法
}
}
class x
{
int num=10;
static void show(x n) //参数设置为类的实例

{
System.out.println(n.num); //访问实例的成员
}

}
posted @ 2022-10-04 10:59  Men!  阅读(19)  评论(0编辑  收藏  举报