太自由

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
 1 //匿名对象_1
 2 class Car
 3 {
 4     //描述属性;
 5     String color;
 6     int number;
 7 
 8     //描述行为:
 9     void run()
10     {
11         System.out.println(color+":"+number);
12     }
13 }
14 class CarDemo
15 {
16     //定义主函数,为了让程序运行起来。
17     public static void main(String[] args) 
18     {
19         //创建Car.class类的对象。
20         //Car c = new Car();    //这个c是类类型的变量。类类型的变量一定
21                             //指向对象。(引用型的变量也可以不指向
22                             //变量,例如Car c = null)
23         //调用对象的成员。
24         //c.color = "red";
25         //c.number = 4;
26         //c.run();
27 
28         //这两句可以简化。
29         //Car c = new Car();
30         //c.run();
31 
32         //简化成如下写法,匿名对象就是为了简化书写。
33         new Car().run();    //这个对象没有名字,这就是匿名对象。
34 
35         /*
36         记住:凡是简化的都有局限。
37 
38         */
39 
40         new Car().color = "red";    //这一句一旦在堆内存中执行完,
41                                     //因为没有任何对象去指向这个对象,
42                                     //这个对象就成为了垃圾,至于什么
43                                     //时候被垃圾回收机制回收这片内存,
44                                     //要等到多线程才能理解。
45         new Car().number = 4;
46         new Car().run();
47 
48         /*
49         匿名对象有什么用呢?为了简化书写。
50         使用场景:当对象对对方法进行调用时,而且只调用一次时,
51         可以简化成匿名对象。
52         Car c = new Car(); c.run(); --->new Car().run();
53 
54         Car c = new Car();
55         c.run();
56         c.run();
57         c.run();
58         是不可以简化成以下书写的。因为对象不同。
59         new Car().run();
60         new Car().run();
61         new Car().run();
62         记住:当对象需要调用多次成员的时候,不可以简化成匿名对象调用。
63         */
64     }
65 }
 1 //匿名对象_2  匿名对象作为实参。
 2 class Car
 3 {
 4     //描述属性;
 5     String color;
 6     int number;
 7 
 8     //描述行为:
 9     void run()
10     {
11         System.out.println(color+":"+number);
12     }
13 }
14 
15 class CarDemo2
16 {
17     public static void main(String[] args)
18     {
19         /*
20         Car c = new Car();
21         c.color = "red";
22         c.number = 4;
23         c.run();
24 
25         Car c1 = new Car();
26         c1.color = "red";
27         c1.number = 4;
28         c1.run();
29         */
30 
31         //以上代码的复用性差,只有对象不同,而调用的成员和赋值都相同。
32         //可以进行抽取,定义一个功能。将重复的代码进行封装。
33         Car c = new Car();
34         Car c1 = new Car();
35         show(c);//简化成show(new Car())
36         //show(c1);
37         show(new Car());
38         
39     }
40 
41     //功能的结果是什么呢?没有具体值,所以是void.
42     //功能的未知参数是什么呢?对象不明确,可以将其定义成函数。
43     public static void show(Car cc)//Car cc = c
44     {
45         cc.color = "red";
46         cc.number = 4;
47         cc.run();
48     }
49 }
 1 //基本数据和引用数据参数传递过程。
 2 class Demo
 3 {
 4     public static void main(String[] args) 
 5     {
 6         int x = 4;
 7         show(x);
 8         System.out.println("x="+x);//打印结果为:x=4
 9     }
10     public static void/*int*/ show(int x)
11     {
12         x = 5;
13         //return x;
14     }
15 }
16 
17 class Demo2
18 {
19     int x;
20     public static void main(String[] agrs)
21     {
22         Demo2 d = new Demo2();
23         d.x = 5;
24         show(d);//show(new Demo());
25         System.out.println("x="+d.x);//打印结果为x=6
26     }
27     public static void show(Demo d)
28     {
29         d.x = 6;
30     }
31 }

  1 //封装。
  2 
  3 /*
  4 封装:
  5 表现:
  6 1,函数就是一个封装最基本的封装体。
  7 2,类其实也是一个封装体。
  8 
  9 从以上两点得出结论:
 10 1,提高了代码的复用性。
 11 2,隐藏了实现的细节,对外提供访问方式。
 12 3,提高了安全性。
 13 它也是面向对象思想的特征之一。
 14 共有三个特征:封装,继承,多态。
 15 
 16 举例:机箱。隐藏了板卡设备的细节,对外提供了插口以及开关等
 17       访问内部细节的方式。
 18 */
 19 //描述人。Person
 20 //属性:说话:说出自己的年龄。
 21 
 22 
 23 /*
 24 总结:
 25 类中不需要对外提供的内容私有化,包括属性和行为。 
 26 
 27 selectSort(int[] arr)
 28 {
 29     swap(){}
 30 }
 31 
 32 bubbleSort(int[] arr)
 33 {
 34     swap(){}
 35 }
 36 
 37 重点:以后再描述事物,属性都私有化,并提供setXXX,getXXX方法对其进行访问。
 38 */
 39 class Person
 40 {
 41     //属性。
 42     private int age;    //age就被修饰为了private私有,
 43                         //也就是被隐藏了,这就是封装的
 44                         //一种体现。
 45 
 46     //行为。
 47     void speak()
 48     {
 49         System.out.println("age="+age);
 50     }
 51 
 52     /*
 53     年龄已被私有,错误的值无法赋值,可是正确的值也赋值不了。不行。
 54     咋办,安照之前所学习的封装的原理,隐藏后,还需要提供访问方式。
 55     通过方法的方式,让其他程序访问到就可以了,更重要的是可以在方法
 56     中加入逻辑判断。
 57 
 58     记住:对变量的访问操作有两个动作;赋值(设置),取值(获取).
 59     所以,对私有的变量访问的方式就是set变量,get变量--->setAge,getAge.
 60     */
 61 
 62     //定义一个对age赋值的方法,
 63     void setAge(int a)
 64     {
 65         //加入逻辑判断。
 66         if(a>0 && a<130)
 67             age = a;
 68         else
 69     //        System.out.println("对不起,您的年龄数值"+a+"是非法的。");
 70     //    throw new RuntimeException("对不起,您的年龄数值"+a+"是非法的。");//异常。一旦出现,程序结束,需要修改代码。
 71     }
 72 
 73     //定义一个获取age值得方法。
 74     int getAge()
 75     {
 76         return age;
 77     }
 78 }
 79 
 80 class PersonDemo
 81 {
 82     public static void main(String[] args)
 83     {
 84         //测试Person.class.
 85         //创建对象。
 86         Person p = new Person();
 87 
 88         /*
 89         赋值-20是可以的,因为age属性是int型的,但是不符合现实生活中的
 90         事物属性。
 91 
 92         不让它访问就可以了,怎么在代码中体现呢?需要使用一个java中的关
 93         键字private。(私有 修饰符)
 94         */
 95 //        p.age = -20;//age不能再Person类以外的程序中直接访问了。
 96 
 97         //演示:对age设置和获取方法的体现。
 98         p.setAge(-20);
 99         int a = p.getAge();
100         System.out.println("a="+a);
101 //        p.speak();
102     }
103 }
104 
105 /*
106 什么叫做封装:
107 隐藏了实现细节,提供对外访问的方式,这才叫封装,而私有仅仅是
108 封装的一种体现。
109 */
  1 //面向对象---构造函数。
  2 /*
  3 需求:为了描述事物更准确,发现事物对应的很多对象一创建时,
  4       就有了一些基本的属性等内容。一些初始化的数据,在类中
  5       该如何完成。
  6     
  7 通过Java中的另一个小技术完成:就是构造函数,对象本身就是构造出来的。
  8 构造时,需要做一些动作,这些应该定义在函数内。
  9 
 10 构造函数有什么用?可以在对象创建时对对象进行初始化。
 11 1,没有返回值类型。因为构造对象,创建完成就结束,不需要结果。void也不要写
 12    因为要区别于一般函数。
 13 2,构造函数的名字和类名一样。(构造函数就是给类在创建对象是而提供的)
 14 3,没有具体的返回值。
 15 接下来,安照以上三点,在Person类中定义一个构造函数。
 16 Person类的对象一创建就具备了姓名。
 17 
 18 发现了问题.
 19 没有学习构造函数时,对象也被创建出来了,那么该对象是否有被构造呢?后者
 20 说是否有调用构造函数呢?
 21 
 22 是的,必须调用!
 23 那么类中那个构造函数是什么呢?
 24 
 25 class Person
 26 {
 27     //Person(){}//默认的空参数的构造函数。
 28 }
 29 
 30 main()
 31 {
 32     Person p = new Person();    //这个已经调用了Person类中的空参数的构造
 33                                 //函数,类中有定义构造函数吗?有的,只要
 34                                 //定义了一个类,该类中就有一个空参数的构造
 35                                 //函数,是编译器编译时自动加上的。
 36                                 
 37                                 //注意:如果在类中自定义了构造函数,那么默认
 38                                 //的空参数的构造函数就不添加了。防止冲突。
 39                                 
 40                                 //原理:没有定义对象的初始化过程,编译器会添加一个默认的
 41                                 //初始化过程,如果定义了指定的初始化过程,默认的就不添加了。
 42 }
 43 
 44 什么时候需要些构造函数呢?
 45 如果对象一初始化就具备了一些内容,这需要写构造函数,在对象被创建的时候,用这个构造函数来初始化这个对象。
 46 如果对象初始化时不具备内容,这不需要写构造函数。用setXXX来指定。
 47 
 48 
 49 构造函数细节:
 50 1,一个类可以有多个构造函数,它们的存在是以重载的形式体现的。
 51 2,构造函数中也是有return语句的,用于结束初始化动作的。
 52 3,构造函数是否能被private修饰呢? 能。作用就是,其他程序无法创建该类的对象。
 53   但是在本类里面还是可以创建对象的。
 54 class Person
 55 {
 56     private person(){}//私有化构造函数。
 57 }
 58 main()
 59 {
 60     Person p = new Person();    //创建对象无法初始化
 61 }
 62 
 63 构造函数和一般函数的区别:
 64 1,写法不一样。
 65 2,运行上有差别,对象一创建就会调用对应的构造函数。
 66     一般方法是对象创建后,才会调用所需的一般函数。
 67 问:有了构造函数初始化姓名,那么还需要setName方法吗?需要,因为对象创建之后,
 68     如果需要对数据进行修改,可以通过set完成。
 69 3,构造函数在对象创建时,仅调用一次(因为初始化动作只做一次,而且先执行)。而一般方法可以被调用多次。
 70 class Person
 71 {
 72     //这个类里面还有一个默认的空参数构造函数。
 73     void Person(){}//这不是构造函数,这是一般函数。
 74 }
 75 main()
 76 {
 77     Person p = new Person();
 78 }
 79 */
 80 class Person
 81 {
 82     //属性:姓名,年龄
 83     private String name;
 84     private int age;
 85 
 86     //一初始化,既没有姓名,又没有年龄。
 87     Person()
 88     {
 89 
 90     }
 91 
 92     //return语句用于结束初始化动作演示:
 93 //    Person(int a)
 94 //    {
 95 //        if(a<0)
 96 //            return;    //return语句用于提前结束初始化动作。
 97 //        age = a;
 98 //    }
 99 
100     //定义构造函数。
101     Person(String n)
102     {
103         //将接受到的值赋值给对象的name。
104         this.name = n;
105     }
106 
107     //一初始化,既有姓名,又有年龄。
108     Person(String n,int a)
109     {
110         name = n;
111         age = a;
112     }
113 
114     //行为:
115     public void speak()
116     {
117         System.out.println("name="+this.name+",age="+age);
118     }
119 }
120 class  PersonDemo2
121 {
122     public static void main(String[] args) 
123     {
124         Person p1 = new Person();
125         Person p = new Person("lisi");    //对象创建时,必须会调用对应的构造函数。
126         Person p2 = new Person("wangwu",18);
127         p.speak();
128         p1.speak();
129         p2.speak();
130     }
131 }
 1 //构造函数——之间的调用。
 2 /*
 3 当构造函数之间进行互相调用时,该如何解决呢?
 4 
 5 构造函数是对象初始化时调用的。
 6 给哪个对象初始化呢?通过this关键字来明确被初始化的对象。
 7 
 8 在构造函数中调用其他构造函数的格式:this(实参列表);就会调用对应的构造函数。
 9 
10 小结:
11 this到底代表什么呢?
12 this就代表对象,代表哪个对象呢?哪个对象调用了this所在的函数,this就代表了哪个对象。
13 */
14 class Person
15 {
16     private String name;
17     private int age;
18     Person()
19     {
20 
21     }
22     //初始化姓名。
23     private Person(String n)
24     {
25         name = n;
26 //        cry();    //构造函数调用一般方法,
27     }
28     //初始化姓名和年龄,既然第二个构造函数已经做完了构造姓名的动作,这个构造函数就没有必要做了。直接调用就好了。
29     Person(String n,int a)
30     {
31         this(n);    //thsi代表当前对象,//这是在调用一个字符串参数的构造函数。
32                     //注意:调用其他构造函数的语句,必须定义在构造函数的第一行,
33                     //原因是,初始化动作必须要先执行。
34     //    name = n;
35         age = a;
36     }
37     
38     //一般方法,
39     void cry()
40     {
41 
42     }
43 }
44 
45 class  PersonDemo3
46 {
47     public static void main(String[] args) 
48     {
49         
50     }
51 }

 1 //this关键字的应用。
 2 /*
 3 this关键字的另一个作用:
 4 可以用this标识符哪个变量是成员变量。这个标识符可以省略不写。
 5 但是,当局部变量和成员变量同名时,this不能省略,因为要用this
 6 标识成员变量。
 7 */
 8 
 9 class Person
