基础概念

面向对象程序设计的重点是类的设计,而设计类就是设计类的成员
属性(Filed)——类中的成员变量
行为(Method)——类中的成员方法
创建类的对象 = 类的实例化 = 实例化类,关键字:new

内存分析

图片.png

成员变量、局部变量

  • 在类中的声明位置不同
    • 成员变量:直接定义在类的一对 {}
    • 局部变量:声明在方法、代码块、构造器内部的变量与方法形参、构造器形参
  • 权限修饰符不同
    • 成员变量:可使用 publicprotected、默认、private
    • 局部变量:不可使用权限修饰符
  • 默认初始化值不同
    • 成员变量:整型(0)、浮点型(0.0)、字符型('0'``'\u0000')、布尔型(false)、引用类型(null
    • 局部变量:没有默认初始化值,因此一定要显式赋值
  • 内存加载位置不同

    • 成员变量:堆空间(非 static
    • 局部变量:栈空间

      可变个数参数

      public void More(String... args) {}
      public void More(String[] args) {}
      两者等效,但前者更简便
      可变参数必须放在参数列表的最后面

      方法参数的值传递机制

      Java 的参数传递方式只有一种:值传递,即将实际参数值的拷贝传入方法内:
  • 形参是基本数据类型,则将实参 数据值 的拷贝传递给形参

  • 形参是引用数据类型,则将实参 地址值 的拷贝传递给形参

    访问权限修饰符

    用来修饰类以及类内部的属性、方法、构造器和内部类
    类(class)的权限修饰符只能用 public、默认
修饰符 类内部 同一个包 不同包的子类 同一个工程
public
protected
默认
private

JavaBean

符合下列标准的 Java 类:

  • 类是公共的
  • 有一个公共的无参构造器
  • 有用 private 修饰的私有属性,且都有对应的 getter、setter 方法

    构造器调用其他构造器

    在类的构造器中,可以显式使用 this(实参列表) 调用本类中指定的其他构造器
    构造器不能通过使用 this(实参列表) 调用自己
    如果一个类中有 n 个构造器,则最多有 n-1 个构造器中使用了 this(实参列表)
    this(实参列表) 必须声明在当前构造器的首行
    关键:调用链不能成环,否则会导致死循环

    方法重写

    子类重写方法的方法名和参数列表与父类被重写方法的方法名和参数列表相同
    子类重写方法的权限修饰符不能小于父类被重写方法的权限修饰符,特别的,子类不能重写父类被 private 修饰的方法
    关于返回值类型:

  • 父类被重写方法返回 void 或基本类型,则子类重写方法只能返回 void 或相同的基本类型

  • 父类被重写方法返回 A 类型,则子类重写方法可以是 A 类或 A 类的子类

子类重写方法抛出的异常不能大于父类被重写方法抛出的异常
子类和父类中同名同参数的方法,要么都声明为非 static 要么都声明为 static(不是重写了)

super 关键字

用来调用父类的属性、方法、构造器

调用属性或方法

在子类的方法或构造器中,通过 super.属性super.方法显式调用父类结构,但通常省略 super.
当子类和父类定义了同名的属性时,要在子类中调用父类的属性,则必须显式调用
当子类重写了父类的方法时,要在子类中调用父类被重写的方法,则必须显式调用

调用构造器

在子类的构造器中显式使用 super(实参列表) 调用父类中指定的构造器
super(实参列表) 必须声明在当前构造器的首行
this(实参列表)super(实参列表) 只能二选一,且若未显式指定,则默认为父类中的空参构造器

多态

父类的引用指向子类的对象(或子类的对象赋给父类的引用)
当对象调用子父类同名参数的方法时,实际执行的是子类重写的父类方法
对象的多态性只适用于方法而不适用于属性
多态中的向下转型——使用强制转换符,用 instanceof 进行判断

==equals() 的区别

一个是运算符,一个是对象方法
== 比较基本类型的数值和引用类型的地址值
equals() 只能用于引用数据类型,并且要看对象是否重写了该方法,若未重写,则与 == 等效,若重写,则按重写规则比较

包装类

图片.png
图片.png

自动装箱、自动拆箱

  1. int i1 = 123;
  2. // 自动装箱
  3. Integar i2 = i1;
  4. // 自动拆箱
  5. int i3 = i2;

static 关键字

意为静态的
可以修饰属性、方法、代码块、内部类
图片.png子父类同名同参数的方法要么都是非静态的(考虑重写),要么都是静态的(不是重写)

修饰属性——静态变量

属性按是否被 static 修饰,分为静态变量(类变量)和非静态变量(实例变量)
图片.png静态变量随着类的加载而加载,并且早于对象的创建,在内存中只存在一份于方法区的静态域中

修饰方法——静态方法

静态方法随着类的加载而加载
静态方法中,只能调用静态的属性或方法
非静态方法中,可以调用静态以及非静态的属性或方法
静态方法中,不能使用 this 和 super

修饰代码块——静态代码块

静态代码块随着类的加载而执行,只执行一次
非静态代码块随着对象的加载而执行,每创建一次就执行一次
静态代码块中,只能调用静态的结构
非静态代码块中,可以调用静态以及非静态的结构

属性赋值的先后顺序

图片.png

final 关键字

意为最终的
可以修饰类、方法、变量

修饰类

此类不能被继承,例如 String 类、System 类、StringBuffer

修饰方法

此方法不能被重写

修饰变量

该变量(包括属性和局部变量)成为常量,不可被修改
static final 定义全局常量

abstract 关键字

意为抽象的
可以修饰类和方法
不可以修饰属性、构造器、私有方法、静态方法、final 方法、final 类

修饰类——抽象类

此类不能实例化
类中仍然有构造器,在子类实例化的时候调用(涉及到子类对象实例化的全过程)
定义抽象类必然要定义抽象类的子类

修饰方法——抽象方法

只有方法的声明而没有方法体
包含抽象方法的类,一定是抽象类,但抽象类不一定有抽象方法
子类重写了抽象类父类(包括直接父类和间接父类)的所有抽象方法才可以实例化,否则也是抽象类

接口

接口和类是平级的两种概念
接口中可以定义:全局常量、抽象方法、静态方法、默认方法
接口中不能定义构造器,因此不能实例化
实现类实现了接口中的的所有抽象方法才可以实例化,否则为抽象类
Java 允许多接口的实现
接口之间可以继承并且可以多继承