从已有类中,派生出新的类,新的类中吸收已有类当中的状态和行为,并能扩展出新的能力。
Java继承是使用己有类作为基础,建立新的类。
继承是一种从一般到特殊的关系,是一种“isa” 的关系,即子类是对父类的派生,是一种特殊的父类,
比如:狗是动物的一种特殊情况,狗属于动物。
卡车是车的一种特殊情况,卡车属于车…
如何表示继承
基于某个父类对对象的定义加以拓展,在Java语言中,存在多个类的时候我们使用"extends"关键字来表示子类和父类之间的关系,语法格式:
在定义子类的时候来表明自己需耍拓展于哪-一个父类.
public class子类类名extends 父类类名
{
编写自己特有的状态和行为
}
作用:解决代码重复的问题
子类与父类的继承关系
子类继承父类之后,可以拥有父类的某一些状态和行为。
子类复用了父类的功能或状态.但并不是父类当中所有的内容,子类都可以直接使用。
子类可以使用父类当中的哪些成员
1.如果父类中的成员使用public修饰,子类继承.
2.如果父类中的成员使用protected修饰,子类也继承,不同包也能继承
3.如果父类和子类在同一个包中,此时子类可有继承父类中默认的成员.不同包不能继承默认成员
4.如果父类中的成员使用private修饰,子类打死都继承不到.因为private只能在本类中访问.
5.父类的构造器,子类也不能继承因为构造器必须和当前的类名相同
子类扩展了父类,就获得了父类当中的方法和成员变量,
可是父类当中的某一些方法,不适合子类本身,不适合子类的方法,可以覆盖(在子类中重新定义方法),重新定义这个方法。
方法重写原则:
1.覆盖的方法要和父类中方法相同(签名:方法的名称+参数)
2.覆盖的方法的返回值 类型和父类一致
3.覆盖的方法访问权限要比父类权限大或相等
判断方法是香为覆盖方法
判断是否是覆写方法的必杀技: @Override
标签:若方法是覆写方法,在方法前或上贴
上该标签,编译通过,否则,编译出错。
方法的重载和方法覆盖的区别?
方法重载: Overload
作用:
解决了同一个类中,相同功能的方法名不同的问题.
既然是相同的功能,那么方法的名字就应该相同.
规则:同类中,方法名相同,方法参数列表不同!
方法重载: Override
作用:
解决子类继承父类之后,可能父类的某-一个方法不
满足子类的具体特征,此时需要重新在子类中定义
该方法,并重写方法体.
规则:父类和子类的方法签名是相同的
本身二者一点关系都没有,仅仅只是因为名字很像.
在类加载字节码时,会先判断有没有父类,如果有,会先把父类加载成字节码放到内存当中,然后再去把自己加载到内存当中
如果一个类有父类的,会在构造器当中,默认调用父类的构造器
继承的流程图
public class Bird {
void Fly() {
System.out.println("鸟都会飞");
}
}
public class Penguin extends Bird {
@Override
void Fly() {
System.out.println("企鹅不会飞");}
void Test(){
System.out.println("------test");
this.Fly();
super.Fly();
}
public static void main(String[] args) {
Penguin p=new Penguin();
p.Test();
}
}
package 继承;
class SuperClass {
String name = "myxq";
int age;
public static void test1() {
System.out.println("sub test1");
}
}
public class SubClass extends SuperClass {
//子类和父类当中有相同的静态方法,这时候我们称它是方法的隐藏
public static void test1() {
System.out.println("sup test1");
}
String name = "123";//隐藏
/**
* super直接 到父类当中去找。
使用super可以访问父类被隐藏的字段
super构造方法必须得要放到第一 行。
凡是子类的构造方法当中都会有super();
this() 也需要放在第一行,所以不能和super()一起使用
this.字段或方法先到本类当中去找指定的内容,
如果没有,再去到父当中去找。如果父类有, 再去看一下父类允不允铸继续,如果允许就使用父类的。
*
* */
void Test(String name) {
System.out.println(this.name);//本类隐藏
System.out.println(super.name);
}
public static void main(String[] args) {
SubClass sub = new SubClass();
sub.Test("1");
SubClass.test1();
SuperClass.test1();
}
}
/***
* 隐藏:
* 1.隐藏父类当中的字段子类当中和父类当中有相同的字段
* 2.隐藏父类的静态方法子类和父类有相同的静态方法,
* 3..本类字段隐藏 ,方法参数和本类字段名相同
*
*
* /
*/
*******Object*******
Object类是Java语言的根类,要么是-一个类的直接父类,
要么就是一个类的间接父类.
class MyXq{}其实等价于class MyXq extends Object{}
为什么Object是所有类的根类,到底什么是Object.
Object本身指对象的意思,我们发现所有的对象都具
有某一些共同的行为,所以,我们抽象出一个类:Object,
表示对象类,其他都会继承于Object类,也就拥有Object
类中的方法.