Java基础之子类会不会继承父类的static变量和static方法

1 相关问题

(1)应用父类静态字段会不会初始化子类?
(2)父类的静态方法能不能被子类重写?
(3)父类的静态变量被继承后,子类修改静态变量,为什么父类的也跟着变了?

2 解决思路-不能

2.1 概念

(1)覆盖,又称重写(Override)。发生在子类与父类之间。

子类是可以继承父类的某些方法的,当父类的方法对子类不适用时,需要在子类中写一个和父类一样的方法(当然方法内的程序块是不一样的),此处**“一样”指方法名必须一样、返回值类型互相兼容、参数个数顺序类型必须一致等等**。此时如果子类要用这一方法,就会直接调用覆盖过的方法,而当没有检测到重写时,才会调用从父类继承下来的方法。举例子:因为不同动物的叫声和食物都不同,所以要将父类中的方法覆盖掉。
在这里插入图片描述

(2)重载(Overload)。一般发生在同一类的不同方法间。

重载要求两个方法方法名一样,参数列表不一样(类型、顺序、个数等)。这样两个方法间互为不同的方法,调用哪一个时由参数决定。

注意:重载与返回参数无关

class A {
	void a(int i, float j) { }
	void a(float i, int j) { }  // 两个方法接收的参数类型顺序不同,所以是两个不同的方法
}
class B {
	void b(int i) { }
	void b() { } // 参数个数不同,第二个方法无参数
}
class C {
	void c(int i) { }
	void c(float i) { } // 参数类型不同
}

java父子类之间是否存在重载的现象?

(3)静态方法:java中,static修饰符修饰的方法就是静态方法。所谓静态就是指:在编译之后所分配的内存会一直存在(不会被回收),直到程序退出内存才会释放这个空间。static类型的变量是归类所有,不是类的实例所有,一般用类名引用

2.2 原因

因为静态方法从程序开始运行后就已经分配了内存,也就是说已经写死了。所有引用到该方法的对象(父类的对象也好子类的对象也好)所指向的都是同一块内存中的数据,也就是该静态方法。子类中如果定义了相同名称的静态方法,并不会重写,而应该是在内存中又分配了一块给子类的静态方法,没有重写这一说,我们应该称之为隐藏。

3 演示

(1)代码

class Base {
	public static int countBase = 111;
	public static int count = 0;
}

class ClassOne extends Base {
	public static int count = 1;
}

public class Test {
	public static void main(String args[]) {
		System.out.println("父类引用父类countBase值:" +Base.countBase);
		System.out.println("子类引用父类的countBase值:" +ClassOne.countBase + "\n");
		
		System.out.println("父类原来的count值:" +Base.count);
		System.out.println("子类原来的count值:" + ClassOne.count);
		ClassOne.count++;
		System.out.println("父类加1后的count值:" + Base.count);
		System.out.println("子类加1后的count值:" + ClassOne.count);
	}
}

(2)结果

这里写图片描述

Java中,子类可以通过以下两种方式调用父类的get和set方法: 1. 使用super关键字:子类可以使用super关键字来调用父类方法。通过super,子类可以访问父类的成员变量方法。例如,如果父类中有一个名为"getName"的方法子类可以使用super.getName()来调用该方法。 2. 继承父类方法子类可以继承父类方法,包括get和set方法继承后,子类可以直接调用这些方法,就像调用自己的方法一样。例如,如果父类中有一个名为"getName"的方法子类可以直接使用getName()来调用该方法。 下面是一个简单的示例代码,演示了子类如何调用父类的get和set方法: ```java // 父类 class Parent { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } // 子类 class Child extends Parent { private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } } // 测试 public class Main { public static void main(String[] args) { Child child = new Child(); child.setName("John"); // 调用父类的setName方法 child.setAge(20); // 调用子类自己的setAge方法 System.out.println(child.getName()); // 调用父类的getName方法 System.out.println(child.getAge()); // 调用子类自己的getAge方法 } } ``` 在上面的示例中,子类Child继承父类Parent的getName和setName方法,可以直接调用这些方法。同时,子类Child还定义了自己的getAge和setAge方法。在测试代码中,我们创建了Child对象child,并分别调用了父类的getName方法子类的getAge方法以及父类的setName和子类的setAge方法
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值