当前位置:   article > 正文

类与类的关系---继承_类与继承

类与继承

类与类的关系有以下几种:

A is-a B      继承、实现===>统称泛化

A has-a B   组合、聚合、关联===>统称包含

A use-a B   依赖(need)

继承:

子类、父类

1.子类继承父类,通过关键字“extends”;

2.子类的对象可以调用父类的(public、protected)属性和方法,当作自己的去使用,增强了复用性;构造方法不算是继承过来的,只是在子类调用构造方法时默认调用父类的构造方法;代码块也是同理,默认在子类调用构造方法的时候调用父类的构造方法,而在调用父类构造方法前会先自动运行父类中的代码块;以上两种子类是调用不到的;

3.子类可以添加自己独有的方法和属性;

4.子类从父类继承来的方法不能满足子类的要求,可以在子类中重写(覆盖)父类的方法--->方法重写 override,重写主要是内容,结构一般相同;

5.每一个类都有继承类,如果不写extens关键字,那么就继承Object类,如果写了extends关键字,那么就继承后者;如果子类继承了父类,而父类继承了Object,那么子类也是Object的子类,即继承是可以传递的,所以Object类是任何引用类型的父类,Object类是没有父类的

6.Java中继承是单个存在的(单继承),每一个类只能有一个继承类,即extends关键字后面只能写一个类;目的是为了让类更安全;但是可以通过传递的方式实现都继承的效果,后续还会有多实现;

7.继承在内存中的储存形式:

8.this:代替的是当前执行方法/属性的那个对象,不一定是当前类(也有可能是他的子类);如果子类里进行了方法重写,又在父类里用this.调用了这个方法,那么如果执行的时候用的是子类里的对象去执行这个父类里的this.,那么这个this表示的是子类中的对象,那么执行的也就是子类中重写的那个方法;

super:那如果就是要调用父类里的原方法呢?super代替的是执行方法/属性时的那个对象所属类的父类中的对象;也就是指向储存形式里面的父类对象;空间那么super就没法写在父类里面了,只能写在子类里面;

super和this都可以调用一般属性和方法,

都可以放置在类成员的任意位置,

可以调用构造方法(写在构造方法的首行),构造方法不可以来回调用===>第一行都被占了,父类的构造方法没有位置写了(这是一行隐藏的方法),那么就没法调用父类的构造方法了;

调用一般方法的时候可以来回调用(写法 编译好用)执行可能有问题;

//父类中使用了 this.eat

  1. //Animal是这里的父类
  2. public class Animal {
  3. public String name;
  4. public void eat(){
  5. System.out.println("这是动物的吃饭方法");
  6. }
  7. public void sleep(){
  8. //这里用了this.eat
  9. this.eat();
  10. System.out.println("这是动物的睡觉方法");
  11. }
  12. }

//又在子类里重写了eat方法

  1. public class Person extends Animal {
  2. //这是子类里的一个方法重写
  3. public void eat(){
  4. System.out.println("这是人类升级版的吃饭方法");
  5. }
  6. }

 //那么此时在主方法里new一个子类Person类的对象,并执行父类里的sleep方法

运行结果如下:

可见,原来父类里的this已经变成了执行时对象(子类里的对象),也就运行了子类里的重写的eat方法;

9.在创建子类对象之前会自动创建一个父类的对象,相当于隐藏了一行代码;

super();==>调用父类的构造方法;

=========================================================================

补充:Object类中的方法:

1.hashcode():将对象在内存中的地址经过计算得到一个int整数;

源码:

public native int hashCode();

2.to String():在打印输出时,将对象变成String字符串;

  1. public String toString(){
  2. //源码中这两个this.是被省略的;
  3. return this.getClass().getName()+"@"+Integer.toHexString(this.hashCode);
  4. }

3.get Class():获取对象对应类的类映射(反射);

4.equals():用来比较两个对象的内容,Object的默认效果是==;

== :可以比较基本数据类型(值),也可以比较引用类型(比较地址);

equals方法是Object类中继承过来的方法,默认效果是比较地址;如果需要改变规则,可以进行方法重写;

源码:

  1. public boolean equals(Obj obj){
  2. return (this == obj);
  3. }

5.wait():让线程进入挂起等待状态,存在重载(无参数,一个参数,两个参数);

6.notify():线程唤醒;

7.notifyAll():全部线程唤醒;

8.finalize():权限修饰符是protected,在对象被GC回收时,默认调用执行的方法;

                    构造函数(创建对象)---析构函数(回收对象);

9.clone():权限修饰符是protected,为了克隆对象;

=========================================================================

方法重写和方法重载的区别:

//方法的结构:

1.权限修饰符 : 

(public>projected>默认不写>private)

方法重写:子类可以大于等于父类;

方法重载:没有要求;

2.特征修饰符 :

(abstract,final,static)

方法重写:如果父类方法是final,子类不能重写;如果父类方法是static,子类不存在重写; 如果父类方法是abstract,子类如果是具体的必须重写,否则就是抽象类,可以不重写;

方法重载:没有要求;

3.返回值类型 :

方法重写:子类的返回值可以小于等于父类;

方法重载:没有要求;

4.方法名:

方法重写:子类与父类一致;

方法重载:一个类中的好多方法名一致;

5.参数值列表:

方法重写:子类与父类一致

方法重载:每一个方法的参数必须不一致

6.抛出异常:

方法重写:如果父类方法抛出运行时异常,子类可以不予理会;如果父类方法抛出编译时异常,子类抛出异常的个数少于等于父类;子类抛出异常的类型小于等于父类;

方法重载:没有要求;

7.方法体:

方法重写:子类的方法内容和父类不一致;

方法重载:每一个重载的方法执行过程一般不一致;

=========================================================================

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/78776
推荐阅读
相关标签
  

闽ICP备14008679号