学习effective java-18类和接口之接口优于抽象类

 该知识点是自己从书籍中学习的笔记。

     如果一个方法是抽象方法的话,那么该类一定是抽象类,并且该类的类名前必须加abstract。抽象类中的抽象方法也必须加abstract。

    接口可以多继承,而抽象类不能够。将抽象类和接口混合使用,可以构建出骨架类。

    接口和抽象各有各自的好处与缺点:当接口增加一个方法的时候,那么它的实现类也必须增加对该方法的实现,这会打破原有的类设计,但是使用抽象类就没有此缺点。

    总而言之,接口通常是用来定义具有多个实现的类型的最佳途径。当演化性和功能较重要的时候,则考虑使用抽象类。

<think>我们正在讨论Java的深入学习。根据用户之前的请求,用户已经学习Java基础,现在想深入理解Java相关的知识。 根据引用[1]中的学习路线,面向对象编程部分(第2部分)详细介绍了对象、继承多态、接口抽象类、封装等内容,这些都是Java的核心知识。 同时,引用[2]提到本站有从0做项目的教程,引用[3]则提供了JavaCV相关的实战教程,但用户当前问题聚焦在Java本身,因此我们主要参考引用[1]的路线,并适当结合实践。 因此,我们将围绕以下方面展开: 1. 的定义对象的创建 2. 的成员:字段、方法、构造器 3. 访问控制(封装) 4. 继承(包括方法重写) 5. 多态 6. 抽象类接口 7. 内部(包括匿名内部) 8. 枚举 9. 常用(如Object、String等)的深入理解 10. 设计模式中的使用(如单例、工厂等) 同时,为了帮助用户巩固知识,我们将提供一些示例代码,并推荐一些实践项目。 注意:由于用户要求深入,我们会适当深入一些高级特性最佳实践。 最后,按照要求生成相关问题。</think>### Java的深入学习指南 Java是面向对象编程的核心概念,深入理解及其相关特性是掌握Java的关键。以下是系统化的学习路径: #### 1. **与对象基础** - **定义**:模板声明,包含字段(属性)方法(行为) ```java public class Person { // 字段 private String name; private int age; // 构造器 public Person(String name, int age) { this.name = name; this.age = age; } // 方法 public void introduce() { System.out.println("我叫" + name + ",今年" + age + "岁"); } } ``` - **对象实例化**:通过`new`关键字创建对象 ```java Person person1 = new Person("张三", 25); person1.introduce(); // 输出:我叫张三,今年25岁 ``` #### 2. **面向对象三大特性** - **封装**:通过访问修饰符控制可见性 - `private`(仅本访问) - `protected`(本包及子访问) - `public`(全局访问) - 使用getter/setter管理字段访问 ```java public String getName() { return name; } public void setName(String name) { this.name = name; } ``` - **继承**:`extends`实现代码复用 ```java public class Student extends Person { private String school; public Student(String name, int age, String school) { super(name, age); // 调用父构造器 this.school = school; } } ``` - **多态**:父引用指向子对象 ```java Person p = new Student("李四", 20, "清华大学"); p.introduce(); // 运行时绑定子方法 ``` #### 3. **高级特性** - **抽象类**:包含抽象方法的,需用`abstract`声明 ```java public abstract class Animal { public abstract void makeSound(); // 抽象方法无实现 } ``` - **接口**:`interface`定义纯抽象规范(Java 8+支持默认方法) ```java public interface Swimmable { void swim(); // 默认public abstract default void dive() { // Java 8默认方法 System.out.println("潜水"); } } ``` - **内部**: - 成员内部(可访问外部私有成员) - 静态嵌套(`static`修饰) - 局部内部(方法内定义) - 匿名内部(即时实现接口) ```java Runnable r = new Runnable() { @Override public void run() { System.out.println("匿名内部"); } }; ``` #### 4. **关键深度解析** - **Object**:所有的超,重点方法: - `equals()`/`hashCode()`:对象相等性判断 - `toString()`:对象字符串表示 - `clone()`:对象克隆 - **String**:不可变性原理与内存机制 ```java String s1 = "abc"; // 字符串常量池 String s2 = new String("abc"); // 堆中新对象 System.out.println(s1 == s2); // false(引用不同) ``` #### 5. **设计模式中的应用** - **单例模式**:确保全局唯一实例 ```java public class Singleton { private static Singleton instance; private Singleton() {} // 私有构造器 public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` - **工厂模式**:解耦对象创建 ```java public interface Shape { void draw(); } public class Circle implements Shape { @Override public void draw() { System.out.println("绘制圆形"); } } public class ShapeFactory { public Shape createShape(String type) { if ("circle".equals(type)) return new Circle(); // 扩展其他形状... return null; } } ``` #### 6. **最佳实践** - **组合优于继承**:优先使用组合提高灵活性 - **不可变设计**:所有字段`private final`,不提供setter - **有效重写`equals()`**: ```java @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } ``` **推荐学习资源**: 1. 官方教程:[Java Classes and Objects](https://docs.oracle.com/javase/tutorial/java/javaOO/classes.html) 2. 书籍:《Effective Java》第3版(条目10-25详解设计) 3. 实战项目:实现一个完整的银行账户管理系统(包含账户、交易、异常处理等) --- ### 相关问题 1. Java抽象类接口的主要区别是什么?分别在什么场景下使用?[^1] 2. 如何正确重写`equals()``hashCode()`方法?为什么要同时重写这两个方法?[^1] 3. 在Java内部中,为什么局部内部只能访问`final`局部变量?[^1] 4. 单例模式有哪些实现方式?如何防止反射攻击破坏单例?[^1] 5. 设计一个不可变需要遵循哪些原则?举例说明其优势。[^1] [^1]: 参考自Java面向对象编程核心概念及官方文档 [^2]: Java学习路线中的面向对象模块 [^3]: JavaCV教程中设计的实战应用案例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值