1.早期我们经常这样定义变量
int value=100;
前面的示例中这样定义变量
MyClass.obj=new MyClass();
这两种方式定义的变量是一样的吗?
不一样的 第一个定义的是原始数据类型变量,在定义是为变量开辟了空间
第二个定义了变量并用构造方法为他开辟内存空间;
2.对于原始数据类型的变量(比如int)可以直接使用==判断两笔昂两值是否相等 对象变量也可以使用==判断两变量值是否相等吗?
不能
对于原始数据类型 比较的是值是否相等二对于对象变量则是比较的所保存的对象地址是否一样
3.
请总结一下,这个方法有哪些与众不同之处,你能列出几条?
方法名与类名相同 方法名首字母大写
4.
以下代码为何无法编译?哪出错了?
引用构造方法new Foo()时缺少参数。
如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。所以可以将“Foo obj1 = new Foo();”改为“Foo obj1 = new Foo(4);”。
5.如果一个类中既有初始化块,又有构造方法,同时还设定了字段的初始值,谁说了算?
执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”。执行类的构造函数。类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。
6.使用商业幻灯片中定义的类,以下代码输出结果是什么?
请依据代码的输出结果,自行总结|JAVA字段初始化规律
运行结果:
初始化规律:按照顺序初始化,如果有多个方法对字段初始化,将按照最后一次初始化输出。
7.观察输出结果,总结出“静态初始化块的执行顺序”
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(); } }
静态块在第一个对象创建时运行
初始化块在每个对象创建时运行
区别是静态块只执行一次,操作的内存在静态区
初始化块每个对象构造时都需要执行一次,操作的内存在用户区
8.如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或法)?
请编写代码验证你的想法(发表博客)
public class Test2 { public static void main(String[] args) { Test t=new Test(); int a=t.getyear(); t.input1(); Test.input(a); t.input(a); } } class Test { int year = 100; public int getyear() { return year; } public static void input(int a) { System.out.println("静态"+a); } public void input1() { System.out.println("实例"); } }
9.使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”
package demo; //查询创造对象数 public class Newnum { public static void main(String[] args) { C one = new C();//在其中添加双斜线或去掉验证 C two = new C(); //C three = new C(); System.out.println("你已创建了" + one.get() + "个对象"); } } class C { static int shu = 0;//计数 C() { shu ++; } int get() { return shu; } }