首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象类变量与继承

抽象类变量与继承
EN

Stack Overflow用户
提问于 2015-07-19 10:24:32
回答 2查看 2.8K关注 0票数 0

抽象类有一个变量和一个方法,类对抽象类的扩展如下:

代码语言:javascript
复制
abstract class shape
{
    int area;
    void printArea(){System.out.println("Area = "+area);}    
}

class circle extends shape
{
    int r;
    circle(int a){r = a;}      
    area=r*r;//line 22
}

public class Abstraction{
    public static void main(String[] args) {            
        circle c=new circle(10);
        c.printArea();
    }

}

第22行给出了一个编译error.But,如果这一行被移到它编译的类的构造函数中

代码语言:javascript
复制
class circle extends shape
{
    int r;
    circle(int a){r = a;area=r*r;}          
}

这种行为是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-19 10:30:53

代码语言:javascript
复制
area=r*r;//line 22

不是在函数中,而是在类的主体中。

你不能在身体里有这样的陈述。您可以将其封装在静态块中,也可以将其移动到方法中。但是,由于area是一个实例变量,所以您也不能在静态块中使用它。

当您移动一个方法时,它编译得很好,因为它属于它的位置。

仔细看看java类的结构

票数 3
EN

Stack Overflow用户

发布于 2015-07-19 10:47:02

您不能在java类主体中调用任何类型的表达式。只有参与赋值的表达式才能直接在java类主体中获得。

但如果你真的想那样做,你可以做以下几件事。

代码语言:javascript
复制
class circle extends shape
{
    int r;
    circle(int a){r = a;}
    {
        area=r*r;//line 22
    }
}

但是,由于Java对象创建生命周期的存在,这段代码不会像您预期的那样工作。

会发生的是。

  1. 面积= 0// int的默认值
  2. R=0
  3. area=r*r // area = 0*
  4. 构造函数体被调用
  5. r=a

所以最后

代码语言:javascript
复制
r = a;
area = 0;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31500198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档