【第22期】观点:IT 行业加班,到底有没有价值?

不算重零开始的java学习(一)

原创 2016年08月30日 21:51:59

重复了无数次的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

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

不算重零开始的java学习(三)

NO.1在创建新对象时,所有继承下来的构造函数都会执行public class Animal{ public Animal(){ //do sth. } } public cl...

(转载)effective java 第二版精简版

[size=small]第一章 前言 第二章 创建和销毁对象 1、 考虑用静态工厂方法代替构造器 创建对象方法:一是最常用的公有构造器,二是静态工厂方法。下面是一个Boolean的简单示例: public static Boolean valueOf...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

修炼一名程序员的职业水准

程序就是一系列按步骤进行的操作序列,它有好多种级别,比如最低级的微程序、次低级的汇编程序、高级的各种编程语言程序、最高级的脚本语言程序,也许我列的不对,但没关系,我要说的是不管是那个级别的程序,其本质都是操作的逻辑序列。大多数系统和应用程序都是建立在高级编程语言上的,比如C、C++、C#、FORTR...

不算重零开始的java学习(二)

相比于方法如何实现,我对底层似乎更有兴趣。NO.1栈与堆在java中,内存中会存在两个区域:对象的生存空间堆(heap)以及方法调用及变量的生存空间(stack)。当java虚拟机运行时,它会从底层操...

编程新手导论(转载)

第二部分 导论,这一部分主要是关于编程的导论, (要懂得一点思想具备一点常识)《设计,编码,,与软工》(编程与思想)这一章解释了三种思想,原语,抽象,组合,,和软件开发的二个重要过程,,软件工程的相关概念,是编程入门的关键 (要懂得一点领域内的数学)《数学与算法》(编程与数学)计算机整个就是架构...
  • mmdev
  • mmdev
  • 2012-01-22 10:26
  • 783
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)