课后作业3

动手动脑:

(1)以下代码为何无法通过编译?哪儿出错了?

答: 编译无法通过的原因是类的构造方法有一个参数,而生成对象的时候没有给对象一个参数,所以编译无法通过。如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。所以默认的构造方法不会出现。

(2)请运行TestStaticInitializeBlock.java示例,观察输出结果,总结出“静态初始化块的执行顺序”。

1 class Root
 2 {
 3     static{
 4         System.out.println("Root的静态初始化块");
 5     }
 6     {
 7         System.out.println("Root的普通初始化块");
 8     }
 9     public Root()
10     {
11         System.out.println("Root的无参数的构造器");
12     }
13 }
14 class Mid extends Root
15 {
16     static{
17         System.out.println("Mid的静态初始化块");
18     }
19     {
20         System.out.println("Mid的普通初始化块");
21     }
22     public Mid()
23     {
24         System.out.println("Mid的无参数的构造器");
25     }
26     public Mid(String msg)
27     {
28         //通过this调用同一类中重载的构造器
29         this();
30         System.out.println("Mid的带参数构造器,其参数值:" + msg);
31     }
32 }
33 class Leaf extends Mid
34 {
35     static{
36         System.out.println("Leaf的静态初始化块");
37     }
38     {
39         System.out.println("Leaf的普通初始化块");
40     }
41     public Leaf()
42     {
43         //通过super调用父类中有一个字符串参数的构造器
44         super("Java初始化顺序演示");
45         System.out.println("执行Leaf的构造器");
46     }
47
48 }
49
50 public class TestStaticInitializeBlock
51 {
52     public static void main(String[] args)
53     {
54         new Leaf();
55
56
57     }
58 }

  

答:

1.      当程序执行时,需要生成某个类的对象,Java执行引擎会先检查是否加载了这个类,如果没有加载,则先执行类的加载再生成对象,如果已经加载,则直接生成对象。

2.      在类的加载过程中,类的static成员变量会被初始化,另外,如果类中有static语句块,则会执行static语句块。static成员变量和static语句块的执行顺序同代码中的顺序一致。记住,在Java中,类是按需加载,只有当需要用到这个类的时候,才会加载这个类,并且只会加载一次。

3.      在生成对象的过程中,会先初始化对象的成员变量,然后再执行构造器。也就是说类中的变量会在任何方法(包括构造器)调用之前得到初始化,即使变量散步于方法定义之间。

4.     静态初始化块只执行一次。

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

进行试验

(1)请依据代码的输出结果,自行总结Java字段初始化的规律。

 public class InitializeBlockDemo {
 2
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7
 8         InitializeBlockClass obj=new InitializeBlockClass();
 9         System.out.println(obj.field);
10
11         obj=new InitializeBlockClass(300);
12         System.out.println(obj.field);
13     }
14
15 }
16
17 class InitializeBlockClass{
18     //下面这句在初始化块之前与之后,会影响到field字段的初始值
19     //public int field=100;
20
21     {
22         field=200;
23     }
24     public int field=100;
25     public InitializeBlockClass(int value){
26         this.field=value;
27     }
28     public InitializeBlockClass(){
29
30     }
31 }

  

答:java语言中对类数据的初始化的顺序为 构造函数>类后面的数据赋值>类前面的数据赋值

执行类成员定义时指定的默认值或类的初始化块,到底执行哪一个要看哪一个“排在前面”,排在前面的先执行。

执行类的构造函数。

类的初始化块不接收任何的参数,而且只要一创建类的对象,它们就会被执行。因此,适合于封装那些“对象创建时必须执行的代码”。

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

请编写代码验证你的想法。

public class CreateanObject {
 2       public  int num=110;
 3         private static int number=0;
 4         public CreateanObject(){
 5             number++;
 6         }
 7         public void out()
 8         {
 9             System.out.println("你已创建了"+number+"个对象");
10         }
11         public static void put(CreateanObject test){
12             System.out.print("    "+test.num);
13         }
14         public static void main(String[] args)
15         {
16             CreateanObject test = new CreateanObject();
17             CreateanObject test1 = new CreateanObject();
18             test.out();
19
20
21         }
22     }

  答:静态方法课以访问对象的实例,不过要求静态方法需要在参数列表中添加类的实体。然后才能在静态方法中访问对象的成员.

