类名后加冒号是否报错?Java类继承语法疑问
首先直接给你个准信:你提到的Vehicle : java.lang.Object这行百分百是编译错误!Java里类继承根本不支持冒号语法——那是C++、Python这类语言的写法,Java明确规定类继承必须用extends关键字。而且其实Java中所有类默认就继承java.lang.Object,所以这行完全可以简化成class Vehicle,非要写全的话也是class Vehicle extends java.lang.Object,绝对不能用冒号。
接下来结合你找到的4个错误,再把这个语法错误加进去,给你梳理所有问题和修复方式:
所有编译错误点及修复说明
错误1:接口方法使用
protected修饰符
接口里的所有普通方法默认都是public abstract(JDK8+的默认/静态方法也是public),根本不能用protected修饰。要么改成public,要么直接省略修饰符(默认就是public)。
原代码:protected void g(){System.out.println("Hello")};
修复后:void g();(或者public void g();)错误2:普通接口方法带有方法体
接口里的普通抽象方法不能有方法体,只能声明方法签名。如果非要在接口里写实现逻辑,得加default或static关键字,但这里场景不需要,所以直接去掉方法体就行。错误3:类继承+实现接口的语法错误
Java是单继承语言,类继承用extends,实现接口必须用implements,不能像原代码那样用逗号把父类和接口放一起。原代码public class Main extends Vehicle, Movable完全错误,正确写法是public class Main extends Vehicle implements Movable。错误4:子类方法无法访问父类私有变量
Vehicle里的x是private修饰,子类Main根本没权限直接访问。要么把x的修饰符改成protected(让子类可访问),要么在Vehicle里写个setX(int value)的公共方法来修改。错误5:类继承使用冒号(就是你问的那行)
前面已经说过了,Java类继承必须用extends,把冒号改成extends就好,甚至可以直接省略extends java.lang.Object,因为默认继承。
修复后的可运行代码
interface Movable{ void g(); // 去掉protected修饰符和方法体 } class Vehicle { protected int x; // 把private改成protected,允许子类访问 } public class Main extends Vehicle implements Movable{ public static void main(String[] args) { System.out.println("this is main"); } @Override public void g() { this.x = 2; // 现在可以正常修改x了 } }
内容的提问来源于stack exchange,提问作者jacksontektek

