继承思想
继承extents
public class Student extends Person
extents 表示继承 后面是父类 前面是子类
继承子类与父类的关系
public 子类都可以继承
protected 子类可以继承,不同包不能继承
默认:同一个包可以继承,不同包不能继承
private:子类打死都继承不到.
父类的构造器子类不能继承
继承方法的覆盖
子类你扩展了父类,获得了父类当中的方法和成员变量,
可是父类当中的某些方法,不适合子类本身
不适合子类的方法,可以覆盖,重新定义这个方法
我们称子类重新定义父类当中方法的过程,方法的覆盖(重写)
Penguin p =new Penguin();
//企鹅
p.fly();
//会到子类当中去找,有没有调用的方法,如果没有,再去到父类当中查找
覆盖的原则:
1.覆盖的方法必须要跟父类的当中方法名相同(签名:方法名称+参数)
2.覆盖的方法返回值类型必须要和父类一样
3.覆盖的方法访问权限必须要比父类方法大或者一样大(不能比父类的还小)
@Override //判断该方法是否为覆盖的方法
void fly(){
}
package Wzb;
public class Penguin extends Bird {
@Override //判断该方法是否为覆盖的方法
void fly() {
System.out.println("企鹅起飞啦");
}
void test() {
System.out.println("test---------");
fly();//到自己类当中去找方法 fly=this.fly(); this 代表当前使用对象
super.fly();//代表是父类对象 到父类中找指定的方法
}
public static void main(String[] args) {
//如果一个类有父类的,会在构造器当中,默认调用父类的构造器
//先创建父类对象,再创建自己
Penguin p = new Penguin();
p.fly();
//会到子类(本类)当中寻找有没有调用的方法,如果没有,再去父类当中查找
p.test();
}
}
继承内存分析
1.在类加载字节码是,会先判断有没父类,如果有,会先把父类加载成字节码放到内存当中,然后再去把自己加载到内存当中去,先加载父类,再加载自己(先初始化父类再初始化子类)
2.如果一个类有父类的,会在构造器当中,默认调用父类的构造器
3.凡是子类的构造方法当中都会有super();
4.不要与this();当前类构造方法一起使用
字段隐藏
package 继承.A;
class SuperClass{
String name ="myxq";
int age;
public static void test1() {
System.out.println("sup test1");
}
}
public class SubClass extends SuperClass {
//子类和父类当中有相同的静态方法,这时候我们称它是方法的隐藏,不是静态的称是覆盖
public static void test1() {
System.out.println("sub test1");
}
String name = "123";//字段隐藏
void test() {
//this.字段或方法,先到本类当中去找指定的内容,如果没有,再去父类当中去找
//如果父类有,再去看一下父类允许继承,如果允许就使用父类的.
//super 直接到父类当中去找
//使用super可以访问父类被隐藏的字段
System.out.println(this.name);
System.out.println(super.name);
}
public static void main(String[] args) {
SubClass one =new SubClass();
one.test();
SubClass.test1();
SuperClass.test1();
}
/**
* 隐藏:
* 1.隐藏父类当中的字段 子类当中和父类当中有相同的字段 继承字段隐藏 super.字段
* 2.隐藏父类的静态方法 子类和父类有相同的静态方法,
* 3.本类字段隐藏 方法参数和本类字段名相同 this.字段
*/
}
Object类
toString();方法使用 要覆盖原来Object类的方法
网友评论