Java 编程思想 第五章 初始化与清理 上

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 编程思想 第五章 初始化与清理 上相关的知识,希望对你有一定的参考价值。

 

 

 

  休整几天,闲了蛋疼也没写文章,这开学了坚持每天写//

  必须的天天写。不敢再松懈了。羡慕一好朋友能坚持的静下心来学习。

 

 

  5.1  用构造器确保初始化

    在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化。

      创建对象时,如果其类具有构造器,Java就会在用户有能力操作兑现之前自动调用相应的构造器,从而保证了初始化的进行。

      当然了 接下来的我们需要的问题是:

      1、所取的任何名字都可能与类的某个成员名称相冲突;

      2、调用股早期是编译器的责任,所以必须让编译器知道应该调用哪个方法;

     采取的方案是和C++中采用的方案一样:即构造器采用与类相同的名称。

 


下面就该贴出我们的一个带有构造器的简单类了:

 1 2 
 3 /*
 4  *         用构造器确保初始化
 5  */
 6 
 7 class Rock{
 8     Rock(){
 9         //This is the constructor
10         System.out.print("Rock ");
11     }
12 }
13 
14 public class SimpleConstructor {
15 
16     public static void main(String[] args) {
17         for(int i = 0;i < 10; i++)
18             new Rock();
19         
20     }
21 
22 }

 

/*/Output

1 Rock Rock Rock Rock Rock Rock Rock Rock Rock Rock 

    如上代码中:

    在创建对象 new Rock() 时 ,将会为对象分配储存空间,并调用相应的构造器,就确保你在操作对象时,它已经恰当的被初始化了。

    注意:构造器的名称必须与类名完全相同。

 

    以上 不接受任何参数的构造器叫做 默认构造器,下面来贴出一个有参数的构造器//

 

 1 /*
 2  *      用构造器确保初始化 - 2
 3  */
 4 
 5 class Rock2{
 6     Rock2(int i){
 7         System.out.print("Rock " + i + " ");
 8     }
 9 }
10 
11 public class SimpleConstructor2 {
12 
13     public static void main(String[] args) {
14         for (int i =0 ; i < 8 ; i++)
15             new Rock2(i);
16     }
17 
18 }

 

/*/Output

1 Rock 0 Rock 1 Rock 2 Rock 3 Rock 4 Rock 5 Rock 6 Rock 7 

 

    如果Tree(int)是Tree类中唯一的构造器,那么编译器将不会允许你以其他任何方式创建Tree对象。

    构造器是一种特殊类型的方法,因为它没有返回值。这与返回值为空(void)明显不同。对于空返回值,尽管方法本身不会自动返回什么,但仍可选择让它返回别的东西,构造器则不会返回任何东西,(new表达式确实返回了对新建对象的引用,但构造器本身并没有人和返回值)。假如构造器具有返回值,并且允许人们自行选择返回类型,那么势必得让编译器知道该如何出事此返回值。

 

 

  5.2  方法重载

    贴个代码吧更容易看懂 这个同时示范了重载的构造器和重载方法。

 1 /*
 2  *         方法的重载
 3  */
 4 
 5 class Tree{
 6     int height;
 7     Tree(){
 8         System.out.println("Planting a seedling");
 9         height=0;
10     }
11     Tree(int initialheight){
12         height = initialheight;
13         System.out.println("Creating new Tree that is " + height + " feet tall ");
14     }
15     void info(){
16         System.out.println("Tree is " + height + " feet tall ");
17     }
18     void info(String s){
19         System.out.println(s + ": Tree is " + height + " feet tall ");
20     }
21 }
22 
23 public class Overloading {
24 
25     public static void main(String[] args) {
26         for(int i =0 ; i < 5 ; i++){
27             Tree t = new Tree(i);
28             t.info();
29             t.info("overloaded method");
30         }
31     }
32 
33 }

/*/Output

 

 1 Creating new Tree that is 0 feet tall 
 2 Tree is 0 feet tall 
 3 overloaded method: Tree is 0 feet tall 
 4 Creating new Tree that is 1 feet tall 
 5 Tree is 1 feet tall 
 6 overloaded method: Tree is 1 feet tall 
 7 Creating new Tree that is 2 feet tall 
 8 Tree is 2 feet tall 
 9 overloaded method: Tree is 2 feet tall 
10 Creating new Tree that is 3 feet tall 
11 Tree is 3 feet tall 
12 overloaded method: Tree is 3 feet tall 
13 Creating new Tree that is 4 feet tall 
14 Tree is 4 feet tall 
15 overloaded method: Tree is 4 feet tall 

    创建Tree对象时,既可以不含参数,也可以用树的高度当参数。

    前者表示一棵树苗,后者表示已有一定高度的树木。要支持这种创建方式,得有一个默认构造器和一个采用现有高度作为参数的构造器。

 

 

  5.2.1  区分重载方法

    可以根据参数的顺序不同来区分。  警告:一般别这么做,很容易混肴。

     贴出代码吧,

 1 /*
 2  *         区别重载方法
 3  */
 4 
 5 public class OverloadingOrder {
 6 
 7     static void f(String s, int i){
 8         System.out.println("String: " + s + ", int: " + i);
 9     }
10     static void f(int i, String s){
11         System.out.println("int: " + i +", String: " + s);
12     }
13     public static void main(String[] args) {
14         f("String first", 11);
15         f(11, "Int first");
16     }
17 }

