关于"多态"static方法的理解

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

 要强调的是,多态性只发生于方法,而不发生于域.并且,对于方法,只有那些非static与非final方法才具有多态性.

这里讨论的是static方法不能发生多态.值得注意的是,所谓的static方法不能多态指的是:override的方法本身是不是static的,而不是指调用override方法的方法是不是static的!
比如以下程序:

 

class Father 
    
public void act() 
        System.out.println(
"Father.act()"); 
    }
 
}
 

class Son extends Father 
    
public void act() 
        System.out.println(
"Son.act()"); 
    }
 
}
 
public class Test 
    
public static void test(Father i) 
        i.act(); 
    }
 
    
public static void main(String[] a)
        Son son 
= new Son(); 
        test(son); 
    }
 
}
 

输出结果为:Son.act(),如果static不能多态,那结果不就应该是Father.act()吗?

其实,就象上面说的.我们要考虑的是的act()方法是不是static,有没有多态,而不是调用的方法test()是不是static的.
这跟test方法是否static无关,若把两个act方法都修改成static,则输出结果就是Father.act(),因为static方法不能多态.

static多态 static的注意事项和javase中的多态 阅读详情

相关推荐

面向对象,static关键字,继承以及多态理解及一些细节。

static关键字可以修饰成员变量,成员方法 读成静态成员变量,静态方法 特点:1.被static修饰的成员被该类的所有对象所共享 2.被static修饰的成员,会随着该类的字节码文件的加载而加载,优先于对象存在(对象是要在字节码文件加载完后才能创建的,而静态成员是字节码文件只要加载完就存在的,不用另外进行创建,所以会优先于对象存在),所以静态成员方法中不能含有非静态成员,也不能有this关键字(this关键字代表的是当前对象的引用,而静态方法是在对象还没创建就能使用的,所以当静态方法使用的时候可能对象还没

m0_46258226的博客 338

C++静态多态和动态多态(静态联编:函数地址早绑定、动态联编:函数地址晚绑定)

如果没有使用虚函数,即没有利用 C++ 多态性,则利用基类指针调用相应函数的时候,将总被限制在基类函数本身,而无法调用到子类中被重的函数。当我们使用delete删除一个指向子类对象的基类指针时,如果基类的析构函数不是虚函数,那么只会调用基类的析构函数,而不会调用子类的析构函数,这样就会导致子类对象的资源没有被释放,从而引发内存泄漏等问题。动态多态最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而调用不同的方法。而多态的目的则是为了。

Dontla的博客 2681

C++多态:静态多态(函数地址早绑定),动态多态(函数地址晚绑定)虚函数表,虚析构函数重

只要类中存在修函数或纯虚函数,那么类内就会自动生成一个虚函数表指针,指向一张虚函数表,在这个虚函数表中,存放着类内所有虚函数的地址。当这个类被它的子类继承时,子类也会继承这个虚函数表指针,与虚函数表,(注意两张虚函数表不是同一张表,可以理解为复制了一张虚函数表交给子类的虚函数标配指针。) 现在只要子类中对父类的虚函数和纯虚函数进行函数重,那么子类中重后的函数地址就会将原来的函数地址覆盖掉。这样就实现了动态的多态。.........

qq_51004011的博客 2182

面向对象--多态

多态分为两类:1,静态多态:函数重载和运算符重载属于静态多态,复用函数名2,动态多态:派生类和虚函数实现运行时多态静态和动态的区别:1,静态多态函数的地址早绑定-编译阶段确定函数地址2,动态多态函数地址晚绑定-运行阶段确定函数地址。

2303_76561497的博客 107

C++面试

面试题 1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明, 但是只在一个地方定义。加入 extern 修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分 定义。 说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间, 如外部变量。 面试题 2:sizeof 和 strlen 的区

578

java中关于final方法static方法不具备多态性的理解

先说明一下这里的多态性特指方法的重方法的重载不会受到final,static修饰符的影响,一个类中当然可以有多个static或者final修饰的同名但不同参数类型的方法,重载根据传入参数的实际类型来确定调用哪一个方法。 那为什么final(private方法是一种隐式的final方法)和static方法不能够被重呢? 1.final方法很好理解,因为不可以被继承,自然不可以被子类

xdugucc的博客 519

Java 核心知识点整理:final、static多态

数组创建方式构造方法对象创建过程this 关键字方法重载(Overload)类的封装步骤示例代码

2401_85233048的博客 1068

java中的static方法可以被重吗?(从方法调用过程理解

原贴:https://blog.csdn.net/m0_37974032/article/details/81157433 答案是:不可以。 首先明确一点,在子类中重父类的static方法,是不会报错的,编译也可以通过,但是在通过一个声明为父类,实际类型为子类的引用变量调用该方法时,发现被调用的仍是父类中原本以为会被覆盖的方法,不具有“多态”特性。描述有点绕,看下面的例子: 父类Hero:......

Turn X7 5155

Java多态理解与使用

一、如何理解多态? 教科书式的解释为,多态的存在有三个前提: 1.要有继承关系 2.子类要重父类的方法 3.父类引用指向子类对象 多态的弊端,就是:不能使用子类特有的成员属性和子类特有的成员方法。如需要,需要强转为子类(向下转型)。 纸上得来终觉浅,绝知此事要躬行,真正很好的理解多态用法, 还是的代码。 举一个例子:假如一个人出门吃东西,吃了面条,又吃米饭,又吃水果。。。等等。 ...

代码要像诗 3095

Java 深入:static、类加载顺序与多态

Javastatic、类加载与多态机制解析 摘要:本文系统阐述Javastatic关键字、类加载顺序与多态机制。static修饰的成员属于类层级,在类初始化阶段执行;类加载遵循父类优先原则,依次经历加载、连接和初始化阶段;多态则通过动态绑定实现运行时方法调用。文章通过典型示例展示了这些核心机制的执行顺序与内存表现,并指出常见陷阱,如静态变量依赖问题、final常量内联等,强调应避免可变静态状态和复杂的静态依赖关系。掌握这些概念对理解Java面向对象特性和编健壮代码至关重要。

alkamgg的博客 1287

Java中子类是否可以继承父类的static变量和方法而呈现多态特性

静态方法 通常,在一个类中定义一个方法static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明为static方法有以下几条限制: 它们仅能调用其他的static 方法。 它们只能访问static数据。 它们不能以任何方式引用this 或super。 无论是static修饰的变量,还是static修饰方法,我们都知道他们是属于类本身的,不是属于某一个对象的,当声明一个对象时,并不产生static变量和方法的拷贝。也就是说,用static修饰的变量和方法在类加载的时候,只分

wounler的博客 2303

多态类型转换中,dynamic_cast和static_cast的区别

在C++中,和都是用于类型转换的关键字,但它们在多态类型转换中的作用和使用场景有所不同。fill:#333;color:#333;color:#333;fill:none;类型转换动态类型转换静态类型转换多态类型转换运行时检查需要基类虚函数转换失败返回nullptr或异常基本类型转换指针类型转换向上转型编译时检查不需要基类虚函数转换失败无保护。

ZY52678的博客 1229

static、接口、多态、内部类

static、接口、多态、内部类】 static ----> 重要 掌握 概述 static的使用 修饰成员变量 修饰成员方法 修饰代码块 静态代码块 接口-----> 干爹 掌握 概述 定义接口 实现接口 类和接口之间的关系—>单实现,多实现,多层实现 接口和接口之间的关系—>单继承,多继承,多层继承 多态-------->重...

Mr_ccy的博客 428

Java面向对象:static关键字、多态

static关键字的本义为"静态的"static关键字可以修饰成员变量、成员函数(以后可以用属性代指成员变量,方法代指成员函数),也可以修饰代码块。用于成员变量可实现共享属性,用于成员函数时可用于共享方法。被static关键字修饰的属性/方法/代码块具有以下"特权"1.直接从属于类,不需要创建对象即可使用2.抢先于构造函数执行3.生命周期是从加载类开始到整个程序结束,中途不会被垃圾回收器回收4.有且只有一份专属内存。...

qq_52130567的博客 295

Java多态的简单理解

Java多态的简单理解

2301_76300308的博客 514

Java- 多态和虚方法调用

多态(polymorphism)多态的概念 多态是指一个程序中相同的名字表示不同的含义的情况。 多态有两种情形: 编译时多态: 重载(overload)多个同名的不同方法 如:p.sayHello(); p.sayHello("wang"); 运行时多态: 覆盖(override)子类对父类方法进行覆盖 动态绑定(dynamic binding)—-也成为虚方法调用(virtual metho

七印miss的博客 3889

java多态理解

1.多态的含义及作用 在面向对象(OOP)的程序设计语言中,多态与封装、继承合称为OOP的三大特性。 封装,说简单点就是合并属性和行为创建一种新的数据类型,而继承就是建立数据类型之间的某种关系(is-a),而多态就是这种关系在实际场景的运用。 简单点说,多态就是把做什么和怎么做分开了;其中,做什么是指调用的哪个方法,我是去吃饭(方法a)还是去睡觉(方法b),怎么做是指实现方案,如果我选择吃饭,...

lxj的博客 216

深入理解 Javastatic 关键字的用法与场景

Java 开发中,static是一个高频使用且非常重要的关键字,无论是日常编码、面试还是源码阅读,都离不开对 static理解。它可以用来修饰类的成员变量、成员方法、代码块以及内部类,核心作用是将类的成员与对象实例解绑,让其属于类本身。本文将从 static 的核心概念、四种使用场景、内存机制、使用注意事项以及面试高频考点,全方位带你吃透 Java static 关键字,新手也能轻松掌握。static 修饰的成员属于类还是对象?答:属于类,不依赖对象。静态方法能不能访问非静态成员?为什么?

2303_79635409的博客 920
上一篇: 基类构建中的一个问题
下一篇: static方法(与隐式static方法)
ForWayfarer
博客等级 码龄20年 60粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值