java第五章 子类与继承
5.1子类与父类
1 java不支持多重继承,即一个子类不可以从多个父类中同时继承,而C++中可以。
人们习惯地称子类与父类的关系式“is—a”的关系
2 再类的声明过程中,通过关键字extends来定义一个类的子类
eg: class 子类名字 extends 父类名字{
}
3 java中的类按照继承关系可以形成树形结构,在这个树形结构中,根节点是Object类(Object类是java。lang包中的类),即Object类是所有类的祖先类,
每个类除了object类有且仅有一个父类,但是一个类可以有零个或多个子类,
如果一个类在声明的时候没有使用extend声明,那么这个类默认为objetc类的子类
eg: class a与class a extends Object 这两种声明是等价的
5.2 子类的·继承性
如果子类与父类在同一个包中,那么子类会继承父类中除了private属性外其他所有的变量和方法,
如果子类与父类不在同一个包中,那么子类会继承父类中除了private和default外其他属性的变量和方法;
对于protected属性的访问权限
比如·a是b的父类 b是c的父类 c是d的父类 在other类中使用d类创建的一个对象,如果使用这个对象调用的是d类中的protectde属性的变量或者方法,如果d类与other类在同一个包中,那么就可以访问,
如果使用对象调用的是d类的祖先类,如果追溯到祖先类,如果祖先类和other类在一个包中,那么便可以调用protectde属性的变量和方法
5.3子类与对象
1:在使用子类创建对象的时候,系统会为对象分配变量,并且为变量分配内存,所有子类中定义的变量与其父类的变量都会分配内存,但是这些变量并不都属于对象的,只有可以对象访问的变量才属于对象拥有的变量
eg: 比如在同一个包中,父类的private类型的变量也会分配内存,但是这些变量并不属于子类创建的对象所拥有,,同理,如果不在同一个包中,default属性的变量也同样2是这个道理
2:instanceof运算符instanceof运算符是一个双目运算符,左边的操作元氏对象,右边的操作元是类,如果左边的对象时右边的类创建的对象,或则是右边类的子创建的对象
那么返回的值是true,否则返回的值是false
5.4成员变量的隐藏和方法重写
成员变量的隐藏
只要子类新定义的变量和父类的变量重名,那么父类的变量便会被隐藏,即使类型不一样也可以
1子类继承的方法只能操作子类继承和隐含的成员变量吗,子类新定义的方法可以操作子类继承和子类新声明的成员变量,但是无法操作隐含的成员变量,(如果操作隐含的成员变量,需要使用super关键字来进行修饰,在后面还会介绍)
方法重写
1重写父类的方法的时候,不可以降低父类方法的访问权限,但是可以提高访问权限
2 JDK1.5对重写的更改,
子类重写方法的类型可以是父类方法类型的子类型,即不必完全一致,比如说,父类的方法类型是people类,子类的重写方法类型可以是student类,前提是student类是people类的子类
5.5super关键字
1.子类一旦隐藏了继承的成员变量,那么隐藏的成员变量便不再属于子类创建的对象拥有,该变量将属于super关键字拥有,被隐藏的·方法也是同样
eg: super.x或super.play()都是在调用隐藏的成员变量和成方法,都是被隐藏的
2. 由于子类不能继承父类的构造方法,因此,子类在其构造方法中对父类的构造方法进行调用的时候,super关键字所构成的语句必须是第一句,,如果在子类的构造方法中没有显示super关键字来调用父类的某个构造方法,那么默认会有 super();
super在调用父类的某个构造函数的时候,要注意根据调用的构造函数进行正常的传参问题
3如果在类中定义一个或多个构造方法的时候,类中不会提供默认的构造方法,就是不带参数的构造方法。所以,挡在父类定义多个构造方法的时候,应当包含一个不带参数的构造方法,以防止子类省略super关键字的时候,系统默认生成默认的super()已造成出现错误。
5.6 final关键字
final关键字可以修饰类,成员变量和方法中的局域变量,以及方法
1.
final修饰的类不允许继承,就是不可以有子类
2.final修饰方法不可以被隐藏,就是子类不可以对其进行更改重写,只能好好的继承
3.final修饰变量就是常量,常量在程序运行的过程中不可以被更改,所以在用final声明常量的必须直接进行初始化
5.7 对象的上转型对象
上转型对象的特点
上转型对象就是讲子类创建的对象的引用赋值给父类声明的对象
1. 上转型对象不可以操作子类新增的成员变量,也不可以操作子类新增的成员方法
2. 上转型对象可以调用子类继承的成员变量以及成员方法,可以调用被隐藏的成员变量和方法,,,,,但是如果子类重写了某个实例方法的话,那么上转型对像调用方法的时候调用的是重写之后的方法
1可以将对象的上转型对象强制转化为子类的对象,那么该对象再次具有了子类对象的功能。
2 不可以将父类创建的对象的引用赋值给子类声明的对象
3.如果子类重写了父类的静态方法,那么子类对象的上转型对象只能调用父类的静态方法,,不可以调用子类重写的静态方法
5.8继承与多态
什么是多态,当一个类有很多子类的时候,如果子类都重写了父类的某个方法的话,那么这些子类的对象的上转型对象调用重写的方法的时候就会产生多种行为,这就是继承与多态的关系
5.9 abstract类与abstract方法
1.对于abstract方法,只可以声明,不允许实现,其实就是没有方法体
而且记住两个不要 1:不可以使用final和abstract同时修饰一个方法和类,因为final方法和类不可以被子类继承,但是abstract类是可以被子类继承的,因为它需要被子类继承去实现
2:不可与使用static和abstract同时修饰一个方法,因为abstract方法是实例方法,而static方法是类方法,属于全局所拥有,是需要被类名才可以被调用的
2.abstract类中可以有abstract方法,也可以由非abstract方法,但是非abstract类中不可以有abstract方法
3.对于abstract类,我们不能使用new创建该类的对象,
具体原因我的理解是比如说人类是一个抽象类,由人类可以产生多个子类,比如中国人,美国人,英国人等等;由于人类是一个高度抽象的概念,至于具体的实现都是其子类具体分析实现的,所以,即使new创建了一个抽象类的对象,也无法调用其高度抽象的方法。
4.如果一个非抽象类是一个抽象类的子类,那么它必须重写父类的抽象方法,给出方法体,这就是为什么不可以用final和abstract同事修饰一个方法的原因了
5我们虽然不可以用new创建一个abstract类的对象,但是我们可以声明一个abstract类的对象,该对象可以成为其子类对象的上转型对象,也就可以调用子类重写的方法了
6如果一个abstract类是一个abstract类的子类,那么他既可以继承父类的abstract方法,也可以重写父类的方法
下面总结一句话就是 抽象继承抽象双可(既可以继承抽象方法,也可以重写抽象方法)
非抽象继承抽象单可(不可以继承抽象方法,只可以重写)
5.10面向抽象编程
什么是面向抽象编程:是指当设计某种重要的类的时候,不让该类面向具体的类,而是面向抽象类,即设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象
ps:具体类,是指相对于抽象类而言说的,主要是指可以实现的类,可以直接生成实例的类,具有方法体,可以直接调用
额外
设计程序的时候应该注意满足开-闭原则
怎么可以操作子类新增的成员变量?
子类新增方法 或 子类重写方法
子类可以体现多态