A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 邵阳 中级黑马   /  2012-6-28 17:59  /  2267 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. <P>abstract class YuanGong
  2. {
  3.   private String name;
  4.   private String   gonghao;
  5.   private int  gongzi;
  6. void  YuanGong(String name,String gonghao,int gongzi)
  7. {
  8.   this.name=name;
  9.   this.gonghao=gonghao;
  10.   this.gongzi=gongzi;</P>
  11. <P> }
  12. public abstract  void show();



  13. }
  14. class JingLi extends YuanGong
  15. {
  16. private int jiangjin;
  17. void jingli(String name,String gonghao,int gongzi,int jiangjin )
  18. {
  19.   super (name,gonghao,gongzi);
  20.   this.jiangjin=jiangjin;
  21.   
  22. }
  23. public void show()
  24. {
  25.   System.out.println(name+","+gonghao+","+gongzi+","+jiangjin);
  26.   
  27. }
  28. </P>
  29. <P>}
  30. class Test
  31. {
  32. public static void main(String[] args)
  33. {
  34.   //JingLi j=new JingLi();
  35.   //j.name="邵阳";
  36.   //j.show();
  37.   JingLi j=new JingLi();
  38.   j.jingli("shaoyang","21",900,500);
  39.   j.show();

  40. }
  41. }</P>
复制代码
输出结果是:
chouxiang.java:24: 错误: 对super的调用必须是构造器中的第一个语句
                super (name,gonghao,gongzi);
                      ^
chouxiang.java:30: 错误: name可以在YuanGong中访问private
                System.out.println(name+","+gonghao+","+gongzi+","+jiangjin);
                                   ^
chouxiang.java:30: 错误: gonghao可以在YuanGong中访问private
                System.out.println(name+","+gonghao+","+gongzi+","+jiangjin);
                                            ^
chouxiang.java:30: 错误: gongzi可以在YuanGong中访问private
                System.out.println(name+","+gonghao+","+gongzi+","+jiangjin);
                                                        ^
4 个错误

第一个问题是我将变量私有,但是我没有直接从类中引用啊,为什么还出现无法访问私有。
第二个问题是我已经将super语句放在第一句啦,怎么还出现没放第一句啊。

希望给我详解答案,最好将过程一步步下下来。小弟0基础,引申一下别的更好,多学点

8 个回复

倒序浏览
void jingli(String name, String gonghao, int gongzi, int jiangjin)

        {

                super(name, gonghao, gongzi);

                this.jiangjin = jiangjin;

        }

你这是一个方法,不是构造函数,因为方法名和类名不同,既然不是构造函数,肯定不能调用父类的构造函数,
所以不能有super(name, gonghao, gongzi);

我看你是想写构造函数,只要把方法上的void去掉就行了,构造函数不能写返回类型的。
还有这句话System.out.println(name + "," + gonghao + "," + gongzi + "," + jiangjin);这几个成员变量在父类中都是private,子类不能访问。所以报错。

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
抽象类不能创建实例对象,抽象类中定义的抽象方法必须在具体的子类中实现,所以,不能有抽象构造方法或抽象静态方法。
回复 使用道具 举报
子类继承时只能继承父类非private类型的属性,我就知道这些了。
回复 使用道具 举报
package com.heima.changjiajie;

public class Test11 {
        public static void main(String[] args) {
                // JingLi j=new JingLi();
                // j.name="邵阳";
                // j.show();
                JingLi j = new JingLi();
                j.jingli("shaoyang", "21", 900, 500);//这儿你应该写成这样JingLi j = new JingLi("shaoyang", "21", 900, 500);
                                                    //在实例化时调用构造方法的时候(如果构造方法里有形参)就应该传入实参..

                j.show();

        }
}

abstract class YuanGong {
        private String name;
        private String gonghao;
        private int gongzi;
    //这儿你应该写个javaBean方便外部类对属性值的操作..
        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public String getGonghao() {
                return gonghao;
        }

        public void setGonghao(String gonghao) {
                this.gonghao = gonghao;
        }

        public int getGongzi() {
                return gongzi;
        }

        public void setGongzi(int gongzi) {
                this.gongzi = gongzi;
        }

        public YuanGong(String name, String gonghao, int gongzi) {
                this.name = name;
                this.gonghao = gonghao;
                this.gongzi = gongzi;
        }

        public abstract void show();
}
class JingLi extends YuanGong {
        private int jiangjin;
        JingLi(String name, String gonghao, int gongzi, int jiangjin) {//你这J,L写成小写了...
                super(name, gonghao, gongzi);
                this.jiangjin = jiangjin;
        }
        public void show() {
                System.out.println("name="+getName() + "," + "gonghao=" +getGonghao()+ "," + "gongzi=" +getGongzi()+ "," + "jiangjin="+jiangjin);
        }//这儿分别调用getName(),getGonghao(),getGongzi()方法来获取属性的值..
}

哥们你一定要注意 写代码时最可能的原因就是写错单词,或大小写问题,请多检查代码...

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
你错的地方不只一处,我下边都用红色给你标出了
abstract class YuanGong
{
  private String name;
  private String   gonghao;
  private int  gongzi;
void  YuanGong(String name,String gonghao,int gongzi)   这个就不是构造函数的格式  public YuanGong (String name,String gonghao,int gongzi) 构造函数没有返回值也就是不能使用void
{
  this.name=name;
  this.gonghao=gonghao;
  this.gongzi=gongzi;
}
public abstract  void show();

}
class JingLi extends YuanGong
{
private int jiangjin;
void jingli(String name,String gonghao,int gongzi,int jiangjin ) //这个地方不仅格式不正确而且jingli构造方法名必须和类名保持一致public JingLi (String name,String gonghao,int gongzi,int jiangjin )如果说你这里不是构造方法,那么  super (name,gonghao,gongzi); 调用父类的构造方法你是没有办法在这里使用的,因为这句话只能放在子类的构造方法中
{
  super (name,gonghao,gongzi);
  this.jiangjin=jiangjin;
  
}
public void show()
{
  System.out.println(name+","+gonghao+","+gongzi+","+jiangjin);  这个地方,除了jiangjin属性意外剩下的都是父类的属性而且还都是private 修饰的,你没有提供相应返回方法,这边是不能直接用的
  
}
</P>
<P>}
class Test
{
public static void main(String[] args)
{
  //JingLi j=new JingLi();
  //j.name="邵阳";
  //j.show();
  JingLi j=new JingLi();
  j.jingli("shaoyang","21",900,500);
  j.show();
}
}
上边写的你还明白么?不明白的随时找我!

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
邵阳 中级黑马 2012-6-28 19:50:58
7#
游洪波 发表于 2012-6-28 18:43
你错的地方不只一处,我下边都用红色给你标出了
abstract class YuanGong
{

改过之后如下
abstract class YuanGong
{
         String name;
         String   gonghao;
         int  gongzi;
          YuanGong(String name,String gonghao,int gongzi)
        {
                this.name=name;
                this.gonghao=gonghao;
                this.gongzi=gongzi;

        }       
        public abstract  void show();
       
       
       
}
class JingLi extends YuanGong
{
        private int jiangjin;
         JingLi(String name,String gonghao,int gongzi,int jiangjin )
        {
                super (name,gonghao,gongzi);
                this.jiangjin=jiangjin;
               
        }
        public  void show()
        {
                System.out.println(name+","+gonghao+","+gongzi+","+jiangjin);
               
        }
       

}
class Test
{
        public static void main(String[] args)
        {
                //JingLi j=new JingLi();
                //j.name="邵阳";
                //j.show();
                JingLi j=new JingLi();
                j.JingLi("shaoyang","21",900,500);
                j.show();
       
        }
}



这里输出结果是chouxiang.java:43: 错误: 无法将类 JingLi中的构造器 JingLi应用到给定类型;
                JingLi j=new JingLi();
                         ^
  需要: String,String,int,int
  找到: 没有参数
  原因: 实际参数列表和形式参数列表长度不同
chouxiang.java:44: 错误: 找不到符号
                j.JingLi("shaoyang","21",900,500);
                 ^
  符号:   方法 JingLi(String,String,int,int)
  位置: 类型为JingLi的变量 j
2 个错误


什么原因
回复 使用道具 举报
邵阳 发表于 2012-6-28 19:50
改过之后如下
abstract class YuanGong
{

因为 JingLi j=new JingLi(); 是调用无参构造函数为对象开辟内存空间,而你的程序中没有无参构造函数,解决的方法要么是你写一个无参构造函数,  要么将
  JingLi j=new JingLi();
                j.JingLi("shaoyang","21",900,500);
改为
  JingLi j=new JingLi("shaoyang","21",900,500);
这样调用有参构造函数创建对象,程序就对了

评分

参与人数 1技术分 +1 收起 理由
刘蕴学 + 1

查看全部评分

回复 使用道具 举报
邵阳 中级黑马 2012-6-28 20:17:01
9#
李文龙 发表于 2012-6-28 19:53
因为 JingLi j=new JingLi(); 是调用无参构造函数为对象开辟内存空间,而你的程序中没有无参构造函数,解 ...

你是高手,佩服
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马