代码改变世界

【连载】corejava 第七天

2014-04-07 12:38  Nicole丶  阅读(178)  评论(0编辑  收藏  举报
001 package corejava07;
002  
003  class Corejava07_2 {
004         public static void main(String[] args) {
005                 Ygh y=new Ygh();//子类实例化会先调用父类构造函数,然后调用自己的,这里就不赘述了
006                 //所以先输出 i am people  然后  i am ygh
007                  
008                 //再具体点就是 再Ygh的构造器中jvm帮你加上了一句super(),这什么意思呢,就是调用父类
009                 //的无参构造器
010                  
011                 Ygh y2=new Ygh(22);
012                  
013                 System.out.println(y2.getParentProperty());//子类得到父类属性
014                  
015                 y2.useParentMethod();//子类调用父类方法
016         }
017 }
018 class People{
019         int a=3;
020         public People(){
021                 System.out.println("i am people");
022         }
023         public void sleep(){
024                 System.out.println("sleeping~~~");
025         }
026 }
027 class Ygh extends People{
028         public Ygh(){
029                 //构造函数的第一句,默认是super(),但是 如果你写了this(),那么jvm就不会帮你添加
030                 //super();换句话说 this()和super()只能出现一个 ,this()就是调用自己的无参构造器
031                  
032                 // 我们试试 在这里 加个this(),会怎么样
033                 //this();//报错,为什么呢。。。因为 你已经在Ygh的构造器里了  你还要掉用它的构造器,那不就死循环了嘛
034                 //所以我们可以建立一个有参的构造器,然后 再测试
035                  
036                 System.out.println("i am ygh");
037         }
038         public Ygh(int age){
039                 //先不加this(),输出了i am people 就是调用了父类构造器 就等于默认在这加了super()
040                 //那么我们 在这 加一句 this(),看他还会不会调用父类构造器
041                  
042                 this(); //这里写了this() 运行代码 会发现 先输出了i am people 然后 i am ygh 然后 age:22
043                 //this()就是先调用了自身的无参构造器 自身的无参构造器又去调用了父类的无参构造
044                  
045  
046                 System.out.println("age:"+age);
047                  
048         }
049         //在子类调用父类的属性
050         public int getParentProperty(){
051                 return super.a;//super的意思就是代指父类,比如你 就是个代词 在不同环境下  “你”所代表的人物也是不一样的
052         }
053         //在子类调用父类的方法
054         public void useParentMethod(){
055                 super.sleep();//其实 不管是调用属性还是调用方法都是一个道理 只要你知道this代表自己本身 super代表父类就可以了
056                 //有木有人问父类能不能调用子类的方法啊,你仔细想下 儿子肯定只有一个父亲 所以他的父亲是确定的,那么父亲难道只有一个儿子么?
057                 //当然不是,父亲可以有多个儿子,所以不要想在父类调用子类的方法,因为父类可能会有多个儿子,你根本不知道调用谁的方法
058         }
059          
060          
061 }
062  
063 public class Corejava07{//为了方便操作 直接把这个类名改下 好了,,不要怪我偷懒哈。。
064         //发现上面写得有点乱了,再写下大家肯定都不想看了
065         //那么再开个类
066         //上面已经有个main函数了 我再写一个可不可以呢,可以,
067         //每个类都可以有主函数,在eclipse里你点击运行 只是运行public  class里的主函数
068         //但是每个类可以有自己的主函数
069         //那 怎么运行呢  找到bin目录下的.class文件
070          
071         //然后用命令 java 就可以了
072         public static void main(String[] args) {
073                 int a=3;
074                 System.out.println("a:"+a);//输出3,,不是调用方法-1了嘛为什么还是3
075                 //因为基本类型变量都有自己的有效范围,超过这个范围,就被删了
076                 //有效范围就是定义该变量所包含的{}直接的范围就是这个变量的范围,当超过这个范围,这个变量就会被删除
077                 int b;
078                 //System.out.println(b);这里报了个错,因为你没初始化b,就调用了b,所以报错
079                 //看Test类里面的test方法,貌似在Test里面 我也没初始化a啊 但是方法里调用了a
080                 //为什么在那里就不会报错呢?
081                 //因为这里的a 是在主函数里定义的,是普通变量,而那个a是在Test类里面定义的,你只定义不赋值的时候,他默认有个“零值”
082                  
083                 Test t=new Corejava07.Test();//为什么可以这么new呢? 记得前面我们讲过 要先实例化外部类 然后在用外部类的实例 new
084                 //为什么这次讲的不一样呢,因为上次讲的是成员内部类,而现在这个是静态内部类哦
085                 //因为是静态的 所以他不依赖于 外部类的实例
086                 //比如 你要调用静态方法 你不用去实例化那个类 你直接 类名.静态方法名 调用就可以了
087                 //这个道理也差不多
088          
089                 System.out.println("t.b:"+t.b);//输出3
090                 test2(t);
091                 System.out.println("t.b:"+t.b);//输出2
092                 //为什么t.b会变成2呢
093                 //因为 t是Test类型的一个实例 实例化后存放在堆中(就是内存的一块地方)
094                 //然后调用test2方法  test2方法里重新定义了一个Test类型的t变量,指向刚创建的Test实例
095                 //同时改变了b的值
096                 //方法调用结束,方法里创建的Test类型的t变量被删除,但是他已经对实例化后的对象的内容进行了修改,就算他删除了,被修改的内容页不会恢复
097                 //所以t.b的值被改变了
098                  
099                 //我尽量用通俗点的话来讲,但是有些问题比较难用语言来描述,
100                 //如果可能的话。我看能不能画个图。。这看大家意愿了,如果有人提的话,我会考虑的
101                  
102                 //好了 Corejava第七天献给大家
103         }

 

104         public static void test1(int a){//直接静态方法比较方便,省的要实例化Corejava07_2对象
105                 //这里也有个变量,那么他的有效范围是哪呢,就是这个函数,超过了这个函数,这个变量就被删除了
106                 //所以,当主函数的a 传过来后,栈内存定义了一个新的 a变量,并且赋值为3,但是当这个函数结束后,这个变量也就随之删除了
107                 //所以主函数的a本来等于什么  现在还是等于什么
108                 a--;
109         }
110         public static void test2(Test t){
111                 t.b--;
112         }
113         static class Test{//这里为什么要定义一个静态内部类呢,。。。方便、、
114                 int a;
115                 int b=3;
116                 public void test(){
117                         System.out.println(a);
118                 }
119         }
120          
121 }