Java的:家长访问方法子'的静态变量?

我想了解我周围的多态性在Java中的方式。 我创建了一个具有所有儿童都会以同样的方式使用太多的常用方法父类。
每个子类“孩子的所有共享静态信息,这些变量或信息将仅在父声明的方法中。
这个问题希望从父方法访问静态变量似乎不太可能,
它是一种解决方案,宣布每个实例的公共信息,但以后还会有实例,其1000这样浪费内存。
我的意思简单阐述如下代码:

class testParent { static int k; public void print() { System.out.println(k); } } class testChild2 extends testParent { static { testChild2.k =2; } } public class testChild1 extends testParent{ static { testChild1.k = 1; } public static void main(String[] args) { new testChild1().print(); new testChild2().print(); new testChild1().print(); } }

输出我想到的是
1
2
1。
但发生的事情是:
1
2
2
有人可能会认为,每个的启动子类,子类的静态变量被设置,然后将所有涉及到这个子类方法可以访问到相应的'K'值。
然而,究竟什么情况是,所有子类在沿子类共享,从而破坏了我的整个使用静态变量每个子类及其实例,并使用在父访问这些变量commmon方法点相同的静态变量编辑。

任何想法如何才能做到这一点?

--------------解决方案-------------

一种选择是通过一个抽象的(非静态)方法来访问子类“静态数据:

abstract public class Parent {
protected abstract int getK();

public void print() {
System.out.println(getK());
}
}

public class Child1 extends Parent {
private static final int CHILD1_K = 1;

protected int getK() { return CHILD1_K; }
}

public class Child2 extends Parent {
private static final int CHILD2_K = 2;

protected int getK() { return CHILD2_K; }
}

当你做出新的testChild2()的print()。 在testChield2静态块被执行和值更改为2。

静态块仅在由ClassLoader的加载执行一次。

这一次给你想要的输出:

class testParent {
static int k;
public void print()
{
System.out.println(k);
}
}

class testChild2 extends testParent
{

{
testChild2.k =2;
}
}

public class testChild1 extends testParent{
{
testChild1.k = 1;
}

public static void main(String[] args)
{

new testChild1().print();
new testChild2().print();

new testChild1().print();
}
}

非静态代码块每次执行类实例化。

过早的优化是一切罪恶的根源。 我不认为你会与成千上万的实例,每个都有自己的数据时遇到任何内存问题,除非你是某种形式的小型嵌入式系统上工作。 静态变量不打算做你想与他们做什么。

静态变量是特定于类本身。 如果你想在一个类的不同实例相同的领域有不同的值,则该字段不能是静态的。

解决办法: 不要让k静态的。

class testParent {
int k;
public void print()
{
System.out.println(k);
}
}

class testChild2 extends testParent
{
{
this.k =2;
}
}

class testChild1 extends testParent{
{
this.k = 1;
}

public static void main(String[] args){
new testChild1().print();
new testChild2().print();
new testChild1().print();
}
}

演示
(忽略static class业务-这只是使它在ideone工作)。

分类:java的 时间:2015-03-16 人气:9
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.554 (s). 10 q(s)