在Java中,有一种特殊的方法被称为构造方法,也被称为构造函数或者是构造器,通过提供这个构造器,我们就可以确保我们的每一个对象都被初始化,当然我们的构造方法只能在对象的创建时期调用以此,保证我们的初始化的进行。我们的构造方法比较特殊,没有参数类型和返回值,它的名称要和类名保持一致。
class Apple{
int sum;
String color;
public Apple(){}
public Apple(int sum){}
public Apple(String color){}
public Apple(int sum, String color){}
上面定义了一个Apple类,我们可以发现Apple类没有参数类型与返回值,并且有多个以Apple重名的方法,而且各个Apple的参数列表都不一样,其实这就是一种多态的表现。
class createApple {
public static void main(String[] args) {
Apple apple1 = new Apple();
Apple apple2 = new Apple(1);
Apple apple3 = new Apple("red");
Apple apple4 = new Apple(2,"color");
}
}
如果此时我们定义了四个Apple对象,并调用的Apple的四种不同的构造方法,其中不加任何的参数的构造方法被称为默认的构造方法,其中不加任何参数的构造方法被称为默认的构造方法,如果类中没有定义任何的构造方法,那么JVM会自动生成一个构造方法,需要注意的是如果我们手动定义了任何一个构造方法,JVM就不再为你提供默认的构造器,此时我们必须手动指定,否则就会出现编译错误
显示的错误就是,我们必须要提供一个Apple带有int参数的构造函数,而默认的无参构造器函数没有被允许使用。
在Java中还有一个很重要的概念就是方法的重载,它是类名的不同表现形式,刚刚所提到的Apple的构造函数,其实构造函数也是重载的一种,因此每一个重载的方法都有独一无二的参数列表,其中包括参数的类型,顺序,参数数量。
重载的条件:
- 方法名称必须相同
- 参数列表必须不同(个数,类型,参数类型排列顺序不同)
- 方法的返回类型可以相同也可以不相同
- 仅仅返回类型不同不足以称为方法的重载
- 重载是发生在编译时的,因此编译器可以根据参数的类型来选择使用哪个方法
重写与重载的名字虽然相似,其实是完全不同的东西,方法重写的描述是对子类和父类之间的,而重载仅指在同一类当中。
class Fruit{
public void eat(){
System.out.println("eat fruit");
}
}
class Apple extends Fruit{
@Override
public void eat(){
System.out.println("eat apple");
}
}
重写的原则
- 重写的方法必须要和父类保持一致,包括返回类型,方法名,参数列表也都一样
- 重写的方法可以使用**@Override**注解来标识
- 子类中重写的方法的访问权限不能低于父类中的方法的权限
其实在我们使用 new 关键字创建一个对象的时候,是调用了对象无参数的构造方法来进行初始化,这个无参数的构造方法可以隐藏,由JVM自动添加,也就是说构造函数能够确保类的初始化。
初始化顺序- 静态属性:static 开头定义的属性
- 静态方法块:static{} 包起来的代码块
- 普通属性:非 static 定义的属性
- 普通方法块:{} 包起来的代码块
- 构造函数:类名相同的方法
- 方法:普通方法
public class LifeCycle {
// 静态属性
private static String staticField = getStaticField();
// 静态方法块
static {
System.out.println(staticField);
System.out.println("静态方法块初始化");
}
// 普通属性
private String field = getField();
// 普通方法块
{
System.out.println(field);
}
// 构造函数
public LifeCycle() {
System.out.println("构造函数初始化");
}
public static String getStaticField() {
String statiFiled = "Static Field Initial";
return statiFiled;
}
public static String getField() {
String filed = "Field Initial";
return filed;
}
// 主函数
public static void main(String[] argc) {
new LifeCycle();
}
}
可变参数列表
Java 中一种数组冷门的用法就是可变参数
public int add(int... numbers){
int sum = 0;
for(int num : numbers){
sum += num;
}
return sum;
}
add(new Integer[] {1,2,3}); //传递数组
对象的销毁
虽然 Java 语言是基于 C++ 的,但是它和 C/C++ 一个重要的特征就是不需要手动管理对象的 销毁工作。
在 Java 中,我们不再需要手动管理对象的销毁,它是由Java虚拟机进行管理和销毁。虽然我们不需要手动管理对象,但是需要知道对象作用域这个概念。
Java中成员的访问权限共有四种,分别是 public、protected、default、private
继承是所有OOP语言和Java语言都不可或缺的一部分。只要我们创建一个类,就隐式的继承自Object父类,这叫做隐式指定,而extends即为显示指定。
多态多态指的是同一个行为具有多个不同表现形式。是指一个类实例(对象)的相同方法在不同情形下具有不同表现形式。封装和继承为多态的基础。
多态的实现三个条件
- 继承
- 重写父类方法
- 父类引用指向子类对象
组合就是将对象引用置于新类中即可。组合也是一种提高类的复用性的一种方式。如果你想让类具有更多的拓展功能,需要多用组合,少用继承。
代理大致就是,A想要调用B类的方法,A不会直接调用,A会在自己的类中创建一个B对象的代理,再由调用B的方法。
public class Destination{
public void todo(){
System.out.println("control...");
}
}
public class Device {
private String name;
private Destination destination;
private DeviceController deviceController;
public void control(Destination destination){
destination.todo();
}
}
public class DeviceController{
private Device name;
private Destination destination;
public void control(Destination destination){
destination.todo();
}
}
向上转型
向上转型代表了父类与子类的关系,其实父类和子类之间不仅仅有向上转型,还有向下转型,它们的转型后的范围不一样。



