理解:子类继承父类的所有属性和方法
优点:减少代码的冗余
缺点:增加类与类之间的关系,增加代码的维护难度(修改了父类,子类会受影响)
package qf;
public class Person{
String name;
char sex;
int age;
public void eat(){
System.out.println(this.name+"吃饭饭");
}
public void sleep(){
System.out.println(this.name+"睡觉觉");
}
}
package qf;
public class Chinese extends Person{
String id;
public void playTaiJi(){
System.out.println("中国人打太极");
}
}
package qf;
public class Japanese extends Person{
String yearNum;
public void playVideo(){
System.out.println("日本人拍电影");
}
}
package qf;
public class Test01{
public static void main(String args[]){
//创建对象
Chinese c=new Chinese();
//操作父类的成员属性
c.name="王小胖";
c.sex='女';
c.age=20;
System.out.println(c.name);
System.out.println(c.sex);
System.out.println(c.age);
//操作子类的成员属性
c.id="20040123";
System.out.println(c.id);
//操作父类的成员方法
c.eat();
c.sleep();
//操作子类的成员方法
c.plagTaiJi();
System.out.println("--------------");
Japanese j=new Japanese();
j.name="外国小胖";
j.sex='女';
j.age=20;
System.out.println(j.name);
System.out.println(j.sex);
System.out println(j.age);
j.yearNum="小日本子";
System.out.println(j.yearNum);
j.eat();
j.sleep();
j.playVideo;
}
}
1、创建子类对象,会调用父类的构造方法吗?
会
2、创建子类对象,为什么会调用父类的构造方法?
因为会在子类中开辟空间,用于存储父类的成员属性3
先在方法区加载方法,字面值常量放到常量池(字符串类型),在栈中调用main方法,开辟空间,创建了对象,在方法区中加入Chinese.class,因为Chinese,继承成了Person,所以方法区中加入Person.class,在堆中new Chinese() 0x001(new子类一定会调用子类的无参构造),在new Chinese中放本类的成员变量,调用父类的无参构造方法,会在子类中开辟空间,放祖先类的属性,对象创建成功,在main中写Chinese c=0x001,c是引用,引用中存的是地址,接下来赋值。
3、创建子类对象先调用父类构造方法还是子类构造方法?
先调用子类构造方法(就近原则)
4、创建子类对象,先完成父类构造方法还是子类构造方法?
先完成父类的构造方法
子类构造方法默认第一句super();,调用父类的构造方法
子类对象是否能继承父类所有的属性和方法?
能
从使用的角度来说,在Java官网上子类不能继承父类私有的属性和方法,但实际上,子类可以调用父类私有的属性和方法,不能直接使用,可以在父类中编写公有的方法去调用私有的属性和方法,子类就可以调用了。
package fy; public class Father { private String fatterAttr="父类私有化属性"; public String getFatterAttr() { return fatterAttr; } public void setFatterAttr(String fatterAttr) { this.fatterAttr = fatterAttr; } private void method1(){ System.out.println("父类私有化方法"); } public void method2(){ method1(); } public Father(){ System.out.println("调用父类的构造方法"); } } package fy; public class Son extends Father{ public Son(){ super();//默认实现:调用父类的构造方法 System.out.println("调用子类的构造方法"); } } package fy; public class Test01 { public static void main(String[] args) { Son son=new Son(); System.out.println(son.getFatterAttr()); son.method2(); son.method2(); } }
理解:super表示父类
作用:
super.属性:表示在子类中调用父类的非私有化成员属性
super.方法:表示在子类中调用父类的非私有化的成员方法
super():表示在子类的构造方法中的第一行默认调用父类的非私有化的构造方法
package fy;
public class Son extends Father{
public Son(){ super();//默认实现:调用父类的构造方法 System.out.println("调用子类的构造方法"); } }
理解:在子类中把父类的方法重新写一遍
应用场景:父类的方法不能被改动时, 并且父类方法不满足子类需求, 在子类中重新写一遍
条件:
1、在子类中重写父类的方法
2、返回值、方法名、参数列表必须跟父类的重写方法一致
3、访问修饰符不能比父类更严格
@Override
重写的注解
作用:
给程序员和系统解释代码信息