10 {
11     private String name;
12     private int age;
13 
14     Person(String name,int age)
15     {
16         this.name = name;
17         this.age = age;
18     }
19     
20     public void speak()
21     {
22         String name = "haha";
23         System.out.println("name="+this.name+",age="+this.age);
24     }
25 
26     public void method()
27     {
28         this.speak();//这个方法可以省略,因为方法如果同名的话还可以用参数列表来区分。
29     }
30 
31     //定义一个功能,判断两个人是否是同龄人。
32     //1,明确结果,boolean 2,明确未知内容,1个,Person类型。
33     public boolean equalsAge(Person pp)
34     {
35         /*
36         if(pp.age == this.age)//当函数中使用到了调用该函数的对象时,用this表示这个对象。
37             return true;
38         return false;
39         */
40 //        return (pp.age == this.age)?true:false;
41         return pp.age == this.age;
42     }
43 }
44 
45 class  PersonDemo4
46 {
47     public static void main(String[] args) 
48     {
49         /*
50         Person p = new Person("lisi",20);
51         p.speak();
52         Person p1 = new Person("xiaoming",24);
53         p1.speak();
54         p1.method();
55         */
56         Person p = new Person("lisi",20);
57         boolean l = p.equalsAge(new Person("xiaoming",21));
58         System.out.println(l);
59     }
60 }

 

posted on 2016-03-25 09:56  太自由  阅读(228)  评论(0编辑  收藏  举报