重复了无数次的java学习
第一篇
写在前面,这是不是我的第一篇个人博客。之前曾经在新浪博客上学过几篇关于JavaScript的文章,然后就没有然后了。。。最近在学习java,学了几遍感觉啥都没学到,于是决定在博客上写下学习记录算是一种复习吧
NO.1
对于java而言,首先第一个要面对的问题就在于面对对象
举个例子,这里有几只动物,猫、狗、豹子。它们都有两个特性,eat以及raor。首先我们用一组图标表示出来
cat | dog | lion | leopard |
---|---|---|---|
eat() | eat() | eat() | eat() |
raor() | raor() | raor() | raor() |
然后我们需要讲里面共同的地方提炼出来
animal(不知道怎么让表格缩小这就很尴尬了) |
---|
eat() |
raor() |
cat | dog | lion | leopard |
---|---|---|---|
换句话说它们都是animal,并且都具有eat以及raor,因此我将它抽象为一个animal的类,然后cat类继承与animal类,依次推列;继承的同时四个子类也会继承父类的方法。
我们再进一步,不同的动物的叫声也不一样,我们不能在父类中设置所有动物都是一样的叫声。
所有我们可以这样
animal |
---|
eat() |
raor() |
cat | dog | lion | leopard |
---|---|---|---|
raor() | raor() | raor() | raor() |
我们在每个类中重新定义一个raor的方法,这样它会覆盖掉父类中的raor方法。
现在又有新的问题出现了,我们需要猫能够睡觉;那么我们只需要在cat中新加入一个睡觉的方法。
animal |
---|
eat() |
raor() |
cat | dog | lion | leopard |
---|---|---|---|
raor() | raor() | raor() | raor() |
sleep() |
这样当我们实例化某只动物后调用其raor方法,它就会调用定义在该动物类中的方法而不会上升到父类中去。换句话说“最低阶会胜出”,当调用eat方法时,虚拟机会冲该动物类找起,很显然并没有,于是虚拟机会一直往上找其类方法直到找到位置。
若子类在添加自定义方法后还需要调用父类的方法,则需要使用super来进行调用。当然父类是无法调用子类的方法的。
NO.2
面对对象十分重要的一点就是多态,首先让我们看看创建对象的过程。
首先Dog myDog;要求虚拟机分配空间给引用变量并将此变量命名为“myDog”,此引用变量讲永远被定义为Dog类型。
然后new Dog()创建对象,此时要求虚拟机将空间分配给新建立的Dog对象。
最后Dog myDog = new Dog(); 将新的Dog对象赋值给myDog这个引用变量。
在上述过程中,我们可以发现引用变量与对象的类型都是Dog。但是在多态下,两者可以不同
Animal myDog =new Dog();
运用多态时,引用类型可以是实际对象类型的父类。因此我们同样可以这么写:
Animal[] animals = new Animal[5];
animals[0] = new Dog();
animals[1] = new Cat();
animals[2] = new lion();
animals[3] = new leopart();
for(int i = 0;i<animals.length;i++){
animals[i].eat();
animals[i].roar();
}
参数与返回类型同样也可以多态
class Vet{
public void giveShot(Animal a){
a.raor();
}
}
class petOwner{
public void start(){
Vet v = new Vet();
Dog d = new Dog();
Cat c = new Cat();
v.giveShot(d);//会执行Dog的raor
v.giveShot(c);//会执行Cat的raor
}
}
另外在覆盖方法时应该注意,父类的方法如果是无参数且返回布尔值,那么子类覆盖的方法也必须是无参数且返回布尔值,因为虚拟机在寻找方法时会找相同的类型的方法。
NO.3
重载是两个方法名称相同但是参数不同,因此重载与多态毫无关系。重载是同一个方法有多重方式进行调用,同样,也不能返回方式不同,参数相同。
例如:
public class OverLoads{
String uniqueID;
public int addNums(int a,int b){
return a+b;
}
public double addNums(double a,double b){
return a+b;
}
public void setUniqueID(String theID){
uniqueID = theID;
}
public void setUniqueID(int ssNumber){
String numString = "" + ssNumber;
setUniqueID(numString);
}
}
关于面对对象的话题就想说到这里,下篇文章将深入研究多态以及相关内容。
see you