关于Java程序报错如何改哇

img


这里显示方法没有使用的问题,就是不知道怎么改以及如何使用方法

没有声明,这个方法出处在哪,引入即可

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7433326
  • 这篇博客你也可以参考下:编写Java程序_定义两个方法,实现奇数偶数的判断,并计算和(有参数有返回值方法)
  • 同时,你还可以查看手册:java-学习Java语言 - 描述Java编程语言的基本概念和特点的课程。-类和对象》描述了如何编写创建对象的类,以及如何创建和使用对象。-课堂 中的内容
  • 除此之外, 这篇博客: 【Java】为什么会产生抽象类,抽象类的定义,方法及使用原则中的 抽象类的使用限制或者使用原则 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • (抽象类一定不能new)

    • a.所有抽象类必须有子类(final与abstract不能同时出现)
      原因:abstract一定有子类,而final一定没有子类(不能继承)。 (final可以修饰类)

    因为由子类的抽象方法的具体实现来完成。
    例子:

    //具体定义
    abstract class Person{
        private String name;
        private int age;
        public void setName(String name){
            this.name = name;
        }
        //只声明而为实现的方法(不能直接使用,只能由子类的抽象方法来实现完成)
        public abstract void getPerson();
    }
    public class Test{
        public static void main(String[] args) {
    
        }
    }
    
    • b.抽象类的子类必须覆写所有抽象方法(或者子类也使用abstract关键字定义)
    定义抽象类的目的就是想让类继承,实现覆写
    
    private与abstract不能同时出现,抽象方法必须被覆写而private方法无法被覆写
    
    • c.抽象类方法无法直接产生实例化对象,但可以通过子类向上转型进行实例化。

    (解释:抽象类是“半成品”,不能直接new 自己;由于存在向上转型,如果子类是一个普通类,可以把他变为抽象类进行使用)
    且子类依然遵循对象实例化流程,先调用抽象类构造方法而后再调用子类构造。
    (解释:先调用父类构造,产生父类对象,才有子类对象)
    (抽象类是普通类的超级,普通类有构造方法,那抽象类一定有构造方法)

    - d.抽象类可以没有抽象方法,但是此时任然不能直接实例化对象。
    例子:

    //具体定义
    abstract class Person{
        private String name;
        private int age;
        public void setName(String name){
            this.name = name;
        }
        //只声明而为实现的方法(不能直接使用)
        public abstract void getPersonInfo();
    }
    class Student extends Person{
        public void getPersonInfo(){
            System.out.println("111");
        }
    }
    public class Test{
        public static void main(String[] args) {
            //通过向上转型,把Student对象指向了一个父类的引用
            Person per = new Student();
            //这时调用per.getPersonInfo();执行输出
            per.getPersonInfo();
        }
    }
    

    笔试题:

    //请问输出是多少?
    A.0
    B.30
    C.100
    D.编译错误
    
    abstract class Person {
        public Person() {
            this.print();
        }
        public abstract void print();
    }    
    class Student extends Person{
        private int num = 100;
        public Student(int num){
            this.num = num;
        }
        public void print(){
            System.out.println(num);
        }
    }
    public class Test{
        public static void main(String[] args) {
            new Student(30);
        }
    }
    

    输出:A.0

    解释:
    一:**从入口开始看**,
    第一步调用子类Student这个类的构造方法,将30传值,但是
    在**子类构造中有一个隐藏的super();(因为继承关系)**,所以先调用
    父类构造方法再到子类。故当调用子类这个有参构造时连方法都进不去。
    二:所以先在父类(**本质上第一步从父类开始**),Person的无参构造
    调用了print方法(this表示本类对象),this在父类中,且用abstract关键字修饰,
    所以此时print方法调用不了。
    三:故去寻找子类中有无print方法,至子类中的print方法中,
    子类的print方法覆写了父类,故从子类的覆写后的方法进行输出,
    此时的num还未进行this.num = num;这一行的赋值。
    四:实际上private int num = 100;这一行在编译的时候在构造方法中执行,
    但是在主方法中有new,所以开辟了一块新空间,所有属性都有默认值,故输出结果为0;
    

    扩展:

    扩展:
    public class Test{
        public static void main(String[] args) {
            new Student(30).print();
        }
    }
    

    输出0,30

    此时Student这个构造方法已经全部执行完成,最后才调用print方法,
    print方法是通过子类Student类new调用,print方法被覆写,
    所以调用的一定是被覆写后的方法。(先等于100,在等于30),
    故输出30.
    

    例子:

    abstract class Person{
        public abstract void print();
        //在抽象类内部提供了一个实现好的子类,
        //(静态方法可通过类名称直接调用)
        public static Person getInstance(){
            //方法内部类,继承了抽象类并实现,
            //方法返回了实现好的子类
            class Student extends Person{
                public void print(){}
            }
            return new Student();
        }
    }
    
    public class Test{
        public static void main(String[] args) {
            Person per = new Student();
            per.print();
        }
    }
    
    • 匿名内部类:等同于方法内部类,就是没有名字,但是匿名内部类必须继承一个抽象类或者实现一个接口,除此之外与方法内部类完全一致

    例子:

    abstract class Person{
        public abstract void print();
        //在抽象类内部提供了一个实现好的子类(静态方法可通过类名称直接调用)
        public static Person getInstance(){
            //匿名内部类,隐藏了没有名字的类
            //等同于class 无名 extends Person{}
            //直接实例化:new Person();
            return new Person(){
                //内部类
                public void print(){}
            }
        }
    }
    

    .

  • 您还可以看一下 赵庆元老师的全栈工程师手把手带你学Java语言课程中的 方法嵌套调用内存图小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    该问题的报错提示是有未使用的方法,需要你给出的解决方案是修复未使用方法的问题以及如何使用该方法。具体的解决方案如下:

    1. 找到未使用的方法 name() 的位置,可能需要打开报错的文件查找该方法。
    2. 如果你确定这个方法确实没有被使用,可以直接删除该方法。
    3. 如果你想使用这个方法,请确定需要调用该方法的位置并进行相应的修改,让程序可以正常使用该方法。

    例如,假设你找到的未使用的方法名为 testMethod(),并且你在代码中需要使用该方法来输出一段文字。你可以按照以下步骤进行解决:

    1. 打开报错提示的文件,并找到该方法所在的位置,如果需要可以用编辑器搜索该方法的名字。
    2. 判断该方法是否需要被删除或者使用。
    3. 如果需要被删除,可以直接在该文件中删除该方法的代码。
    4. 如果需要使用该方法,需要在你的代码中找到需要使用该方法的位置。
    5. 在该位置上新增一行代码,调用该方法。例如,可以使用 System.out.println("测试用的输出") 实现调用。
    6. 重新编译程序并运行,检查输出是否正确。

    如果你的程序中有多个未使用的方法,需要针对每个方法进行相应的修改。

    注意,该报错可能是因为你的代码中调用了未实现的方法,这种情况需要你进行相应的实现。另外,也可能是因为你没有正确地编写方法的调用语句,需要检查一遍方法的调用是否正确。如果你发现无法修复问题,可以考虑寻求程序员的帮助。