/*/Output

 

1 String: String first, int: 11
2 int: 11, String: Int first

     **声明相同的参数,顺序不同,得以区分。

 

 

 

  5.2.2  涉及基本类型的重载

    基本类型能从一个“较小”的类型自动提升至一个“较大”的类型,此过程一旦牵涉到重载,可能会造成一些混淆。以下贴出来个代码来说明将基本类型传递给重载方法时发生的情况。

    代码太长,折叠了。

 

技术分享
  1 /*
  2  *         涉及基本类型的重载
  3  *         基本类型从一个‘较小’的类型自动升至一个‘较大’的类型
  4  */
  5 
  6 
  7 public class PrimitiveOverloading {
  8 
  9     void f1(char x){    System.out.println("f1(char) ");}
 10     void f1(byte x){    System.out.println("f1(byte) ");}
 11     void f1(short x){    System.out.println("f1(short) ");}
 12     void f1(int x){    System.out.println("f1(int) ");}
 13     void f1(long x){    System.out.println("f1(long) ");}
 14     void f1(float x){    System.out.println("f1(float) ");}
 15     void f1(double x){    System.out.println("f1(double) ");}
 16     
 17     void f2(byte x){    System.out.println("f2(byte) ");}
 18     void f2(short x){    System.out.println("f2(short) ");}
 19     void f2(int x){        System.out.println("f2(int) ");}
 20     void f2(long x){    System.out.println("f2(long) ");}
 21     void f2(float x){    System.out.println("f2(float) ");}
 22     void f2(double x){    System.out.println("f2(double) ");}
 23     
 24     void f3(short x){    System.out.println("f3(short) ");}
 25     void f3(int x){        System.out.println("f3(int) ");}
 26     void f3(long x){    System.out.println("f3(long) ");}
 27     void f3(float x){    System.out.println("f3(float) ");}
 28     void f3(double x){    System.out.println("f3(double) ");}
 29     
 30     void f4(int x){        System.out.println("f4(int) ");}
 31     void f4(long x){    System.out.println("f4(long) ");}
 32     void f4(float x){    System.out.println("f4(float) ");}
 33     void f4(double x){    System.out.println("f4(double) ");}
 34     
 35     void f5(long x){    System.out.println("f5(long) ");}
 36     void f5(float x){    System.out.println("f5(float) ");}
 37     void f5(double x){    System.out.println("f5(double) ");}
 38     
 39     void f6(float x){    System.out.println("f6(float) ");}
 40     void f6(double x){    System.out.println("f6(double) ");}
 41     
 42     void f7(double x){    System.out.println("f7(double) ");}
 43     
 44     
 45     void testConstVal(){
 46         System.out.println("5: ");
 47         f1(5);f2(5);f3(5);f4(5);f5(5);f6(5);f7(5);
 48         System.out.println();
 49     }
 50     void testChar(){
 51         char x = ‘x‘;
 52         System.out.println("char: ");
 53         f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
 54         System.out.println();
 55     }
 56     void testByte(){
 57         byte x = 0;
 58         System.out.println("Byte: ");
 59         f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
 60         System.out.println();
 61     }
 62     void testShort(){
 63         short x = 0;
 64         System.out.println("Short:");
 65         f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
 66         System.out.println();
 67     }
 68     void testInt(){
 69         int x = 0;
 70         System.out.println("Int: ");
 71         f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
 72         System.out.println();
 73     }
 74     void testLong(){
 75         long x = 0;
 76         System.out.println("Long: ");
 77         f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
 78         System.out.println();
 79     }
 80     void testFloat(){
 81         float x = 0;
 82         System.out.println("Float: ");
 83         f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
 84         System.out.println();
 85     }
 86     void testDouble(){
 87         double x = 0;
 88         System.out.println("Float: ");
 89         f1(x);f2(x);f3(x);f4(x);f5(x);f6(x);f7(x);
 90         System.out.println();
 91     }
 92     
 93     
 94     public static void main(String[] args) {
 95         PrimitiveOverloading p = new PrimitiveOverloading();
 96         p.testConstVal();
 97         p.testChar();
 98         p.testByte();
 99         p.testShort();
100         p.testInt();
101         p.testLong();
102         p.testFloat();
103         p.testDouble();
104     }
105 
106 }
View Code

 

/**/Output

技术分享
 1 5: 
 2 f1(int) 
 3 f2(int) 
 4 f3(int) 
 5 f4(int) 
 6 f5(long) 
 7 f6(float) 
 8 f7(double) 
 9 
