Java学习笔记(七)——继承

来源:互联网 发布:淘宝卖家7天不发货 编辑:程序博客网 时间:2024/06/02 04:01

1.继承

1.父类:被继承的类。称之为超类、基类
2.子类:继承其他类的类,称之为子类、派生类、衍生类

子类对象拥有父类对象的所有属性,并可以访问修改父类方法的过程

extends:
  1. 继承:从父类继承一些属性和功能
  2. 扩展:重写,子类中自定义方法。
优点:
  1. 代码复用
  2. 实现多态
缺点:
  1. 打破封装 如果子类继承父类的功能,那么弗雷中的功能必须对于子类是可视的,那么在一定程度上打破了父类的封装性。
子类可以继承父类那些成员:
  1. 成员方法
  2. 成员变量
  3. 静态方法:main方法也可被继承
1、关于私有成员变量
无论父类中的成员变量是私有的、共有的、还是其它类型的,子类都会拥有父类中的这些成员变量。但是父类中的私有成员变量,无法在子类中直接访问,必须通过从父类中继承得到的protected、public方法(如get、set方法)来访问。
 
2、关于静态成员变量
无论父类中的成员变量是静态的、还是非静态的,子类都会拥有父类中的这些成员变量。
 
3、关于被子类覆盖的成员变量
无论父类中的成员变量是否被子类覆盖,子类都会拥有父类中的这些成员变量。

如果子类中有和父类相同的属性,那么子类中访问该属性,访问的是子类中的,子类中定义的属性会隐藏掉父类中同名的属性

2.方法重写


又称为覆盖,子类觉得父类的方法不满足子类的需求,那么可以在子类中重新定义和父类一样的方法。
父类中只有被继承下来的方法才能被子类重写。
子类在重写父类方法的时候需要注意的问题。
1:权限修饰符: 子类的重写的方法的权限修饰符,必须大于等于父类被覆盖方法的权限。 父类要求子类覆盖父类的方法 必须更加的无私。
2:返回类型:如果是基本数据类型,那么父类和子类覆盖的方法必须一致。如果是引用数据类型,那么子类中重写的方法的返回类型可以是父类中被重写的方法的返回类型的子类型。
3:方法名字:必须一致。
4:参数列表:必须一致,不然就是方法的重载。
5:方法抛出的异常: 子类重写的方法抛出的异常的范围要小于等于父类的。
6:方法体:和父类不同。
静态方法:可以被子类继承,不能被子类重写。在子类中写了一个和父类静态方法完全一样的方法,属于重新定义了一个,不属于重写。(依赖于类)
注意:
方法重写与重载
重载:

  1. 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载Overloading是一个类中多态性的一种表现。
  2. Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。
  3. 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
实例:
package com.chenxp.test_day_8_03.t02;/** * Created with IntelliJ IDEA. * Description: * User: ChenXinpeng * Date: 2017-08-03 * Time: 11:33 */public class A{    public static void main(String[] args) {        int a = 5;        A a1 = new A();        A a2 = new B();        B b = new B();        C c = new C();        D d = new D();        System.out.println(a1.show(b));  //A and A        System.out.println(a1.show(c));  //A and A        System.out.println(a1.show(d));  //A and D        System.out.println(a2.show(b));  //B and A        System.out.println(a2.show(c));  //B and A        System.out.println(a2.show(d));  //A and D        System.out.println(b.show(b));   //B and B        System.out.println(b.show(c));   //B and B        System.out.println(b.show(d));   //A and D    }    //重载    public String show(D obj){        return ("A and D");    }    //重载    public String show(A obj){        return ("A and A");    }}class B extends A{    //重载    public String show(B obj){        return ("B and B");    }    //重写    public String show(A obj){        return ("B and A");    }}class C extends B{}class D extends B{}




原创粉丝点击