一:普通写法
package extend_;
public class Extends01 {
public static void main(String[] args) {
Pubil pubil = new Pubil();
pubil.name="小明";
pubil.age=18;
pubil.testing();
pubil.setScore(60);
pubil.showInfo();
System.out.println("-------------------------");
Graduate graduate = new Graduate();
graduate.name="王二狗";
pubil.age=20;
pubil.testing();
pubil.setScore(80);
pubil.showInfo();
}
}
package extend_;
//小学生
public class Pubil {
public String name;
public int age;
private double score;
public void setScore(double score) {
this.score = score;
}
public void testing() {
System.out.println("小学生"+name+"正在考小学数学");
}
public void showInfo(){
System.out.println("小学生名"+name+"年龄"+age+"成绩"+score);
}
}
package extend_;
public class Graduate {
public String name;
public int age;
private double score;
public void setScore(double score) {
this.score = score;
}
public void testing() {
System.out.println("大学生"+name+"正在考大学数学");
}
public void showInfo(){
System.out.println("小学生名"+name+"年龄"+age+"成绩"+score);
}
}
二:用继承方法写
结构为:
Extend01类:
package extend_.improve_;
import extend_.Graduate;
import extend_.Pubil;
public class Extend01 {
public static void main(String[] args) {
extend_.Pubil pubil = new Pubil();
pubil.name="小明";
pubil.age=18;
pubil.testing();
pubil.setScore(60);
pubil.showInfo();
System.out.println("-------------------------");
extend_.Graduate graduate = new Graduate();
graduate.name="王二狗";
pubil.age=20;
pubil.testing();
pubil.setScore(80);
pubil.showInfo();
}
}
Graduate类:
package extend_.improve_;
public class Graduate extends Student {
public void testing() {
System.out.println("大学生 "+name+" 正在考大学数学");
}
}
Pubil类:
package extend_.improve_;
//让Public 继承 Student类
public class Pubil extends Student{
public void testing() {
System.out.println("小学生 "+ name +" 正在考小学数学");
}
}
Student类:
package extend_.improve_;
//父类,是Public 和 Graduate 的父类
public class Student {
public String name;
public int age;
private double score;
//共有的方法
public void setScore(double score) {
this.score = score;
}
public void showInfo(){
System.out.println("学生名为 "+name+" 年龄"+age+" 成绩 "+score);
}
}
三:继承的细节
1.
注:我们发现 n4 和 test400() 爆错了,因为:私有属性和方法不能在子类中直接访问!!!,我们该怎么做才能访问呢?
答:要通过父类提供公共的方法去访问。
2.
package extend_;
public class Base {
public int n1=100;
protected int n2=200;
int n3=300;
private int n4=400;
public Base() { //无参构造器
System.out.println("父类Base()被调用");
}
//父类提供一个public的方法,返回n4
public int getN4(){
return n4;
}
public void CallTest400(){
test400();
}
public void test100(){
System.out.println("Base test100");
}
protected void test200(){
System.out.println("Base test200");
}
void test300(){
System.out.println("Base test300");
}
private void test400(){
System.out.println("Base test400");
}
}
注:先调用父类的构造器,在调用子类的构造器。为什么会调用呢,因为子类的无参构造器里面有super()命名(默认调用子类的无参构造器),可写可不写。
2.1


注:由上面一个图可知,无论怎么样,都先调用父类的无参构造器!!!
2.2:如果父类没有提供无参构造器,该怎么办?
该代码的无参构造器没有了,有一个有参构造器,(无参构造器被覆盖了)
package extend_;
public class Base {
public int n1=100;
protected int n2=200;
int n3=300;
private int n4=400;
// public Base() { //无参构造器
//System.out.println("父类Base()被调用");
// }
public Base(String name,int age ){ //有参构造器
System.out.println("父类Base(String name,int age )被调用");
}
//父类提供一个public的方法,返回n4
public int getN4(){
return n4;
}
public void CallTest400(){
test400();
}
public void test100(){
System.out.println("Base test100");
}
protected void test200(){
System.out.println("Base test200");
}
void test300(){
System.out.println("Base test300");
}
private void test400(){
System.out.println("Base test400");
}
}
上面有二个地方爆错
2.2:解决办法(加super指定调用父类中的哪个构造器)
运行效果:
四:继承的内存布局
package extend_;
public class ExtendsTheory {
public static void main(String[] args) {
Son son=new Son();
System.out.println(son.name);
System.out.println(son.age);
System.out.println(son.hobby);
}
}
class GrandPa{ //爷类
String name="大头爷爷";
String hobby="旅游";
}
class Father extends GrandPa{ //父类
String name="大头爸爸";
int age=30;
}
class Son extends Father{ //子类
String name="大头儿子";
}