是"延伸"还扩展变量?

时间:2014-06-20 16:37:02

标签: java drawing hierarchy extends

我想当你从另一个对象扩展一个对象时,该对象然后接收所有变量以及那些变量的定义以及那个对象方法。所以当我有这样的代码时

import javax.swing.*;
import java.awt.*;

public abstract class Object extends JComponent{
    private int xpos;
    private int ypos;
    private int height;
    private int width;
    private double rotate;
    private Rectangle rect;

    public Object(int p1, int p2, int w, int h, double r){
        this.xpos = p1;
        this.ypos = p2;
        this.width = w;
        this.height = h;
        this.rotate = r;
        rect = new Rectangle(xpos, ypos, width, height);
    }
}

作为原始对象,然后是另一个像这样的对象:

import javax.swing.*;
import java.awt.*;

public class Block extends Object{

    public Block(int p1, int p2, int p3, int p4, double r) {
        super(p1, p2, p3, p4, r);

    }

    public void paintComponent(Graphics g){
        Graphics2D gd = (Graphics2D) g;
        gd.setColor(Color.BLUE);
        gd.draw(rect);
    }

}

为什么不是矩形" rect"被延长?我是java的新手,还在学习,所以请轻松上XD

6 个答案:

答案 0 :(得分:3)

rectObject中被标记为私有。因此,只有Object类的实例才能看到它。即使是子类也无法在实现中看到它。你可以做两件事:

1)在Object中为它创建一个getter方法。此方法是公开的,因此任何其他类(包括您的Block类)都可以看到它。

public Rectangle getMyRect() {
    return rect;
}

2)或将其标记为受保护或默认(无访问修饰符)。

protected Rectangle rect;  // this way...
Rectangle rect;  // ... or this way

P.S。不要命名类Object。如果类在不同的包中定义,它将起作用,但类Object具有特殊含义 - 所有类的最顶级父类 - 并且会使人感到困惑。

答案 1 :(得分:0)

扩展类时,可以访问公共和受保护的方法和变量。现在,rect是一个私有变量。要使其对扩展对象免费,只需使其受保护或提供允许访问的getRect()方法。

答案 2 :(得分:0)

它实际上已扩展但无法访问,因为您的变量rect被定义为私有。要在子类中访问,rect应该受保护

或者你也可以为rect创建getter和setter方法。

答案 3 :(得分:0)

详细了解访问说明符。私有成员变量只能在类中访问。因此,即使你有一个扩展Rect的类,它仍然只在Object中可见。也不要使用类名'Object'。它是所有其他类扩展的超类

答案 4 :(得分:0)

扩展和访问是两回事......

在您的情况下,无法访问超类私有变量。您可以扩展超类的功能,但访问方法和变量取决于超类访问修饰符。

答案 5 :(得分:-1)

变量" rect"不会被延长。 "延伸"意味着您将该类作为父类。所以块类将继承父类包含的所有功能。所以块将获得所有方法,您也可以覆盖方法。因为rect是一个私有变量,除非你公开,否则块类不会看到它。 Extends基本上允许类继承父类的属性,方法和属性,但不继承私有变量。希望有所帮助。