继承与多态

来源:互联网 发布:比利牛斯山的城堡 知乎 编辑:程序博客网 时间:2024/06/16 05:51

构造器
构造器又称构造函数和构造方法,用于构建当前类的对象的行为和初始化类的相关属性。
其格式为 public 类名(){}
当你创建一个类的时候会自动默认一个构造方法,当你创建对象的时候,构造方法会自动调用。
例如 Person p = new person();
前面的person p 为声明对象类似于声明变量,也可以说就是声明变量,在这种时候构造方法是不会被调用的。必须要在创建对象,即
new person();在这个时候会调用构造方法。
另外有很多人认为构造方法是没有返回值的,因为从代码方面看
Public 类名()是看不到返回类型的。但是并不是这样,看不见并不代表没有,就像创建类时默认的构造方法,我们虽然看不见的,但是却是真正存在的。所以构造方法是有返回值的,只不过它的返回值是内存地址,是固定的。
说到内存地址,便说下内存。内存分为两个部分,栈存储区域,和堆存储区域。前者是放变量引用,后者放对象实体。变量的的引用这里是变量的名字,如Person p;而对象实体是地址+真正的对象 (里面包括属性和方法)
说到这里有一个知识点叫做“引用传递”
引用就是变量名,引用传递指不同变量名存储的地址的传递关系

 举一个例子:

我们首先定义两个对象
person p = new person();
person p1 = new person();
P.name = “老王”;
P1.name = “老张”;
P = p1;
P1.name = “小王”;
System.out.println(p.name);
System.out.println(p1.name);
得出的结果为两个都是小王
原因是定义第一个对象的时候 把变量名p 存在栈存储区域,其指向堆存储区域的一个地址,里面存有name=“老王”,同理定义p1时,把p1存在栈存储区域,其只想里面存有老张的地址。运行到p=p1时,p不指向原来的地址,改为指向p1的地址,p1的地址改变了,所以p随p1一起发生了变化。这里写图片描述

地址 真正的对象
地址 Public string name;老王
地址 Public string name;
老张(小王)

变量名
Person p
Person p1

方法重载
方法重载就是在同一个类中,如果方法名相同,但是其参数类型、参数顺序、参数个数不同的方法互为方法重载。
例如: public void study(){}
Public void study(int a){}
Public void study (string a){}
Public void study (string a,int b){}
Public void study (int a,string b){}
除此之外 构造方法也可以重载

继承体系
继承是指子类继承父类未私有的所有方法和属性
其中用到关键字 extends
格式为 class 子类名 extends class 父类名 {}
继承只允许一个子类拥有一个父类,但是一个父类可以拥有很多子类。而且可以有层次继承,如C继承B,B继承A,都是可以的。如果有很多类时,并且其有共同点,就可以用到继承来实现。

如果一个子类不想用父类的某个方法,这里可以用到方法重写。方法重写必须是在继承的条件下才可以实现的。重写的方法与从父类继承的方法的名称 类型完全一致。有规定说同一个类中不可以出现两个名称 类型相同的方法,但是重写时可以。因为重写的方法会覆盖掉父类的方法。在这里会有一个自动转型的知识点,自动转型就是子类的类型自动转化为父类的类型。例如:
Father是父类 son是子类
定义一个son的对象
Son s = new son();
在这里也可以定义为
Father s = new son();
因为属于son的就是属于father的
如果在这个时候你使son的方法重写father的方法,则调用的是重写后的,如果没有重写,则调用原有的方法。

在自动转型的情况下,还可以发现一个知识点
叫做多态
例如 Father s = new son();
Son s=new son();
S.speak();
S.speak();
多个同样的方法同样的对象名和类型,但是执行过程却不一样。父类引用指向子类对象,调用方法时会调用子类的实现,而不是父类的实现,一个执行从父类继承过来或重写的方法,另一个执行自己的方法。
这样就叫做多态。