继承概念及简单应用
目录
前言
继承是面向对象语言的主要特征之一。继承使得程序的整个架构具有相当的灵活性,更具有层次,提高了代码的可重用性,降低了程序的编写难度。
一、继承是什么?(inheritance)
1、继承背后的思想就是基于存在的类构建新的类
2、从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求(子类拥有父类中所有的属性和方法,儿子比父亲更加强大)
3、约定:从其它类导出的类叫子类,被导出的类叫父类;Java中,除了Object类之外,所有的类都是子类,都有唯一(唯一的原因:Java单继承的)的父亲
二、类之间的关系
1、Is-a 继承体现
2、Has-a 组合体现
3、Like-a 实现接口体现
三、继承的意义
1、代码重用
2、体现不同抽象层次
3、可轻松自定义子类
四、父子类关系
1、父类更抽象,更一般
2、子类更具体,更特殊
五、实现
extends关键字表示一个类继承了另一个类
代码如下:
package com.aaa.test;
public class Teacher {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
demo2.demo2Test();
}
}
/*父类*/
class Demo1{
public void demo1Test(){
System.out.println("我是父类");
}
}
/*子类*/
class Demo2 extends Demo1{
public void demo2Test(){
System.out.println("我是子类");
}
}
六、super关键字
1、super代表的是父类对象的引用
2、当子父类的成员出现同名时,可以通过super来进行区分
3、子类的构造方法中,通过super关键字调用父类的构造方法
强调:
1、当构造一个子类对象的时候一定会先调用父类的构造方法来构造父类的对象。调用父类构造方法的语句必须是子类构造方法中的第一条指令。
2、子类调用父类无参的构造方法是可以省略的
七、final关键字
1、final可以用来修饰变量、方法、类
2、final修饰的变量是一个常量。一旦赋了值就不能在修改。(常量一半都和static关键字配合使用)
3、final修饰类表示此类不能被继承
4、final修饰方法代表此方法不能被重写
5、final修饰引用数据类型指代此引用不能改变(中途不能再去new或赋值)
八、Object类
Java中任何类都继承了Object类中的方法,主要有:
1、toString()
2、equals()
3、hashcode()
4、clone()
5、getClass()
6、finalize()
九、方法重写(Override)
1、概念
方法重写是指子类可以根据需求对父类继承来的方法进行改写,是多态机制的前奏
2、方法重写的注意点
(1、)重写方法必须和被重写方法具有相同的方法名称、参数列表和返回值
(2、)重写方法不能使用比被重写方法更严格的访问权限
(3、)父类中私有的方法不能被重写
(4、)在子类中重写的方法中继续调用父类父类被重写的方法可以通过调用super.函数名获取
十、特性代码实现
1、子类生成的时候父类已经创建完成
代码如下:
package com.aaa.test;
public class Teacher {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
demo2.demo2Test();
}
}
/*父类*/
class Demo1{
/*父类无参构造方法*/
public Demo1(){
System.out.println("我是父类构造方法");
}
public void demo1Test(){
System.out.println("我是父类");
}
}
/*子类*/
class Demo2 extends Demo1{
/*子类无参构造方法*/
public Demo2(){
System.out.println("我是子类构造方法");
}
public void demo2Test(){
System.out.println("我是子类");
}
}
结果如下:
2、子类拥有父类所有的方法
代码如下:
package com.aaa.test;
public class Teacher {
public static void main(String[] args) {
Demo2 demo2 = new Demo2();
demo2.demo2Test();
}
}
/*父类*/
class Demo1{
/*父类无参构造方法*/
public Demo1(){
System.out.println("我是父类构造方法");
}
public void demo1Test(){
System.out.println("我是父类");
}
}
/*子类*/
class Demo2 extends Demo1{
/*子类无参构造方法*/
public Demo2(){
super();/*调用父类无参构造方法*/
System.out.println("我是子类构造方法");
}
public void demo2Test(){
System.out.println("我是子类");
demo1Test();/*等同于spuer.demo1Test();*/
}
}
结果如下:
3、案例
代码如下:
package com.aaa.test;
public class Teachers {
public static void main(String[] args) {
JavaTeacher javaTeacher = new JavaTeacher("张三",24);
javaTeacher.teaching();
}
}
/*父类 模糊定义*/
class TeacherA{
/*老师有名字,年龄属性*/
private String name;
private int age;
/*无参构造方法*/
public TeacherA(){}
public TeacherA(String name,int age){
this.name = name;
this.age = age;
}
/*老师有教学的方向*/
public void teaching(){
System.out.println("准学教学");
}
}
/*子类 具体实现*/
class JavaTeacher extends TeacherA{
public JavaTeacher(String name,int age){
super(name,age);
}
@Override
public void teaching(){
super.teaching();/*调用父类的方法*/
System.out.println("Java");
}
}
结果如下:
总结
若有不足多多指教