“继承”是面向对象的第二特征(那什么是特征?什么是第一特征?),体现了类与类之间的“is-a”关系(“is-a”又是什么关系)。当两个类进行继承关联属性时,子类自动具备来自于父类的属性和行为,做到代码的复用和设计的分离。JAVA是一门面向对象的语言。
java继承的机制
类 Object
首先,我们看下面的这个自定义类(Student);
//自定义类Student
public class Student{
//自定义方法 study
public void study(){
System.out.println("好好学习,天天向上");
}
}
在使用的过程中,我们定义一个方法study(学习),除此之外没有定义其他东西,但是在使用时却发现Student对象除了有Study方法外,还有其他一些方法
这些方法从哪里来的呢?这里提到一个非常重要的类java.lang.Object
JDKDOC文档(在哪里打开?)里很明确的告诉我们:Object 类在整个类的继承体系中是处于绝对顶层的位置,它是所有类的根,是祖宗,st对象额外多出来的方法就是来源于它。
所谓的继承就是把共有的数据项和行为抽取到父类中,这样所有的子类都会自动的具备,从而达到复用性。那么,类Object的所有方法都共有性最强的方法。
关键字 extends
我们知道在默认情况下任意一个类都会自动继承Object类,那么,如果我们需要指定一个类继承于某个其它的父类类型,就要用到extends关键字了!
public class Superclass{
public void methodA(){......}
}
public class Subclass extends SuperClass{
public void methodB(){...}
}
注意
1.类 SubClass的父类是类SuperClass,而类SuperClass的父类是默认的类Object;所以通过类的继承的传递性,SuperClass具备来自Object的所有数据和行为,SubClass具备来自于SuperClass的所有数据和行为,所以SubClass也具有来自Object的数据和行为;
2.“extends”的英文本意是“扩展”,也就是说子类在父类的基础上是可以有变化性的。这种变化性体现为 :增加子类新的属性和新的行为,或修改继承而来的行为(属性不能修改!)
构造方法:
1.父类的构造方法不会被子类继承!
第一:构造方法语法上要求方法名必须与类名保持一致。所以如果子类继承了父类的构造方法,那么很明显两个语法就冲突了(父类构造方法的名字肯定是父类名,必然和子类名一样!)
第二:构造方法是用来产生对象的。如果子类通过继承拥有了父类的构造方法,那么子类也可以控制父类对象的产生?这也是不对的!(真的不对?)
构造方法不能被重写!
构造方法的作用就是在产生对象的时候,利用内存叠加(什么又叫内存叠加呢?)实现继承机制。
属性
1.父类的属性会被子类继承,无论访问修饰符
在继承机制中已经讲过,产生子类对象会产生父类对象部分,然后叠加子类持有部分,从而构成完整子类对象。所以父类的属性都会放入到父类的对象部分,那么也就在完整子类对象中。
父类的private属性会被继承,但无法访问
private修饰符其本意为:私有。父类如果把该属性定义为了private,即意味着该属性只能让父类自己内部直接访问(举个例子,不是很懂);而子类从语意上就不应该能够访问它(没有得到父类的允许)。
子类可以拥有和父类同名属性,不会发生覆盖。
语法:
关键字:extends;(关键字:一门计算机语言的词汇)
格式:public class 子类名 extends 父类名{}
标识词:package class interface int(数据类型)
修饰词;
-权限:public private protected("缺省") static final abstract
连接词:extends implements
逻辑 :if else while for do switch case default return break
特殊类型: void
值: null true false
行为词:new
继承当中:子类与父类之间
1.子类继承了父类什么?所有的
2.子类以及子类对象可以调用到继承的哪些东西?
答:1.继承到自己身上的了(如方法和属性)
2.调用的最终执行场景一定是实例(对象)来调用(在写的过程 与代码执行时 分开思考)如何分开思考?举个例子?
3.属性和方法都可以被继承;{1.实现代码的复用,多个子类共同属性和方法都定义在父类当中,所有的子类都复用这一份代码}
4.访问权限的限制;{
1.访问权限修饰符的作用:规定 类 属性 方法 在项目不同域(就是包)之间的调用权限 举个例子?
域:不同的文件 不同的文件夹 不同的类
类的成员 之间范围(代码块)可以理解为 类的两个大括号之间{ ....}
}
!public--整个项目下的src lib !private--类 !protected--同一个包下 不同包的子类中{就是同一个包下的都可以都可以继承}
!缺省的不写--同包下!
1.属性变量//不需初始化——创建对象时默认初始化赋值
2.参数变量//不需要初始化,调用方法时必须传入对应类型的数据——调用方法时必须传入对应类型的数据
3.局部变量//必须初始化——没有机会去修改或者重新赋值!
局部变量的关系
继承时:调用时就近原则。
方法重写:
-子类之间大致相同 各自有各自的特点
-子类可以自己类中定义自己这一类的属性和方法(子类之间 行为名一致 但是行为不一致)
在父类中华把行为定义的抽象一些
子类重写父类的方法继续扩展;
语法:
1.子类中重写父类的方法,一般要求除方法体之外 皆与父类一致;
2.最好使用@override//注解 检查重写是否正常!
3.子类以及子类对象会优先调用重写之后方法
4.子类孙子类向上一直继承,方法全部继承上一级父类
优点:1.代码逻辑 差异 结构 可以体验出来 代码复用;