10 char: 
11 f1(char) 
12 f2(int) 
13 f3(int) 
14 f4(int) 
15 f5(long) 
16 f6(float) 
17 f7(double) 
18 
19 Byte: 
20 f1(byte) 
21 f2(byte) 
22 f3(short) 
23 f4(int) 
24 f5(long) 
25 f6(float) 
26 f7(double) 
27 
28 Short:
29 f1(short) 
30 f2(short) 
31 f3(short) 
32 f4(int) 
33 f5(long) 
34 f6(float) 
35 f7(double) 
36 
37 Int: 
38 f1(int) 
39 f2(int) 
40 f3(int) 
41 f4(int) 
42 f5(long) 
43 f6(float) 
44 f7(double) 
45 
46 Long: 
47 f1(long) 
48 f2(long) 
49 f3(long) 
50 f4(long) 
51 f5(long) 
52 f6(float) 
53 f7(double) 
54 
55 Float: 
56 f1(float) 
57 f2(float) 
58 f3(float) 
59 f4(float) 
60 f5(float) 
61 f6(float) 
62 f7(double) 
63 
64 Float: 
65 f1(double) 
66 f2(double) 
67 f3(double) 
68 f4(double) 
69 f5(double) 
70 f6(double) 
71 f7(double) 
View Code

    打开看看 想想//

    其中常数值5被当作int值处理,所以如果有某个重载方法接受int型参数,它就会被调用。至于其他情况,如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型。实际数据类型就会被提升。

    char型略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升至int型。

 

    但是如果呢。传入的实际参数大于重载方法声明的形式参数/粗线的情况呢,看下面

技术分享
 1 /*
 2  *         实际参数大于重载方法声明的形式参数。
 3  * 
 4  */
 5 
 6 
 7 
 8 public class Demotion {
 9     
10     void f1(char x){    System.out.println("f1(char) ");}
11     void f1(byte x){    System.out.println("f1(byte) ");}
12     void f1(short x){    System.out.println("f1(short) ");}
13     void f1(int x){        System.out.println("f1(int) ");}
14     void f1(long x){    System.out.println("f1(long) ");}
15     void f1(float x){    System.out.println("f1(float) ");}
16     void f1(double x){    System.out.println("f1(double) ");}
17     
18     void f2(char x){    System.out.println("f2(char) ");}
19     void f2(byte x){    System.out.println("f2(byte) ");}
20     void f2(short x){    System.out.println("f2(short) ");}
21     void f2(int x){        System.out.println("f2(int) ");}
22     void f2(long x){    System.out.println("f2(long) ");}
23     void f2(float x){    System.out.println("f2(float) ");}
24 
25     void f3(char x){    System.out.println("f3(char) ");}
26     void f3(byte x){    System.out.println("f3(byte) ");}
27     void f3(short x){    System.out.println("f3(short) ");}
28     void f3(int x){        System.out.println("f3(int) ");}
29     void f3(long x){    System.out.println("f3(long) ");}
30 
31     void f4(char x){    System.out.println("f4(char) ");}
32     void f4(byte x){    System.out.println("f4(byte) ");}
33     void f4(short x){    System.out.println("f4(short) ");}
34     void f4(int x){        System.out.println("f4(int) ");}
35     
36     void f5(char x){    System.out.println("f5(char) ");}
37     void f5(byte x){    System.out.println("f5(byte) ");}
38     void f5(short x){    System.out.println("f5(short) ");}
39     
40     void f6(char x){    System.out.println("f6(char) ");}
41     void f6(byte x){    System.out.println("f6(byte) ");}
42     
43 
44     void f7(char x){    System.out.println("f7(char) ");}
45     
46     
47     void testDouble(){
48         double x = 0;
49         System.out.println("double argument:");
50         f1(x);f2((float)x);f3((long)x);f4((int)x);f5((short)x);f6((byte)x);f7((char)x);
51     }
52     
53     
54     public static void main(String[] args) {
55         Demotion p = new Demotion();
56         p.testDouble();
57     }
58 
59 }
View Code

/**/ Output

1 double argument:
2 f1(double) 
3 f2(float) 
4 f3(long) 
5 f4(int) 
6 f5(short) 
7 f6(byte) 
8 f7(char) 

    这里,方法接受较小的基本类型作为参数。如果传入的实际参数较大,就的通过类型转换来执行窄化转换。如果不这么做,编译器会报错/

 

 

                    勿忘初心  方得始终

 

以上是关于Java 编程思想 第五章 初始化与清理 上的主要内容,如果未能解决你的问题,请参考以下文章

《java编程思想》读书笔记第五章

java编程思想第四版第五章习题

《Java编程思想》读书笔记<一>

Thinking In Java第五章学习笔记

Java编程思想第四版 *第五章 个人练习

java编程思想-第五章-某些练习题