子类能改变父类的属性值么

ic_yong 2015-10-16 04:08:54
我想说的改变是:在new另一个对象的时候,新对象直接调用父类属性的值就是改变后的值(彻底的改变)
...全文
2957 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
恍惚丶旧时光 2018-09-06
  • 打赏
  • 举报
回复
//可以在子类方法中对父类属性进行修改

public class IfIsFather {

public static void main(String[] args) {
Base b1 = new Base();
System.out.println(b1.get());// 确认父类static
Sub s1 = new Sub("S");// 创建了第一个子类对象,并试图把父类中static改成了S
System.out.println(s1.get());// 查看父类对象static,发现果然改成了S
Sub s2 = new Sub();// 创建第二个子类对象
System.out.println(s2.get());// 再次查看父类对象static,发现并没有改变,证明这种办法是可以选择改或不改父类static的
Sub s3 = new Sub("A");// 创建第三个子类对象,再次试图改变父类static
System.out.println(s2.get());// 再次查看父类对象static,发现改变成了A
Base b2 = new Base();
System.out.println(b2.get());// 可怕!再创建第二个父类对象时,已经和第一个父类对象不一样了
}
}

// 父类
class Base {

private static String str = "0";

public void setStr(String str) {
Base.str = str;
}

// 此方法用来返回父类的static
public static String get() {
return str;
}
}

// 子类
class Sub extends Base {

public Sub(String s) {
super.setStr(s);
}

public Sub() {
super();
}

}
恍惚丶旧时光 2018-09-06
  • 打赏
  • 举报
回复
//可以在子类方法中对父类属性进行修改

public class IfIsFather {

public static void main(String[] args) {
Base b1 = new Base();
System.out.println(b1.get());// 确认父类static
Sub s1 = new Sub("S");// 创建了第一个子类对象,并试图把父类中static改成了S
System.out.println(s1.get());// 查看父类对象static,发现果然改成了S
Sub s2 = new Sub();// 创建第二个子类对象
System.out.println(s2.get());// 再次查看父类对象static,发现并没有改变,证明这种办法是可以选择改或不改父类static的
Sub s3 = new Sub("A");// 创建第三个子类对象,再次试图改变父类static
System.out.println(s2.get());// 再次查看父类对象static,发现改变成了A
Base b2 = new Base();
System.out.println(b2.get());// 可怕!再创建第二个父类对象时,已经和第一个父类对象不一样了
}
}

// 父类
class Base {

private static String str = "0";

public void setStr(String str) {
Base.str = str;
}

// 此方法用来返回父类的static
public static String get() {
return str;
}
}

// 子类
class Sub extends Base {

public Sub(String s) {
super.setStr(s);
}

public Sub() {
super();
}

}
恍惚丶旧时光 2018-09-06
  • 打赏
  • 举报
回复
如果父类中的static属性,可以在子类的构造方法中直接改掉呢,而static属性是在创建子类对象时必然存在的,那下一次再创建新的子类对象,用的就不是创建第一个子类对象时的父类模板了吧。刚开始学java,也刚开始用csdn,咋发代码
Usher丶AckMan 2015-10-20
  • 打赏
  • 举报
回复
引用 8 楼 xiesq5112 的回复:
[quote=引用 6 楼 KcCoO 的回复:] 你可以用2个子类一起继承一个父类,然后用子类1调用父类的属性,改变值,再用子类2调用看值改变了没有,明显答案是没有。。不可能彻底改变父类的值,如果能改变那程序都乱跑了。。 子类不能彻底改变父类的值,只能调用父类的属性重新赋值罢了。。
对的 你这才是楼主想要知道的答案 在子对象本身,根据父类的访问修饰符来判断是否可以操作父类属性的值,改变的值也只是改对象本身的作用, 不会影响其他创建的子对象,其他子对象所引用的父类还是最原始的那个父类模板! [/quote] 需要看父类属性的访问修饰,如果private,就不可以调用,
ic_yong 2015-10-20
  • 打赏
  • 举报
回复
.。。。。。。。。。。给分给错了
朗晴 2015-10-19
  • 打赏
  • 举报
回复
2楼已经说得很清楚。
Usher丶AckMan 2015-10-19
  • 打赏
  • 举报
回复
你可以用2个子类一起继承一个父类,然后用子类1调用父类的属性,改变值,再用子类2调用看值改变了没有,明显答案是没有。。不可能彻底改变父类的值,如果能改变那程序都乱跑了。。 子类不能彻底改变父类的值,只能调用父类的属性重新赋值罢了。。
LOVEv海盗 2015-10-19
  • 打赏
  • 举报
回复
你是说 : 你现在只能编辑子类A的内部代码,但是希望彻底改变其父类的某个成员变量的默认值吧,也就是希望达到的效果是: 以后随便new一个该父类的子类对象实例,实例对象的该成员变量默认值就是改变之后的值,而不需要重新赋值吧。 这样的效果,我只能想到的实现方式:你让父类的其他子类(除了子类A)作为父类的孙子类(继承子类A)。 难道你学过javascript,想问JAVA 里有没有原型链?
心随自在飞 2015-10-19
  • 打赏
  • 举报
回复
引用 6 楼 KcCoO 的回复:
你可以用2个子类一起继承一个父类,然后用子类1调用父类的属性,改变值,再用子类2调用看值改变了没有,明显答案是没有。。不可能彻底改变父类的值,如果能改变那程序都乱跑了。。 子类不能彻底改变父类的值,只能调用父类的属性重新赋值罢了。。
对的 你这才是楼主想要知道的答案 在子对象本身,根据父类的访问修饰符来判断是否可以操作父类属性的值,改变的值也只是改对象本身的作用, 不会影响其他创建的子对象,其他子对象所引用的父类还是最原始的那个父类模板!
飏飏一蝶 2015-10-17
  • 打赏
  • 举报
回复
没看懂....
ic_yong 2015-10-17
  • 打赏
  • 举报
回复
你们都不明白我要问什么
SerenoShen 2015-10-16
  • 打赏
  • 举报
回复
楼主需要看情况实现哈! 你在new一个子类对象的时候,需要先调用父类的相关构造器,对父类中的字段进行初始化操作! 如果父类中的字段的权限修饰符声明为private的,那么子类将不能获知父类中该字段的任何信息(就如同不存在一样)。别的权限声明情境下,如果子类定义了一个和父类同名的字段,那么子类实例每次获取的都将是子类中声明的同名字段,如果想要调用父类中的同名字段,需要使用super关键字进行调用。当然如果子类和父类中同名字段存储的值不一样,那么取得的值自然也是不同的(具备不同的内存区间)。这个时候能够达到楼主想要的需求!!如果子类中没有与父类同名的字段,那么子类将通过继承获得父类的该字段,对子类的该字段的操作当然也会被保存起来的!!
  • 打赏
  • 举报
回复
子类继承了父类的所有属性,属性的访问权限决定了在哪里能够直接调用
class A{
	private int i;
	protected int j;
	public int k;
	int m;
}

class B extends A{
	public static void main(String[] args) {
		B b = new B();
		b.j = 1;
		b.k = 2;
		b.m = 3;
	}
}

23,405

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