发表于: 2017-08-03 01:12:42
2 924
有点事情学习耽搁了两天,今天继续。
一 今天做的事情:
1 关于setter和getter:
查看了《Head frist Java》一书,重新理解了setter和getter。本质上是两个被public修饰的方法,在setter方法里可以修改同类中被private修饰的成员变量。这样做的目的是不让用户直接访问修改变量,只能通过setter这个方法。这样就实现了封装。getter是直接读取信息。为了使方法名有意义,setter方法要访问修改哪个变量,它的方法名就改为set+首字母大写的变量。
5.5 深入构造器
在本节中了解到了构造器是创建对象的重要途径,我在定义一个变量时,系统就为它安排了一个内存空间而且若我没有初始化系统就默认初始化。构造器是外部访问变量的一个途径。
关于构造器重载:因为构造器是一个特殊的方法,构造器重载类似于方法重载,构造器的名字都为类名,只是后面的参数列表不一样。在调用构造器时,根据参数列表来选择相应的构造器。
好奇如果参数列表都对不上号时,会怎样:
报错:不兼容的类型。
另外构造器除了被同类的成员调用外,最主要的是是被其他类调用,所以应该加上修饰符public,公共访问权限。
在这一小节的末尾书上讲到了一个类中有多个构造器,若其中一个构造器的"执行体完全包含"另一个构造器的执行体,则前者就会调用后者。我对上述的双引号的内容表示怀疑。怀疑无效,程序说话:
我编的程序的满足上面说的条件么?满足。执行体的前两句都等价于this.age = age ; this.colour = colour ;
但是由于构造器2的参数列表虽然"完全包含"构造器1的参数列表,但是由于两者的参数顺序不一样,所以编译会报错。书上讲的不严谨。上面加双引号的句子应改为"一个类中有多个构造器,若其中一个构造器的执行体完全包含另一个构造器的执行体,且两者的参数列表的顺序相同,则前者就会调用后者。"
5.6 类的继承
1 类的继承有单继承特点,一开始我以为是类似于计划生育,一个爸爸只能有一个儿子,再仔细一看是一个儿子只能有一个爸爸,儿子不能再认干爹。
儿子可以使用爸爸的变量和方法,但是构造器不能用。
书上讲的间接父类可以理解为爸爸的爸爸,即爷爷。
在第一个程序中,为什么我可以使用System,out.println这个方法呢?因为我定义的类都默认为java.lang.Pbject的子类,作为儿子可以使用爸爸的方法。
在本小节中还介绍了方法重写,也就是方法覆盖。我对这个覆盖有两个猜想,第一个猜想是重写后父类方法不变,当使用子类调用同名方法时,调用的是子类的而不是父类的同名方法;另一种猜想是重写后父类方法改变,再有其他子类调用方法时,调用的是修改后的方法。
猜想无效,程序说话:
看来是猜想一正确。父类方法不动。书上写的又不是很详细。
2 在super限定这一小节中,我了解到了使用super关键字可以让子类重新访问调用被覆盖的父类的方法或者变量。
如果在子类和父类中都同时定义了一个数据类型相同,变量名也相同的变量,那么在子类使用这个变量时会使用子类的变量。想调用父类的变量,还得使用super关键字。这就是书上说的“子类实例变量隐藏父类实例变量的情形。”
若在某个方法中访问一个变量并没有明确指定是谁调用的,那么系统在编译时查找的范围会越来越大,方法-类-直接父类-所有父类,都没有才会报错。
3 在调用父类构造器这一小节中,儿子可以使用爸爸的构造器来初始化,用的还是super关键字。
现在看来用途不大,因为这种方法和构造器的重载一样都是为了不让重复的代码出现,使得程序更加简洁。我现在写的程序都是小程序,代码至多一两百,就算相同的代码写两遍也不觉得什么。但是这种简化程序的方法要记住,以后会用到的。
果真如书上说的,子类总是调用父类构造器进行初始化。那这样要super有何用呢?
public class Temp6
{
public static void main(String[] args)
{
//测试一个子类总是调用父类的构造器来初始化
son s = new son("平民",0,15);
System.out.println(s.job + " " + s.gun + " " + s.age);
}
}
class son extends father
{
int age ;
public son(String job , int gun , int age)
{
super(job , gun) ;
this.age = age ;
}
}
class father
{
String job = "司令" ;
int gun = 1000 ;
public father(String job , int gun)
{
this.job = job ;
this.gun = gun ;
}
}
super在调用父类构造器的问题上应该是指明参数的吧,像上面的程序。
5.7 多态
关于多态,书上和毕向东老师的视频都举了定义一个对象,这个对象数据类型是父类的,而却把子类的实例赋值给它。
“父类型指向子对象”。对于视频中提到的多态性可以提高程序的拓展性这一点不是很理解,例子看懂了,但这一句话不是很理解。
明天继续。
评论