在学习 Java 的过程中,许多初学者会遇到接口、方法覆盖和访问权限方面的困惑。本文将一步步解答这些常见问题,帮助新手程序员更好地理解 Java 编程中的重要概念。

1. 错误提示:Cannot reduce the visibility of the inherited method

当你在 Java 中覆盖一个方法时,可能会遇到类似的错误提示:Cannot reduce the visibility of the inherited method。这个错误的意思是你不能降低从父类或接口继承的方法的可见性。

比如,在你编写的代码中,你可能尝试将子类中的方法可见性设为 default(不显式声明访问修饰符),而接口中该方法的默认可见性为 public,这就导致了错误。要解决这个问题,你需要确保子类中的方法与接口中的方法具有相同或更高的可见性。

解决办法:

将子类中的方法显式声明为 public

@Override 
public void soud() {
    System.out.println("12"); 
}

2. 接口的默认可见性是什么?

在 Java 中,接口的默认可见性是 package-private,也就是说,接口只能在定义它的同一个包中被访问。如果你不在接口前声明 public,它就不能被其他包中的类访问。

然而,接口中的方法默认是 public 的。所有接口中的方法,无论接口本身的可见性如何,都会自动被声明为 public abstract。因此,一旦你在一个类中实现了该接口,这些方法就必须是 public 的。

3. 接口的默认 package-private 可见性意味着什么?

如果接口的可见性是 package-private(默认可见性),这意味着它只能在与之位于同一个包中的类中访问。如果你的 main 方法所在的类在不同的包中,并且接口没有声明为 public,则无法在 main 方法中直接访问该接口。

接口中的方法默认是 public 的,这意味着实现了该接口的类必须将这些方法声明为 public

4. 在正常类中,private 方法的使用规则

在一个普通类中(即不实现接口的类),如果你将一个方法声明为 private,那么这个方法只能在这个类的内部使用,不能在 main 方法或其他类中直接调用。

例如:

public class MyClass {
    private void myPrivateMethod() {
        System.out.println("This is a private method.");     
    } 
}

如果尝试在 main 方法中调用这个 private 方法,将会导致编译错误:

public class Main {     
    public static void main(String[] args) {         
        MyClass myClass = new MyClass();         
        myClass.myPrivateMethod(); // 错误:无法访问私有方法     
    } 
}

要使方法在其他类或 main 方法中可访问,你需要将其可见性更改为 public 或其他更宽松的访问级别:

public class MyClass {
    public void myPublicMethod() {
        System.out.println("This is a public method.");     
    } 
}

结论

Java 中的接口和方法可见性是初学者需要重点掌握的内容。在接口中,所有方法默认都是 public 的,而在普通类中,private 方法只能在类内部访问。理解这些概念将帮助你避免常见的编译错误,并编写出更清晰和结构化的代码。希望本文能帮助你更好地理解这些概念!

构造方法(和类名一样的方法)前面不用加返回类型,里面可以传递参数。
super可以在子类中代指父类来使用父类的方法,例如 super.父类中的方法
如果父类有用构造方法,子类也要有构造方法,其中构造方法的第一句要有super(),相当于是调用了父类的构造方法。
如果父类的构造方法有传递参数,那么第一个的super()里面也必须要有传递参数。
可以先给子类的构造方法传递参数,然后再把传递的参数传递给super()
类似于这样的

class Cao extends Teest{

    Cao(int num){

        super(num,"CAO");

    }
}

亦或者可以用方法重写
在class Teest 中再写一个 Teest()不传递参数,这样下面的子类Cao中super()也可以不传递参数。

最近在听陶吉吉的天天。
我发现,虽然写的好像是对于一个女生的想念。
但是我还是从这首歌里面听出了更多的对以前的怀念。
这里的以前,不仅仅是说一个女孩,还有的就是这个女生还在的以前。
最近在上大学,没什么事,开始学java,脑子慢慢变得清澈。
晚上睡觉的时候,常常会回到以前的某一个时间片段。
看到了自己还有别人。
开始慢慢发现一些值得怀念的东西。
也就是像是失去了的记忆慢慢地在脑海里浮现的那样感动。
挺好。

在使用Java编程时,你可能会遇到这样一个问题:当你使用Scanner类读取整数或浮点数后,紧接着调用nextLine()方法来读取字符串时,程序会直接跳过用户的输入。这种情况通常是由于Scanner在处理整数和浮点数输入之后,换行符还没有被消费掉,导致nextLine()直接读取了这个换行符而没有等待新的输入。

这是因为当你使用scanner.nextInt()scanner.nextDouble()等方法时,它们会读取数字并将光标移动到输入流的下一个位置,但不会消费输入结束时的换行符。所以,当你随后调用scanner.nextLine()时,它会读取这个换行符而不是等待用户输入新的字符串。

解决方法:
在调用scanner.nextLine()之前,插入一个额外的scanner.nextLine()来消费掉那个多余的换行符。

解释:
在读取完整数和浮点数之后调用scanner.nextLine();这一行代码,用于消耗掉多余的换行符,这样就可以正确读取用户输入的字符串。这种处理方式可以确保你的程序正确读取到输入的数据,避免因换行符问题而导致的读取错误。