是方法参数扮演方法覆盖中的任何角色吗?
为什么我们说静态方法在编译时绑定但实际上静态方法在类加载时分配内存? 当我使用javac工具,这意味着我使用编译器和我编译一个java文件,这样一刻静态内存不分配,静态内存分配一个类加载时间 那么为什么说静态方法使用编译时绑定
类加载时间和编译时间一样吗? 我很困惑
我知道这里方法签名是不同的,所以这里没有覆盖,而不是实际发生在这里解释
class A
{
void sh(char x){
System.out.println("value of x : "+x);
}
}
class B extends A
{
public void sh(int x)
{
System.out.println("value of x"+x);
}
}
class C
{
public static void main(String...Aa) /* ??? */
{
A a1=new B();
//a1.show();
a1.sh('a');
a1.sh(10);
}
}
答案 0 :(得分:4)
在类C中声明的实例方法m1覆盖另一个实例方法m2, 如果满足以下所有条件,则在A类中声明:
C是A的子类。
m1的签名是m2签名的子签名(§8.4.2)。
或者:
m2是公共,受保护或声明的,具有默认访问权限 打包为C,或
m1覆盖方法m3(m3与m1不同,m3与m2不同), 这样m3就会覆盖m2。
此外,如果m1不是抽象的,则说m1实现任何和 它覆盖的抽象方法的所有声明。
subsignature
is here的定义。你问
是方法参数扮演方法覆盖中的任何角色吗?
根据以上所述,非常如此。你的签名必须匹配。换句话说
public void sh(int x)
没有覆盖
void sh(char x){
为什么我们说静态方法在编译时绑定但实际上是静态的 方法在类加载时分配内存?
在编译时,对静态或声明的引用类型解析方法调用。换句话说,如果类型没有声明这样的方法,程序将不会编译。对于static
方法。如果方法是static
,则立即解析该方法并将其绑定到调用它的类型。如果它是instance
方法,则绑定将使用多态动态解析(后期绑定)。
这些都与类加载或分配内存无关。
答案 1 :(得分:1)
我不清楚你在问什么。但是,当B
扩展A
时,B
也将继承sh(char x)
方法。 sh(int x)
方法不会覆盖此方法,因为参数类型不同。因此,类B
的对象将具有两个名为sh
的不同方法。
但是,在您的代码中,您声明a1
属于A
类型。即使它(在运行时)会引用类型为B
的对象,但只要编译器知道它仍然是类型A
。因此,您可以应用于此对象的方法是在A
(及其超类中声明的方法,如果它有任何方法,但除了Object
之外没有)。您拥有的唯一方法(Object
方法除外)是sh(char x)
。
所以当你说
时a1.sh('a');
a1.sh(10);
编译器将此视为参数为char
,因为它将查看的唯一方法是采用char
参数的方法。这意味着a1.sh(10)
会将sh
中的A
称为“字符10”作为参数 - 编辑:不,它不会;我试过了,编译器不会让我自动将10转换为char
。