/**
* 本案例是为了验证继承中 父类与子类 静态方法,实例方法,同名属性的的关系 ---继承?重写? 隐藏 ? *
* @author 张永志 1279938986@qq.com
*/
class Father {
String id = "010";
String name = "Father";
public static int age = 30;
String pro = "IT";
void run1() {
System.out.println("父类的run1()方法");
System.out.println(name + ":" + age);
}
static void run2() {
System.out.println("父类的run2()方法");
}
void run3(){
System.out.println("父类run3()方法");
}
}
/**
* 当子类中有父类的同名属性(变量)时,父类的变量被隐藏
*/
class Son extends Father {
String name = "Son";
int age = 2;
int id = 010;// 注意此处的id为int类型且为八进制的010
String sex = "男";
@Override // 子类重写了弗雷德方法则
void run1() {
System.out.println("子类的run1()方法");
// 下一行中的name和age的输出是什么先思考,再运行
System.out.println(name + ":" + age + ":" + id);
System.out.println(this.name + ":" + this.age + ":" + this.id);
System.out.println(super.name + ":" + super.age + ":" + super.id);
}
// 注意 run2()为静态方法 在子类中再次写后 父类的方法被隐藏
static void run2() {
System.out.println("子类的run2()方法");
}
void run4(){
System.out.println("父类run4()方法");
}
}
public class TestExtends {
public static void main(String[] args) {
System.out.println("-------父类的方法和属性-----------");
Father f1 = new Father();
f1.run1();
f1.run2();
f1.run3();
System.out.println("---------子类的方法和属性------------------");
Son son1 = new Son();
son1.run1();
son1.run2();
son1.run3();//继承父类的方法
son1.run4();
System.out.println("-----------重点来了:定义是父类, new的是子类如何执行的呢----------------");
Father f2 = new Son();
f2.run1();
f2.run2();
f2.run3();
//f2.run4(); //不可运行 没有为类型 Father 定义方法 run4()
System.out.println(f2.name + ":" + f2.age + ":" + f2.id);
// System.out.println(f2.sex);//此处不可以运行运行子类的sex字段,因为父类没有sex字段
/**
* 解释原因:f2.run1() 因为子类中的方法是实例方法会覆盖掉父类的方法故运行的是子类的run1(); f2.run2()
* 因为是类方法(静态方法)只会被隐藏不会被覆盖,故运行的方法是父类的run2(); f2.name和f2.age
* 因为子类父类均有同名属性,,同名属性只会被隐藏不会被覆盖,故调用的是父类的name和age f2.sex不可以调用 因为父类没有
* sex的属性
*/
System.out.println("------将f2强转为Son类型 注意执行的情况---------------------");
Son s2 = (Son) (f2);
s2.run1();
s2.run2();
s2.run3();
s2.run4();
System.out.println(s2.name + ":" + s2.age + ":" + s2.id);
System.out.println(s2.sex + ":" + s2.pro);
// s2可以执行子类的全部属性和方法包含继承的属性和方法
System.out.println("-------将父类强转为子类------------");
Son s3 = (Son) f1; // 此语句编译时不会出错运行时会出现转换异常
// 问:f2为什么可以强制转换为Son
// 因为 f2本身是由Son类型转换过来的 只是回归自身而已
s3.run1();
s3.run2();
s3.run3();
s3.run4();
}
* 本案例是为了验证继承中 父类与子类 静态方法,实例方法,同名属性的的关系 ---继承?重写? 隐藏 ? *
* @author 张永志 1279938986@qq.com
*/
class Father {
String id = "010";
String name = "Father";
public static int age = 30;
String pro = "IT";
void run1() {
System.out.println("父类的run1()方法");
System.out.println(name + ":" + age);
}
static void run2() {
System.out.println("父类的run2()方法");
}
void run3(){
System.out.println("父类run3()方法");
}
}
/**
* 当子类中有父类的同名属性(变量)时,父类的变量被隐藏
*/
class Son extends Father {
String name = "Son";
int age = 2;
int id = 010;// 注意此处的id为int类型且为八进制的010
String sex = "男";
@Override // 子类重写了弗雷德方法则
void run1() {
System.out.println("子类的run1()方法");
// 下一行中的name和age的输出是什么先思考,再运行
System.out.println(name + ":" + age + ":" + id);
System.out.println(this.name + ":" + this.age + ":" + this.id);
System.out.println(super.name + ":" + super.age + ":" + super.id);
}
// 注意 run2()为静态方法 在子类中再次写后 父类的方法被隐藏
static void run2() {
System.out.println("子类的run2()方法");
}
void run4(){
System.out.println("父类run4()方法");
}
}
public class TestExtends {
public static void main(String[] args) {
System.out.println("-------父类的方法和属性-----------");
Father f1 = new Father();
f1.run1();
f1.run2();
f1.run3();
System.out.println("---------子类的方法和属性------------------");
Son son1 = new Son();
son1.run1();
son1.run2();
son1.run3();//继承父类的方法
son1.run4();
System.out.println("-----------重点来了:定义是父类, new的是子类如何执行的呢----------------");
Father f2 = new Son();
f2.run1();
f2.run2();
f2.run3();
//f2.run4(); //不可运行 没有为类型 Father 定义方法 run4()
System.out.println(f2.name + ":" + f2.age + ":" + f2.id);
// System.out.println(f2.sex);//此处不可以运行运行子类的sex字段,因为父类没有sex字段
/**
* 解释原因:f2.run1() 因为子类中的方法是实例方法会覆盖掉父类的方法故运行的是子类的run1(); f2.run2()
* 因为是类方法(静态方法)只会被隐藏不会被覆盖,故运行的方法是父类的run2(); f2.name和f2.age
* 因为子类父类均有同名属性,,同名属性只会被隐藏不会被覆盖,故调用的是父类的name和age f2.sex不可以调用 因为父类没有
* sex的属性
*/
System.out.println("------将f2强转为Son类型 注意执行的情况---------------------");
Son s2 = (Son) (f2);
s2.run1();
s2.run2();
s2.run3();
s2.run4();
System.out.println(s2.name + ":" + s2.age + ":" + s2.id);
System.out.println(s2.sex + ":" + s2.pro);
// s2可以执行子类的全部属性和方法包含继承的属性和方法
System.out.println("-------将父类强转为子类------------");
Son s3 = (Son) f1; // 此语句编译时不会出错运行时会出现转换异常
// 问:f2为什么可以强制转换为Son
// 因为 f2本身是由Son类型转换过来的 只是回归自身而已
s3.run1();
s3.run2();
s3.run3();
s3.run4();
}
}
运行情况:
![](https://i-blog.csdnimg.cn/blog_migrate/8854a8e0c353de30e4c6223b2814538d.jpeg)