[Java基础]面向对象
面向对象
访问控制修饰符
Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
- public : 对所有类可见。使用对象:类、接口、变量、方法
- protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
- default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
- private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
接口
接口中方法的访问修饰符默认是
public abstract
在 Java 接口中,接口中的方法默认是公共的(public),且不允许使用其他的访问修饰符。接口中定义的方法会被隐式地指定为 public abstract
,这两个修饰符可以省略,因为它们是默认的。
所以,Java 接口中方法的定义形式通常是:
public interface MyInterface {
void myMethod(); // 隐式的 public abstract
}
在 Java 8 及之后的版本中,接口还引入了默认方法(default methods)和静态方法(static methods)。这两种方法可以包含方法体,而不仅仅是声明。这两种方法的访问修饰符分别是:
-
默认方法(Default Methods):
- 默认方法使用
default
关键字进行声明,它们在接口中有一个默认的实现。默认方法可以被接口的实现类继承或者覆盖。默认方法无法通过接口名来调用。
public interface MyInterface { default void myDefaultMethod() { // 默认方法的实现 } }
- 默认方法使用
-
静态方法(Static Methods):
- 静态方法使用
static
关键字进行声明,它们在接口中有一个静态的实现。静态方法可以直接通过接口名调用,不需要通过实现类的实例调用。
public interface MyInterface { static void myStaticMethod() { // 静态方法的实现 } }
- 静态方法使用
总结起来,Java 接口中方法的访问修饰符默认是 public abstract
,但对于默认方法和静态方法,可以使用 default
和 static
关键字进行修饰。默认方法和静态方法的引入使得接口可以包含一些具体的实现,而不仅仅是抽象方法。
实现接口的类,重写接口中的方法时,应该将访问修饰符定为public
当一个类实现一个接口时,类需要遵循以下访问修饰符的要求:
- 接口方法实现:
- 实现类必须提供接口中定义的所有方法的实现,包括默认方法。如果不提供全部方法的实现,那么该类必须声明为抽象类(abstract)。
- 接口方法的访问修饰符:
-
实现类中的方法必须使用
public
访问修饰符,因为接口中的方法默认是public
的。如果使用其他访问修饰符(例如protected
或private
),会导致编译错误。public class MyClass implements MyInterface { public void myMethod() { // 实现接口方法 } // 实现默认方法 public void myDefaultMethod() { // 默认方法的实现 } }
-
接口中静态方法的访问:
- 静态方法可以通过接口名直接调用,不需要实现类提供具体实现。实现类可以选择提供一个相同签名的静态方法,但这只是一个静态方法而不是接口中的静态方法的实现。
public class MyClass implements MyInterface { public void myMethod() { // 实现接口方法 } // 实现默认方法 public void myDefaultMethod() { // 默认方法的实现 } // 提供一个静态方法,但不是接口中的静态方法的实现 public static void myStaticMethod() { // 静态方法的实现 } }
总体来说,实现类中实现接口的方法需要使用 public
访问修饰符,并提供接口中所有抽象方法的具体实现。对于默认方法和静态方法,可以选择性地提供实现。
抽象类和接口的区别
-
抽象类用来继承,接口用来实现,定义规范
-
抽象类用来规定对象长什么样子,但是接口用来规定对象有什么行为。
-
接口中的成员变量只能是public static final类型的,静态方法和默认方法只能是public或private访问级别,抽象方法只能是public访问级别。
-
抽象类中可以定义各种类型的成员变量,并且成员方法可以处于四种访问级别。这是
抽象类的优势所在
,它可以包含所有子类的共同实例变量,避免在子类中重复定义,而且抽象类可以利用四种访问级别来灵活地设定对实现细节的封装程度。 -
一个类只能继承一个直接的父类;但一个类可以实现多个接口,这是
接口的优势所在
,也就是我们可以利用接口实现多继承。从语义上有区分,接口是对多个类的共同行为(或者说对外提供的服务)的抽象,抽象类是对根据多个类的共性(包括属性和行为)进行的类型抽象。
我之前写过一个项目,我需要一个抽象的缓存框架,其中就用到了抽象类,这个抽象类本身就带有三个hashmap,所以我们只需要继承这个类就可以直接使用这三个hashmap。
重载和重写
-
方法重载(Method Overloading)是Java中实现多态的一种方式。它允许在同一个类中定义多个同名的方法,只要这些方法的参数列表不同。这些不同的参数列表可以通过不同的参数类型、参数数量或参数顺序来实现。重载的条件就是方法的方法名一样,参数列表不同。
参数列表不同有多个情况:- 不同的参数类型可以实现方法重载;
- 不同的参数数量可以实现方法重载;
- 同样类型但顺序不同的参数也可以实现方法重载。
-
方法重写(override)在子类中创建了一个与父类中名称相同、返回值类型相同、参数列表的方法相同,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖、方法复写。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix