hebanhuayagang
「已注销」
2020-11-20 09:21
采纳率: 100%
浏览 4
已采纳

萌新问几个关于java继承的问题

Item.java
package Item;

public class Item {
    static String  name;
    static String author;
    static int time;
    static int money;
    static boolean ifget;
    
	public Item(String name, String author, int time, int money, boolean ifget) {
		super();
		this.name = name;
		this.author = author;
		this.time = time;
		this.money = money;
		this.ifget = ifget;
	}

   
	public static  void print() {
		// TODO 自动生成的方法存根
		System.out.println(name);
	}
       
       
}


music.java
package Item;

public class music extends Item {

	public music(String name, String author, int time, int money, boolean ifget) {
		super(name, author, time, money, ifget);
		// TODO 自动生成的构造函数存根
	}
	


	public static void main(String[] args) {
		// TODO 自动生成的方法存根
    
	}

}

work.java
package Item;

import java.util.ArrayList;
import java.util.List;

public class work {
     
	 private  ArrayList<Item> listitem = new ArrayList<Item>();
	 
	 public void add(Item item) {
		 listitem.add(item);
	 }
	 
	public void list() {
		for(Item item : listitem) {
			Item.print();
		}
		
	}
	
	
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
    work a = new work();
    a.add(new music("1","1",1,1,true));
    a.add(new music("3","1",1,1,true));
    a.list();
	}
}

最终work运行结果都是3

请问为什么啊?

还有,为什么我的子类music不能定义父类同名函数print(),但把父类print()函数的static去掉就可以,但这样的话work会报错:

不能对类型 Item 中的非静态方法 print()进行静态引用

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • qq_25376897
    qq_25376897 2020-11-20 10:01
    已采纳

    1、为什么work运行结果都是3?因为Item里面的name加了static,变成了类变量(全局、静态变量),就是下面new music了两次,每次改的都是同一个name,所以第二次的3把第一次的1也改成3了,所以两次输出都是3

    2、为什么我的子类music不能定义父类同名函数print()?父类加了static变成静态的,子类再定义同名方法,就会被认为是在重写父类方法(override),子类的方法也必须和父类一样加static静态;同理,父类去掉static,子类也不能加static,就是要不都加,要不都不加。

    这里面涉及了继承,类变量,类方法,实例对象,对象方法等,建议把每个都吃透,不然混在一起不好理解

    点赞 评论
  • hebanhuayagang
    「已注销」 2020-11-20 09:32

    很不理解,我是看浙大翁恺的视频写的

    他在Item写print()函数时不需要加static,而我需要

    点赞 评论
  • qq_19309473
    Roc-xb 2020-11-20 09:34

    用static关键字修饰的方法,其子类不能重写,但可以写同名的方法,在java中一般称static修饰的方法为隐藏方法。

    点赞 评论
  • baidu_15338861
    萧仁武 2020-11-20 09:48

    你的name属性用static修饰,是静态属性,存在于内存方法区,所有对象共用,所以name的值以最后一次赋值为最终结果,在所用对象中共用,你最后一次给name赋值的是3,所以打印出来的都是3

    点赞 评论
  • weixin_39891918
    weixin_39891918 2020-11-20 10:22

    回复错了会怎么样

    点赞 评论
  • hebanhuayagang
    「已注销」 2020-11-20 12:58

    还有个想问的是,如果Item的print函数不加static,work那引用一直报错:不能对类型 Item 中的非静态方法 print()进行静态引用,怎么处理啊

    点赞 评论
  • love_everybody
    love_everybody 2020-11-20 14:22

    Item 的name属性 属于静态属性,是Item所有对象共享的,方法中如果要引用静态变量 ,那么该方法也必须是静态方法。  如果你想把print()方法声明未 非静态方法。那么只需 把name也声明为 非静态属性就可以了

    点赞 评论
  • qq_25376897
    qq_25376897 2020-11-20 14:35

    Item的print函数不加static,那你就要先实例化Item,才能调用,也就是Item item = new Item();

    你的程序之所以去掉Item的print函数不加static,work那引用一直报错,因为work的list方法里面用的类名.方法名。这种是不对的,类名调用的方法不能是对象方法,你应该改成item.print();

    点赞 评论

相关推荐