/*
* @ClassName: test01
* @User: QianJueZhang
* @Description:
* @Date: 2023/3/13 22:05
*/
class A {
// A() {
// System.out.println("构造A");
// }
A(String str) {
System.out.println(str);
}
static void getA() {
System.out.println("父类中的静态方法");
}
void getZ() {
System.out.println("父类中的普通方法");
}
}
/**
* 本程序测试 多态、static、new的调用顺序
*/
public class Test extends A {
// 静态代码块
static {
System.out.println("111");
}
// 普通代码块
{
System.out.println("333");
}
Test() {
super("222");
System.out.println("本类构造中的其它语句");
super.getZ();
}
static void getA() {
System.out.println("子类重写父类中的静态方法");
}
public static void main(String[] args) {
Test test = new Test(); // 执行顺序: 静态代码块 --》 本类构造器(调用父类构造器) --》 普通代码块 --》 本类构造器(中其它语句)
A aa = new A("222");
/*
111
222
333
222
*/
System.out.println("============");
A.getA();
aa.getA(); // 父类中的静态方法
test.getA();
Test.getA(); // 子类重写父类中的静态方法
aa = test; // 子类引用 给 父类引用 --》多态
aa.getZ(); // 子类重写父类中的普通方法 (多态只能让父类调用子类中继承自父类的方法)
// aa.getS(); // 多态不能让 父类调用 子类的独有方法
aa.getA(); // 父类中的静态方法 (static方法 达不到过多态的效果,一般使用多态后,调用的是子类中的方法,但因为原方法是static方法,【对象.成员 和 对象.静态成员 的使用方法 有歧义】,所以调用的还是父类本身中的方法)
test = (Test) aa; //(在上面 父类引用实际指向子类对象 ) 父类引用 强制转换成子类 赋给 子类引用
// ( 在上面中,aa现在已经指向子类对象,把aa 强制转换成子类,那么现在 就可以把完全把aa看成一个指向了子类的引用 )
test.getA(); // 子类重写父类中的静态方法
test.getS(); // 子类独有普通方法
}
void getS() {
System.out.println("子类独有普通方法");
}
void getZ() {
System.out.println("子类重写父类中的普通方法");
}
}
#java 细节static、super
于 2023-03-18 10:19:48 首次发布
该程序演示了Java中构造器、静态方法、普通方法以及多态的调用顺序。在创建Test类实例时,执行顺序为静态代码块、父类构造器、普通代码块、本类构造器中的其他语句。静态方法不会体现多态行为,总是调用定义它的类的方法。而通过父类引用调用非静态方法时,如果子类重写了该方法,将执行子类的实现。
摘要由CSDN通过智能技术生成