【连载】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 |
} |