学习java过程中的理解普通类抽象类接口可以被实例化不能被实例化不能被实例化不能写抽象方法普通方法有实现- 不必须重写、抽象方法无实现- 必须重写、静态方法 - 不必须重写抽象方法必须重写、默认方法Java 8- 不必须重写、静态方法Java 8- 不必须重写、私有方法Java 9- 不必须重写抽象类也好接口也好 都是对普通类的规范和约束interface ModernInterface{// ✅ 抽象方法必须重写voidabstractMethod();// 隐式抽象// ✅ 默认方法Java 8- 不必须重写defaultvoiddefaultMethod(){System.out.println(有实现的默认方法);}// ✅ 静态方法Java 8- 不必须重写staticvoidstaticMethod(){System.out.println(接口的静态方法);}// ✅ 私有方法Java 9- 不必须重写privatevoidprivateMethod(){System.out.println(私有辅助方法);}}abstract class AbstractClass{// ✅ 普通方法有实现- 不必须重写publicvoidnormalMethod(){System.out.println(普通方法实现);}// ✅ 抽象方法无实现- 必须重写public abstractvoidabstractMethod();// ✅ 静态方法 - 不必须重写publicstaticvoidstaticMethod(){}}// 接口interface A{voidmethodA();// 抽象方法defaultvoidmethodB(){}// 默认方法}interface B{voidmethodC();// 抽象方法}// 抽象类abstract class C{public abstractvoidmethodD();// 抽象方法publicvoidmethodE(){}// 普通方法}// 普通类继承抽象类和接口class MyClass extends C implements A,B{// 必须重写所有抽象方法Override publicvoidmethodA(){}// 来自接口AOverride publicvoidmethodC(){}// 来自接口BOverride publicvoidmethodD(){}// 来自抽象类C// 可选重写不是必须的// methodB() - 接口的默认方法// methodE() - 抽象类的普通方法}静态变量 在类内部直接访问在外部可以通过类名访问父级类名也可以由子类访问重要概念静态变量不被继承而是被共享// 静态变量跟静态方法class Student{privatestaticinttotalStudents0;private String name;publicStudent(String name){this.namename;// 以下三种方式都可以totalStudents;// 方式1直接访问最推荐Student.totalStudents;// 方式2通过类名访问推荐// this.totalStudents; // 方式3通过this访问不推荐}}// 父类class Student{protectedstaticinttotalStudents0;// 静态变量protectedstaticString schoolName第一中学;// 静态变量private String name;publicStudent(String name){this.namename;Student.totalStudents;// 每创建一个学生总数1}publicstaticvoidshowSchool(){System.out.println(学校: schoolName);}}// 子类class Student1 extends Student{private String grade;publicStudent1(String name,String grade){super(name);// 调用父类构造方法this.gradegrade;}publicvoidtest(){// ✅ 子类中可以直接访问父类的静态变量System.out.println(总学生数: totalStudents);// 直接访问System.out.println(学校名: schoolName);// 直接访问// ✅ 可以通过子类类名访问System.out.println(Student1.totalStudents: Student1.totalStudents);// ✅ 也可以通过父类类名访问System.out.println(Student.totalStudents: Student.totalStudents);}}// 测试public class Test{publicstaticvoidmain(String[]args){// 创建父类对象Student s1newStudent(张三);Student s2newStudent(李四);// 创建子类对象Student1 s3newStudent1(王五,高一);Student1 s4newStudent1(赵六,高二);// ✅ 通过子类类名访问父类静态变量System.out.println(Student1.totalStudents: Student1.totalStudents);// 输出4System.out.println(Student.totalStudents: Student.totalStudents);// 输出4// ✅ 通过子类对象访问System.out.println(s3.totalStudents);// 输出4但不推荐}}静态方法子类的静态方法不能被父类重写静态方法只能被隐藏Hide而不能被重写。这是静态方法和实例方法的根本区别。class Parent{// 实例方法 - 可以被重写publicvoidinstanceMethod(){System.out.println(Parent的实例方法);}// 静态方法 - 可以被隐藏但不能被重写publicstaticvoidstaticMethod(){System.out.println(Parent的静态方法);}}class Child extends Parent{// ✅ 这是重写Override实例方法Override publicvoidinstanceMethod(){System.out.println(Child的实例方法);}// ❌ 这不是重写这是隐藏Hide静态方法// Override // 如果加上Override会编译错误publicstaticvoidstaticMethod(){System.out.println(Child的静态方法);}}public class Test{publicstaticvoidmain(String[]args){Parent pnewChild();// 实例方法动态绑定看实际对象类型p.instanceMethod();// 输出Child的实例方法// 静态方法静态绑定看引用类型p.staticMethod();// 输出Parent的静态方法// 通过类名调用最清晰Parent.staticMethod();// 输出Parent的静态方法Child.staticMethod();// 输出Child的静态方法}}为什么静态方法不能重写class Explanation{// 静态方法在编译时就已经确定了调用关系// 它不依赖于对象只依赖于类publicstaticvoidmain(String[]args){// 编译时编译器就知道要调用哪个类的静态方法Parent.staticMethod();// 编译时绑定到ParentChild.staticMethod();// 编译时绑定到ChildParent pnewChild();p.staticMethod();// 编译时根据p的类型(Parent)绑定到Parent.staticMethod()}}静态方法可以说又是静态又是抽象方法么不能静态方法不能是抽象的// ❌ 编译错误 Illegal combination of modifiers: abstract and staticabstract class Wrong{public abstractstaticvoidmethod();// 错误}// ❌ 接口中也不行interface WrongInterface{public abstractstaticvoidmethod();// 错误}正确的组合应该是// ✅ 抽象类可以有抽象方法需要子类实现abstract class CorrectAbstract{public abstractvoidabstractMethod();// 正确}// ✅ 抽象类可以有静态方法有实现abstract class CorrectStatic{publicstaticvoidstaticMethod(){}// 正确}// ✅ 接口可以有静态方法Java 8interface CorrectInterface{staticvoidstaticMethod(){}// 正确}// ✅ 接口可以有抽象方法interface CorrectInterface2{voidabstractMethod();// 正确}
学习java过程中的理解
学习java过程中的理解普通类抽象类接口可以被实例化不能被实例化不能被实例化不能写抽象方法普通方法有实现- 不必须重写、抽象方法无实现- 必须重写、静态方法 - 不必须重写抽象方法必须重写、默认方法Java 8- 不必须重写、静态方法Java 8- 不必须重写、私有方法Java 9- 不必须重写抽象类也好接口也好 都是对普通类的规范和约束interface ModernInterface{// ✅ 抽象方法必须重写voidabstractMethod();// 隐式抽象// ✅ 默认方法Java 8- 不必须重写defaultvoiddefaultMethod(){System.out.println(有实现的默认方法);}// ✅ 静态方法Java 8- 不必须重写staticvoidstaticMethod(){System.out.println(接口的静态方法);}// ✅ 私有方法Java 9- 不必须重写privatevoidprivateMethod(){System.out.println(私有辅助方法);}}abstract class AbstractClass{// ✅ 普通方法有实现- 不必须重写publicvoidnormalMethod(){System.out.println(普通方法实现);}// ✅ 抽象方法无实现- 必须重写public abstractvoidabstractMethod();// ✅ 静态方法 - 不必须重写publicstaticvoidstaticMethod(){}}// 接口interface A{voidmethodA();// 抽象方法defaultvoidmethodB(){}// 默认方法}interface B{voidmethodC();// 抽象方法}// 抽象类abstract class C{public abstractvoidmethodD();// 抽象方法publicvoidmethodE(){}// 普通方法}// 普通类继承抽象类和接口class MyClass extends C implements A,B{// 必须重写所有抽象方法Override publicvoidmethodA(){}// 来自接口AOverride publicvoidmethodC(){}// 来自接口BOverride publicvoidmethodD(){}// 来自抽象类C// 可选重写不是必须的// methodB() - 接口的默认方法// methodE() - 抽象类的普通方法}静态变量 在类内部直接访问在外部可以通过类名访问父级类名也可以由子类访问重要概念静态变量不被继承而是被共享// 静态变量跟静态方法class Student{privatestaticinttotalStudents0;private String name;publicStudent(String name){this.namename;// 以下三种方式都可以totalStudents;// 方式1直接访问最推荐Student.totalStudents;// 方式2通过类名访问推荐// this.totalStudents; // 方式3通过this访问不推荐}}// 父类class Student{protectedstaticinttotalStudents0;// 静态变量protectedstaticString schoolName第一中学;// 静态变量private String name;publicStudent(String name){this.namename;Student.totalStudents;// 每创建一个学生总数1}publicstaticvoidshowSchool(){System.out.println(学校: schoolName);}}// 子类class Student1 extends Student{private String grade;publicStudent1(String name,String grade){super(name);// 调用父类构造方法this.gradegrade;}publicvoidtest(){// ✅ 子类中可以直接访问父类的静态变量System.out.println(总学生数: totalStudents);// 直接访问System.out.println(学校名: schoolName);// 直接访问// ✅ 可以通过子类类名访问System.out.println(Student1.totalStudents: Student1.totalStudents);// ✅ 也可以通过父类类名访问System.out.println(Student.totalStudents: Student.totalStudents);}}// 测试public class Test{publicstaticvoidmain(String[]args){// 创建父类对象Student s1newStudent(张三);Student s2newStudent(李四);// 创建子类对象Student1 s3newStudent1(王五,高一);Student1 s4newStudent1(赵六,高二);// ✅ 通过子类类名访问父类静态变量System.out.println(Student1.totalStudents: Student1.totalStudents);// 输出4System.out.println(Student.totalStudents: Student.totalStudents);// 输出4// ✅ 通过子类对象访问System.out.println(s3.totalStudents);// 输出4但不推荐}}静态方法子类的静态方法不能被父类重写静态方法只能被隐藏Hide而不能被重写。这是静态方法和实例方法的根本区别。class Parent{// 实例方法 - 可以被重写publicvoidinstanceMethod(){System.out.println(Parent的实例方法);}// 静态方法 - 可以被隐藏但不能被重写publicstaticvoidstaticMethod(){System.out.println(Parent的静态方法);}}class Child extends Parent{// ✅ 这是重写Override实例方法Override publicvoidinstanceMethod(){System.out.println(Child的实例方法);}// ❌ 这不是重写这是隐藏Hide静态方法// Override // 如果加上Override会编译错误publicstaticvoidstaticMethod(){System.out.println(Child的静态方法);}}public class Test{publicstaticvoidmain(String[]args){Parent pnewChild();// 实例方法动态绑定看实际对象类型p.instanceMethod();// 输出Child的实例方法// 静态方法静态绑定看引用类型p.staticMethod();// 输出Parent的静态方法// 通过类名调用最清晰Parent.staticMethod();// 输出Parent的静态方法Child.staticMethod();// 输出Child的静态方法}}为什么静态方法不能重写class Explanation{// 静态方法在编译时就已经确定了调用关系// 它不依赖于对象只依赖于类publicstaticvoidmain(String[]args){// 编译时编译器就知道要调用哪个类的静态方法Parent.staticMethod();// 编译时绑定到ParentChild.staticMethod();// 编译时绑定到ChildParent pnewChild();p.staticMethod();// 编译时根据p的类型(Parent)绑定到Parent.staticMethod()}}静态方法可以说又是静态又是抽象方法么不能静态方法不能是抽象的// ❌ 编译错误 Illegal combination of modifiers: abstract and staticabstract class Wrong{public abstractstaticvoidmethod();// 错误}// ❌ 接口中也不行interface WrongInterface{public abstractstaticvoidmethod();// 错误}正确的组合应该是// ✅ 抽象类可以有抽象方法需要子类实现abstract class CorrectAbstract{public abstractvoidabstractMethod();// 正确}// ✅ 抽象类可以有静态方法有实现abstract class CorrectStatic{publicstaticvoidstaticMethod(){}// 正确}// ✅ 接口可以有静态方法Java 8interface CorrectInterface{staticvoidstaticMethod(){}// 正确}// ✅ 接口可以有抽象方法interface CorrectInterface2{voidabstractMethod();// 正确}