继承
1.继承概念
实现代码复用 子类必须要添加一些新的内容,必须要体现出父类的不同 体现程序中分层设计—反映出事物由简单到复杂的认知
优点:重复的方法不需要自己来实现,直接从父类中继承子类继承
父类的行为和特征,使得子类具有和父类相同的实例域和方法。
2.Java中继承的语法格式
必须要有父类
修饰符 class类名称 extends 父类{。。。。。}
public class zi extends fu{
.......
}
注意:子类将父类除构造方法外所有内容都继承到子类当中
3.在子类中访问继承体系中的成员
访问成员变量
1. 子类与父类没有同名成员变量—优先访问自己,如果自己没有,再去父类中找
2. 在子类方法中 访问成员变量----优先访问自己的,如果没有,去父类中找
注意:在子类方法中,无法直接去访问父类中相同名称的成员变量 super(在子类中访问父类的成员)
4.继承对象中,子类对象构造
创建哪个类的对象,就会调用哪个类的构造函数 :1.子类对象是如何构造 2.子类的构造函数该如何写
1解释:父类如果没显示定义任何构造方法,此时编译器会为父类生成一份无参默认的构造方法,此时子类可以根据自己是否需要来选择实现
2解释:父类如果显示提供无参的构造方法。子类可以根据自己是否需要来选择实现----如果用户没有显示提供,则编译器会给子类生成一个默认构造方法
3.如果父类显示提供了带有参数的构造方法,则此时子类必须要显示提供构造方法----因为子类必须要在构造方法中通过super调用基类的构造方法完成子类对象中从基类继承下来的成员的构造
注意:
1.super必须是构造方法中的第一条语句
2. super 和this不能同时在构造方法中存在
(原因一:必须要为第一条语句
原因二:导致子类对象从父类继承下来的成员构造了多次)
public class Zi extends Fu{
int d;
public Zi(){
super(10,20);
d = 30;
System.out.println("Zi()");
}
public static void main(String[] args){
Zi zi= new Zi();
}
}
在继承体系中,子类和父类的对象事is-a关系
===子类对象是父类对象,反过来不可以
5.this 和 super
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
this和super都没有包含在对象中
super:只在代码中可以体现出来,告诉编译器访问基类的成员,但是实际在底层:但是没有super
public class Fu{
public Fu(){
System.out.println("我是父类构造方法");
}
{
System.out.println("我是父类实例代码块");
}
static{
System.out.println("我是父类静态代码块");
}
}
public class Zi extends Fu{
public Zi(){
System.out.println("我是子类构造方法");
}
{
System.out.println("我是子类实例代码块");
}
{
System.out.println("我是子类静态代码块");
}
public asttic void main(String[] args){
Zi zi = new Zi();
System.put.println("=========");
Zi z2 = new Zi();
}
}
//运行结果
// 打印顺序:打印顺序:父类静态 --> 子类静态-->父类实例 -->父类构造器 -->子类非实例 -->子类构造器
super 和 this调用的区别
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}
public class Test {
public static void main(String[] args) {
Animal a = new Animal();
a.eat();
Dog d = new Dog();
d.eatTest();
}
}
//运行结果:
//animal : eat
//dog : eat
//animal : eat
在类加载过程中一定先加载父类,在加载子类
6.访问权限
方法一般给的都会public
成员变量:一般设置为private或protected
private:修饰的成员不能在类外被访问,也不能被子类访问
protected:修饰的成员不能在类外被访问,可以被子类访问
7.继承方式
7.1单继承
一个类只能有一个父类
7.2多层继承
注意:Java不支持多重继承{一个类可以继承多个父类)
一般继承层次不会超过三层
8 . final关键字
//声明类:
final class 类名 {//类体}
//声明方法:
修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:
public asttic void main(String[] args){
int a = 10;
a=20; //可以改变a的赋值
final int b = 30;
// b=20 会报错 b被final修饰,认为b是一个常量。常量不能被修改
//注意:final在此处修饰的是array,表明该引用不能再去引用其他的数组
final int[] array = new int[0];
array = new int[20];//此处会报错
array[0] = 100;
注:实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是 final
final修饰类,表明这个类不能继承
9.继承的特性
1.子类拥有父类非 private 的属性、方法。
2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3.子类可以用自己的方式实现父类的方法。
4.Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
5.提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。