Java基础之多态中的成员变量,成员函数和静态函数

本文深入探讨了多态在编程中的应用,重点分析了成员变量、成员函数和静态函数在编译与运行时的不同表现,揭示了多态性的核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



/*
多态时,
成员的特点:
1,成员变量。
	编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
	运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
	简单说:编译和运行都参考等号的左边。哦了。
	作为了解。



2,成员函数(非静态)。
	编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
	运行时:参考的是对象所属的类中是否有调用的函数。
	简单说:编译看左边,运行看右边。

	因为成员函数存在覆盖特性。




3,静态函数。
		编译时:参考引用型变量所属的类中的是否有调用的静态方法。
		运行时:参考引用型变量所属的类中的是否有调用的静态方法。
		简单说,编译和运行都看左边。

		其实对于静态方法,是不需要对象的。直接用类名调用即可。


		

*/

class Fu
{
//	int num = 3;
	void show()
	{
		System.out.println("fu show");
	}

	static void method()
	{
		System.out.println("fu static method");
	}
}

class Zi extends Fu
{
//	int num = 4;
	void show()
	{
		System.out.println("zi show");
	}

	static void method()
	{
		System.out.println("zi static method");
	}
}



class  DuoTaiDemo3
{
	public static void main(String[] args) 
	{
		Fu.method();
		Zi.method();
		Fu f = new Zi();//
//		f.method();
//		f.show();
//		System.out.println(f.num);


//		Zi z = new Zi();
//		System.out.println(z.num);
	}
}

在这里插入图片描述

### C++ 静态成员变量静态成员函数在继承与多态中的行为 #### 静态成员变量的行为 静态成员变量属于整个类而非某个特定的对象实例。这意味着无论创建多少个该类的对象,静态成员变量只有一份副本存在于内存中。当涉及到继承时,派生类并会获得自己独立的一份父类的静态成员变量;相反,它们共享同一份。 如果希望派生类拥有自己的版本而是覆盖基类的数据,则需要重新声明并定义一个新的静态成员变量于派生类内[^1]: ```cpp class Base { protected: static int sharedData; }; int Base::sharedData = 0; class Derived : public Base { private: static int derivedSharedData; // 新的静态成员变量 }; int Derived::derivedSharedData = 1; ``` 需要注意的是,在这种情况下虽然`Base``Derived`都有各自的静态数据成员,但是这并构成真正的重载或隐藏关系——两个同的名称代表完全分离的存在实体。 #### 静态成员函数的行为 对于静态成员函数而言,其主要特点是无法访问非静态成员(因为没有隐式的this指针),因此也能直接操作对象的状态。然而,静态成员函数是可以被继承下来的,并且可以通过作用域解析运算符来区分同层次上的实现[^2]。 关于多态方面,由于静态成员函数具备关联到具体对象的能力,也就存在所谓的运行时期间决定调用哪一个版本的情况。也就是说,即使存在相同签名的静态成员函数分别位于基类派生类之中,也会发生类似于虚拟机制下的动态绑定现象。取而代之的是编译器会在编译阶段就确定好要执行的具体函数地址[^3]。 下面给出一段简单的代码示例展示这一点: ```cpp #include <iostream> using namespace std; class Animal { public: static void makeSound() { cout << "Animal sound" << endl; } }; class Dog : public Animal { public: static void makeSound() { cout << "Dog barks" << endl; } }; void callMakeSound(Animal* animal) { animal->makeSound(); // 编译错误:尝试通过对象指针调用静态成员函数 } int main(){ Animal a; Dog d; Animal::makeSound(); Dog::makeSound(); return 0; } ``` 上述例子试图经由指向基类型的指针去间接调用静态成员函数将会引发编译期错误,这是因为静态成员函数本质上属于任何具体的对象实例,故应如此使用。 #### 注意事项 - **可作为虚函数**:正如之前提到过的那样,静态成员函数能成为虚函数的一部分参与多态性处理。 - **初始化顺序依赖问题**:全局/命名空间级别的静态对象之间可能存在复杂的相互依存关系,尤其是在跨文件的情况下容易引起难以调试的问题。建议尽可能减少对外部链接符号的依赖程度以降低风险。 - **线程安全考虑**:考虑到并发环境下多个线程可能同时修改同一个静态资源的情形,应当采取适当措施保障同步控制,比如利用互斥锁等手段保护临界区内的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

playboy-jordan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值