Java基础
向上转型
作用:1、减少一些重复性代码 2、对象实例化的时候可以根据不同需求实例化不同的对象
自增
b=++a等于a=a+1,b=a
b=a++等于b=a,a=a+1
抽象类
使用abstract修饰的类或方法,就是抽象类或者抽象方法
什么是抽象类?为什么要使用抽象类?
抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类主要用于定义一组抽象方法,这些方法没有方法体,需要由子类来实现。使用抽象类的目的是为了定义一个公共的接口,让子类来实现具体的实现细节。
抽象类和接口有什么区别?
抽象类和接口都是用来定义抽象行为的,但它们之间存在一些区别:
实现方式: 抽象类可以包含抽象方法和非抽象方法,而接口只能包含抽象方法。
继承和实现: 一个类只能继承一个抽象类,但可以实现多个接口。
构造方法: 抽象类可以有构造方法,而接口不能有。
变量: 抽象类可以有成员变量,而接口只能有常量。
抽象类中可以有构造方法吗?为什么?
抽象类可以有构造方法。虽然抽象类不能被实例化,但是它的子类可以被实例化。子类在实例化时会调用父类的构造方法,所以抽象类需要有构造方法来初始化一些成员变量。
抽象类中一定要有抽象方法吗?
不是的。抽象类中可以没有抽象方法,但是包含抽象方法的类一定是抽象类。
抽象类和普通类的区别是什么?
抽象类不能被实例化,普通类可以。
抽象类可以包含抽象方法,普通类不能。
抽象类可以包含非抽象方法,普通类只能包含非抽象方法。
抽象类的作用是什么?
模板设计: 抽象类定义了一组公共的方法,子类可以根据需要实现这些方法,从而实现代码的复用。
接口定义: 抽象类可以定义一个接口,让子类必须实现某些方法,从而保证子类的行为一致性。
代码规范: 抽象类可以强制子类实现某些方法,提高代码的规范性。
如何设计一个好的抽象类?
明确抽象类的职责: 抽象类应该代表一组具有共同特征和行为的对象。
定义抽象方法: 抽象方法应该代表子类必须实现的行为。
提供默认实现: 对于一些公共的方法,可以在抽象类中提供默认的实现。
考虑继承层次: 设计抽象类时要考虑继承层次,避免过深的继承层次。
抽象类在实际开发中的应用场景有哪些?
工厂模式: 抽象类可以作为工厂模式中的抽象产品类。
模板方法模式: 抽象类可以作为模板方法模式中的抽象类。
适配器模式: 抽象类可以作为适配器模式中的目标接口。
Interface的默认方法和抽象类的默认方法区别
Java 8 引入了接口的默认方法(default method),这在一定程度上模糊了接口和抽象类的界限。但是,它们在概念和使用场景上仍有显著区别。
特点 | 接口的 default 方法 | 抽象类的默认实现 |
---|---|---|
定义位置 | 接口中 | 抽象类中 |
访问修饰符 | public | public 或 protected (通常是 public) |
作用 | 为接口提供默认实现,避免接口的“破坏性修改” | 为子类提供默认实现,方便子类复用 |
继承与实现 | 类实现接口时,可以重写 default 方法 | 子类继承抽象类时,可以重写默认实现方法 |
多继承 | 一个类可以实现多个接口,从而获得多个 default 方法 | 一个类只能继承一个抽象类 |
JDK中常用的设计模式
Java Development Kit(JDK)中内置了许多类库和框架,这些类库和框架中广泛应用了各种设计模式,使得Java程序更加灵活、可扩展和可维护。下面我们来详细探讨一下JDK中常用的设计模式。
工厂模式(Factory Pattern)
目的: 将对象的创建与使用分离,提供一个创建对象的接口。
JDK示例:
Calendar.getInstance():创建一个日历实例。
NumberFormat.getInstance():创建一个数字格式化实例。
优点:
降低耦合度,提高系统的可扩展性。
可以隐藏对象的创建逻辑。
单例模式(Singleton Pattern)
目的: 保证一个类只有一个实例,并提供一个全局访问点。
JDK示例:
Runtime.getRuntime():获取当前 Java 运行时环境。
优点:
控制资源的使用,避免重复创建对象。
在多线程环境下可以保证只有一个实例。
观察者模式(Observer Pattern)
目的: 定义对象之间的一对多依赖,当一个对象的状态发生改变时,它的所有依赖者都会收到通知并自动更新。
JDK示例:
java.util.Observer 和 java.util.Observable:用于实现观察者模式。
优点:
解耦对象,提高系统的灵活性和可扩展性。
适配器模式(Adapter Pattern)
目的: 将一个类的接口转换成客户希望的另一个接口。
JDK示例:
java.util.Arrays 类中的 asList() 方法:将数组适配成 List。
优点:
使原本不兼容的接口可以协同工作。
装饰器模式(Decorator Pattern)
目的: 动态地给一个对象添加一些额外的职责。
JDK示例:
java.io 包中的输入/输出流:通过装饰器可以实现缓冲、过滤等功能。
优点:
在不改变原有对象的基础上,动态地扩展对象的功能。
代理模式(Proxy Pattern)
目的: 为其他对象提供一种代理以控制对这个对象的访问。
JDK示例:
java.lang.reflect.Proxy:动态代理。
优点:
可以增强原有对象的功能,如日志记录、事务处理等。
模板方法模式(Template Method Pattern)
目的: 定义一个算法的骨架,而将一些步骤延迟到子类中。
JDK示例:
java.util.AbstractList:定义了 List 的基本操作,子类可以重写这些方法。
优点:
代码复用,提高代码的可扩展性。
策略模式(Strategy Pattern)
目的: 定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
JDK示例:
java.util.Comparator:定义了排序的策略。
优点:
算法可以独立于使用它的客户而变化。
迭代器模式(Iterator Pattern)
目的: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
JDK示例:
java.util.Iterator 接口:用于遍历集合。
优点:
访问集合元素的方式与集合的内部表示无关。
其他设计模式
除了上述常见的模式,JDK中还应用了其他许多设计模式,如:
建造者模式(Builder Pattern): StringBuilder
组合模式(Composite Pattern): java.awt.Container
状态模式(State Pattern): java.util.concurrent.locks.ReentrantLock
JDK中广泛应用了各种设计模式,这些设计模式使得Java程序更加灵活、可扩展和可维护。通过学习和理解这些设计模式,我们可以更好地编写高质量的Java代码。
Spring(整理中)
IoC
IoC(Inversion of Control:控制反转)设计思想(不是一种技术实现)是将程序中手动创建对象的控制权,交由Spring框架来管理。
在Spring中,IoC容器是Spring实现IoC的载体,IoC容器实际就是一个Map,里面存放各种对象。