目录
一、面向对象
- Java类及类的成员:属性、方法、构造器;代码块、内部类
- 面向对象的三大特征:封装性、继承性、多态性、(抽象性)
- 其他关键字:this、super、static、final、abstract、interface、package、import等
两个要素
- 类:对一类事物的描述,是抽象的、概念上的定义
- 对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)
类和对象的使用(面向对象思想落地的实现)
- 创建类,设计类的成员(属性/方法)
- 创建类的对象
- 通过"对象.属性"或"对象.方法"调用对象的结构
属性(成员变量)和局部变量的比较
- 相同点:先声明后使用,变量都有其对应的作用域
- 不同点
- 在类中声明的位置不同:属性是直接定义在类的一对{}内;局部变量是声明在方法内、方法形参、代码块内、构造器形参、构造器内部
- 属性可以在声明的同时指明权限,使用权限修饰符:private、public、protected、缺省;局部变量则不可使用
- 默认初始化值,属性:整形
0
、浮点型0.0
、字符型(char)0
、布尔型false
、引用数据类型(类、接口、数组)null
;局部变量没有默认初始化值。在调用之前要显示赋值,其中形参在调用时赋值 - 属性在内存中加载到堆空间中(非static);局部变量加载到栈空间中
匿名对象
-
理解:创建的对象,没有显示的赋给一个变量名,即为匿名对象。
-
特征:匿名对象只能调用一次。
-
使用示例如下:
public class PhoneTest { public static void main(String[] args) { Phone p1 = new Phone(); p1.sendEmail(); //匿名对象 new Phone().sendEmail(); new Phone().sendEmail(); //跟上面一行是不同的两个匿名对象 //常见的使用 PhoneMall pm = new PhoneMall(); pm.showInfo(p1); pm.showInfo(new Phone()); //使用匿名而不使用p1 } } class Phone{ int price = 1999; public void showPrice(){ System.out.println("价格为:" + price); } public void sendEmail() { System.out.println("发送邮件"); } } class PhoneMall{ public void showInfo(Phone p) { p.sendEmail(); p.showPrice(); } }
二、可变个数形参
- JDK 5.0新增的内容
- 具体使用:
- 可变个数形参的格式:数据类型 … 参数名
- 当调用可变个数形参方法时,传入个数的参数个数可以是0、1、2、…个
- 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载(二者不能共存)
- 如一个方法中有多个形参,则可变个数形参必须声明在末尾
- 一个方法最多只能声明一个可变形参。
//JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量
public static void test(int i,String[] books);
//JDK 5.0:采用可变个数形参来定义方法,传入多个同一变量
public static void test(int i,String...books);
三、关于变量赋值
- 如果变量是基本数据类型,此时赋值的是变量所保存的数据值。
- 如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值。
- 在方法中,如果参数是基本数据类型,此时实参赋给形参的是实参真实存储的数据值。
- 如果参数是引用数据类型,此时实参赋给形参的是实参存储数据的地址值。
四、封装和隐藏
四种访问权限修饰符
修饰符 | 类内部 | 同一个包 | 不同包的子类 | 同一个工程 |
---|---|---|---|---|
private | ✅ | |||
(缺省) | ✅ | ✅ | ||
protected | ✅ | ✅ | ✅ | |
public | ✅ | ✅ | ✅ | ✅ |
- 对于class的权限修饰符只可以用public和default(缺省)。
- 4中权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
五、构造器
- 构造器的作用
- 创建对象
- 初始化对象的属性
- 说明
- 如果没有显式地定义类的构造器的话,则系统默认提供一个空参的构造器
- 定义构造器的格式: 权限修饰符 类名 (形参列表){ }
- 一个类中定义的多个构造器,彼此构成重载
- 一旦显式地定义了类的构造器之后,系统就不再提供默认的空参构造器
六、方法的重写
重写:子类继承父类后,可对父类中同名同参的方法,进行覆盖操作(静态方法不能被重写)
子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符,并且不能重写父类中声明为private权限的方法(可以定义,但不是重写)
父类被重写的方法的返回值类型是void、基本数据类型,则子类重写的方法的返回值类型只能是void或者相同的数据类型。
父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型只能是A类型或者A类的子类。
子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
七、super关键字
super:可以用来调用:属性、方法、构造器
- 当子类和父类中定义了同名的属性时,要想在子类中调用父类中声明的属性,则必须使用“super.属性”来以示区分,表名调用的是父类中声明的属性;
- 子类重写父类中的方法以后若还想调用父类中的同名方法,则使用“super.方法”来以示区分,表名调用的是父类中声明的方法。
- 调用构造器
- 可以在子类的构造器中使用“super(形参列表)”的方式,调用父类中声明的指定的构造器,若要使用则必须声明在子类构造器的首行
- 在构造器中,“this(形参列表)”,“super(形参列表)”两者不能同时出现;若都没有显式地声明,则默认调用的是父类中空参的构造器