时间: 2024-08-06 17:15:31

课后作业3的相关文章

课后作业

课后作业 "类型转换"知识点考核-2 程序源代码: 1 class Mammal{} 2 class Dog extends Mammal {} 3 class Cat extends Mammal{} 4   5 public class TestCast 6 { 7      public static void main(String args[]) 8      { 9             Mammal m; 10             Dog d=new Dog();

数组课后作业

课后作业: 随机生成10个数,填充一个数组,然后用消息框显示数组,接着计算数组元素的和,将结果也显示在消息框中. 设计思路:首先使用random随机产生10个数,存储在数组中,然后使用for循环把数字存储在一个String对象中,再使用for循环求出数组中所有数字的和,最后用对话框输出内容. 程序流程图: 源程序代码: import javax.swing.*; public class Test1{ public static void main( String args[] ){ Strin

lhtjzC++征对视频教程的课后作业在哪里可以找到哦

⌒鉴闽 lhtjzC++征对视频教程的课后作业在哪里可以找到哦

异常处理---动手动脑及课后作业

动手动脑1:请阅读并运行AboutException.java示例,然后通过后面的几页PPT了解Java中实现异常处理的基础知识. 源码: import javax.swing.*; class AboutException { public static void main(String[] a) { int i=1, j=0, k; k=i/j; try { k = i/j; // Causes division-by-zero exception //throw new Exception

课后作业---字符串

一.课后作业一 1.设计思想:根据题意,首先提示输入要进行的操作:解密或加密,然后输入一个字符串,利用charAt()方法将改变的字母连接到结果上,加密:将前23个大小写字母+3,后3个-23强制转化为char:解密:后23个大小写字母-3,前3个+23.再根据结果进行改变,添加提示. 2.程序流程图: 3.源代码: package T4; //胡建峰,2016.10.25 //字串加密 import java.util.Scanner; public class Test { public s

TJU_SCS_C#课后作业(1)

一.作业要求 这是本学期C#课程学习的第一次课后作业,主要大体感受一下C#编程Visual Studio的界面以及一些基本操作.几乎所有编程语言的学习最初都是由hello world开始的,这次我所做的就是根据章老师上课的示范在控制台中显示hello world字样. 二.作业内容 这是一个很简单的代码,最主要的就一句Console.WriteLine("Hello World!"),我还根据章老师上课的示范对控制台的背景和前景进行了些许尝试. 三.课后思考 感觉C#编程语言和Java

课后作业5

动手动脑1:运行示例代码,查看结果,解释为什么是这个结果,从中你能总结出什么? 运行结果:tru truefalse 分析结果:s1,s2,s0均指向hello字符串常量的地址.所以在执行过程中,Java对于同一字符串是不会开辟新的空间的,而在最后的两者的内容虽然相同,但是他们的地址不同所以不等. 动手动脑2:查看String.equals()方法的实现代码 结果分析:s1==s2是判断地址和值,equals()仅仅判断值,s1,s2的值相同,但是地址不同,s3,s4的地址,内容都相同. 动手动

JAVA第三周课后作业

JAVA课后作业 一.枚举类型 代码: enum Size{SMALL,MEDIUM,LARGE}; public cl ass EnumTest { public static void main(String[] args) { Size s=Size.SMALL; Size t=Size.LARGE; //s和t引用同一个对象? System.out.println(s==t);  // //是原始数据类型吗? System.out.println(s.getClass().isPrimi

JAVA语法基础 动手动脑及课后作业

动手动脑1: 仔细阅读示例: EnumTest.java,运行它,分析运行结果? public class EnumTest { public static void main(String[] args) { Size s=Size.SMALL; Size t=Size.LARGE; //s和t引用同一个对象? System.out.println(s==t);  // //是原始数据类型吗? System.out.println(s.getClass().isPrimitive()); //

第七讲 数组动手动脑和课后作业

[动手动脑1] 数据作为方法参数示例代码 int[] arr= new int[ 24 ]; -- modifyArray( arr ); 阅读并运行示例PassArray.java,观察并分析程序输出的结果,小结,然后与下页幻灯片所讲的内容进行对照. // PassArray.java // Passing arrays and individual array elements to methods public class PassArray { public static void ma