文章目录
- 继承
 - 继承概念
 - 继承的语法
 
- super关键字
 - super和this
 - 继承方式
 - 多态
 - 多态的概念
 - 多态实现条件
 
- 重写
 - 重写和重载的区别
 
继承
Java中使用类对现实世界中实体来进行描述,类经过实例化之后的产物对象,则可以用来表示现实中的实体,事物之间可能会存在一些关联
 那能否将这些共性抽取呢?面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。
继承概念
继承机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性
 的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了
 由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。
继承的语法
在Java中如果要表示类之间的继承关系,需要借助extends关键字,具体如下:
修饰符 class 子类 extends 父类 {
// ... 
}
 
// Animal.java
public class Animal{
	String name;
	int age;
	public void eat(){
		System.out.println(name + "正在吃饭");
	}
	public void sleep(){
		System.out.println(name + "正在睡觉");
	}
}
// Dog.java
public class Dog extends Animal{
	void bark(){
		System.out.println(name + "汪汪汪~~~");
	}
}
 
注意:
 在子类方法中 或者 通过子类对象访问成员时:
 如果访问的成员变量子类中有,优先访问自己的成员变量。
 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
 如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
 成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。
成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时
 再到父类中找,如果父类中也没有则报错。
通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到
 则访问,否则编译报错。
 通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用
 方法适传递的参数选择合适的方法访问,如果没有则报错;
 问题:如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?
super关键字
Java提供了super关键字,该关键字主要作用:在子类方法中访问父类的成员。
public class Base {
	public void methodA(){
		System.out.println("Base中的methodA()");
	}
	public void methodB(){
		System.out.println("Base中的methodB()");
	}
}
public class Derived extends Base{
	public void methodA(int a) {
		System.out.println("Derived中的method(int)方法");
	}
	public void methodB(){
		System.out.println("Derived中的methodB()方法");
	}
public void methodC(){
		methodA(); // 没有传参,访问父类中的methodA()
		methodA(20); // 传递int参数,访问子类中的methodA(int)
		methodB(); // 直接访问,则永远访问到的都是子类中的methodB(),基类的无法访问到
	}
}
public class Base {
	int a;
	int b;
	public void methodA(){
		System.out.println("Base中的methodA()");
	}
	public void methodB(){
		System.out.println("Base中的methodB()");
	}
}
 
在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可。
 【注意事项】
- 只能在非静态方法中使用
 - 在子类方法中,访问父类的成员变量和方法。
 
即:子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。
注意:
- 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构
造方法 - 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的
父类构造方法调用,否则编译失败。 - 在子类构造方法中,super(…)调用父类构造时,必须是子类构造函数中第一条语句。
 - super(…)只能在子类构造方法中出现一次,并且不能和this同时出现
 
super和this
super和this都可以在成员方法中用来访问:成员变量和调用其他的成员函数,都可以作为构造方法的第一条语
 句,那他们之间有什么区别呢?
 【相同点】
- 都是Java中的关键字
 - 只能在类的非静态方法中使用,用来访问非静态成员方法和字段
 - 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在
【不同点】 - this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成
员的引用 - 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
 - 在构造方法中:this(…)用于调用本类构造方法,super(…)用于调用父类构造方法,两种调用不能同时在构造
方法中出现 - 构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有
 
继承方式
Java中只支持以下几种继承方式:
 注意:Java中不支持多继承。
 一般我们不希望出现超过三层的继承关系. 如果继承层次太多, 就需要考虑对代码进行重构了.如果想从语法上进行限制继承, 就可以使用 final 关键字
final关键可以用来修饰变量、成员方法以及类。
- 修饰变量或字段,表示常量(即不能修改)
 - 修饰类:表示此类不能被继承 我们平时是用的 String 字符串类, 就是用 final 修饰的, 不能被继承.
 - 修饰方法:表示该方法不能被重写(后序介绍)
 
多态
多态的概念
多态的概念:通俗来说就是 ,同一件事情,发生在不同对象身上,就会产生不同的结果。
多态实现条件
在java中要实现多态,必须要满足如下几个条件,缺一不可:
- 必须在继承体系下
 - 子类必须要对父类中方法进行重写
 - 通过父类的引用调用重写的方法
多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法。 
重写
重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程
 进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
 】
 子类在重写父类的方法时,一般必须与父类方法原型一致: 返回值类型 方法名 (参数列表) 要完全一致
 被重写的方法返回值类型可以不同,但是必须是具有父子关系的
重写和重载的区别

即:方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。



















