一、概述
面向对象:
就是不断的创建对象、使用对象、指挥对象做事情的思想
二、类和对象的关系
1、类:
是Java的基本单位,主要是用于描述现实生活的事物,包含了成员变量(属性)、成员方法(行为)、和构造方法。
2、对象:
语句定义格式:类名 对象名 = new 类名();
对象可以看作是一个类的具体的实例,通过一个类构造多个不同的对象。
3、对象访问成员的方式:
①访问成员变量:对象名.成员变量名
②访问成员方法:对象名.成员方法名(XXX)
三、三大特征
1、封装
封装就是隐藏类中实现的细节,对外提供公共的方法。
关键字:
private :是一种私有的权限修饰符,可以修饰成员变量、成员方法和构造方法。被private修饰的成员变量只能在本类中被访问。
this :用于方法中,表示调用当前该方法的对象,访问成员时通过this.(成员)
static :静态修饰符,可以修饰成员、成员方法、静态代码块和静态内部类。
static的特点:
①、可以直接通过类名的方式访问静态的成员变量和成员方法。
②、随着类的加载而加载,优先于对象而存在。
③、被static修饰的成员,称之为类成员。
④、静态的成员方法只能访问静态的成员(静态的成员变量或者静态的成员方法)。
⑤、非静态的成员方法既可以访问静态的成员,也可以访问非静态的。
⑥、静态的成员既可以通过类名直接访问,也可以通过所属类的对象来访问,推荐使用类名访问。
构造方法:
构造方法是在创建对象时,通过构造方法在堆内存中为该对象开辟空间。
语句定义格式:方法名和类名一样,没有返回值类型。
构造方法的特点:
1、构造方法可以发生重载,构造方法可以传入参数,在创建对象的同时给对象的成员变量赋值。
2、如果我们不提供构造方法,jvm会在编译的时候提供一个默认的无参无具体实现的构造方法,若我们自己提供了构造方法,系统都不会再提供默认的构造方法。
一个对象初始化的过程(Student s1 = new Student())
1、先将Student类加载到方法区中。
2、在栈中为s1变量开辟空间。
3、在堆内存中为s1对象开辟空间。
4、给成员变量赋予系统默认值。
5、显示初始化。
6、构造方法初始化。
7、将堆内存中的对象地址值赋值给栈中的变量s1。
8、后续可以通过方法对成员变量再进行修改值 。
代码块:
1、局部代码块:在方法内部仅使用大括号括起来的代码块叫做局部代码块。
2、构造代码块:写法和局部代码块写法一样,只是写的位置位于类中方法外,没创建一次,都会执行一次。
3、静态代码块:写法在大括号前加上static,写在类中方法外,只会在类加载的时候,仅执行一次 。
4、同步代码块:属于类中的成员,类似于方法,将逻辑语句分装在方法体中,通过大括号括起来。
引用数据类型和基本数据类型当做参数
①、当基本数据类型作为方法的参数类型的时候,将来调用时需要传入具体的数值。
②、当引用数据类型作为方法的参数类型的时候,将来调用时需要传入该引用数据类型的对象。
2、继承
继承就是将多个类中相同部分提取到一个类中,然后与这个类产生继承关系,就拥有了这个类中的成员 。
关键字:
extends : 继承
语句定义格式:
class A extends B {}
A:子类、派生类
B:父类、基类、超类
继承使用注意事项:
①、类与类之间只能单继承,不能多继承。
②、可以多层继承,形成继承体系。
③、子类只能继承父类中非私有的成员。
④、子类无法继承父类的构造方法,但是可以使用。
⑤、子类无法继承父类中的静态成员,但是可以使用。
⑥、要想初始化子类,必须先初始化其父类。
super :代表的是直接父类的引用,可以在子类中使用直接父类的成员
super注意事项:
①、针对在子类中使用super调用父类的构造方法的时候,子类的构造方法默认第一句话是super()。
②、若父类中没有无参构造方法,可以使用super显示地调用父类的有参构方法进行初始化 。
final :最终的、不可改变的。可以修饰类、成员方法、变量
修饰类时类无法被继承、修饰成员方法时成员方法无法被重写、修饰变量时变量值无法更改,变量变常量。
final的初始化时机:必须在构造方法完成之前赋值。
重写: 发生在继承关系中,子类的方法名,返回值类型,参数列表,都与父类的一样,只是方法体实现不一样,可以使用@Override来验证
重写的注意事项:
①、子类无法重写父类中私有的成员方法,静态的成员方法。
②、子类重写的方法权限修饰符不能比父类的还要低,无特殊要求的话,和父类的权限保持一致。
3、多态
多态是指某一事物在不同状态下的多种形态。
实现多态的三个前提:
①、要有继承关系。
②、要有方法的重写。
③、要有父类的引用指向子类对象。
访问成员的特点:
①、访问成员变量时,编译看左运行看左。
②、访问成员方法时,编译看左运行看右。
③、访问静态成员方法时,编译看左运行看左。
多态的好处:
①、提高了程序的维护性(继承)
②、提高了程序的扩展性(多态)
多态的弊端:
①、在多态的形式下,无法使用子类中特有的成员方法(解决方案:向下转型)。
②、向下转型可能会遇到的问题。ClassCastException 类转换异常。
四、抽象类
使用abstract关键字进行修饰 ,是用来描述现实生活中抽象的概念集合。
特点:
1、abstract可以修饰类和成员方法。
2、一个抽象类中,既可以存在抽象方法,可以存在具体的实现方法。
3、当一个类中有抽象方法的时候,这个类必须是抽象类。
4、抽象类可以继承抽象类,可以选择性地重写方法。
5、具体的类继承抽象类的时候,必须要重写所有的抽象方法。
6、抽象类不能实例化。
五、接口
主要是用来描述事物额外的扩展功能的作用
关键字:interface
特点:
1、接口中只有常量,所有的变量将来默认会使用public static final进行修饰。
2、接口中只允许出现抽象方法,所有的方法将来默认会使用public abstract进行修饰。
3、具体类实现接口使用implements关键字,当具体的类实现接口的时候,必须要实现接口中所有的抽象方法。
4、一个类可以同时实现多个不同接口。
5、接口与接口之间的关系是继承关系,一个接口可以同时继承多个接口。
6、接口无法实例化。
六、形式参数和返回值类型的对比
1、形式参数
①、当你看到一个类作为方法参数类型的时候,将来调用时需要传递该类及其该类的子类对象。
②、当你看到一个抽象类作为方法的参数类型的时候,将来调用时需要传递继承该抽象类的具体子类对象。
③、当你看到一个接口作为方法参数类型的时候,将来调用时需要传递实现该接口的具体子类对象。
2、返回值类型
①、当你看到一个类作为方法的返回值类型的时候,将来方法内部应该返回该类或该类的子类对象。
②、当你看到一个抽象类作为方法的返回值类型的时候,将来方法内部应该返回继承该抽象类的具体子类对象。
③、当你看到一个接口作为方法的返回值类型的时候,将来方法内部应该返回实现了该接口的具体子类对象。
七、内部类
1、成员内部类
将类定义在类中的成员的位置上
形式1:没有使用static或者private关键字修饰
外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
形式2:使用static关键字修饰
外部类名.内部类名 对象名 = new 外部类名.内部类名();
形式3:使用private关键字修饰
外界使用不到,只能在类中使用
2、局部内部类
将类定义在方法的内部
特点:
①、只能在方法的内部中进行使用。
②、方法定义的局部变量,在局部内部类中是不能进行修改的,默认是会被加上final关键字。
八、匿名内部类
语句定义格式:new 抽象类/接口/类(){
//重写方法
}