面向对象
面向对象编程思想
Object Oriented Programming 简称OOP
是当前主流的编程思想,将解决问题的所有参与对象创建出来,赋予对象对应的行为和属性
类Class
具有相同的属性和行为的对象的集合。类也可以称为模板。
属性:描述对象的特征,在程序中,通过定义变量的形式表现属性。
行为:描述对象的动作,在程序中,通过定义方法的形式表现行为。
定义类
[修饰符] class 类{
//属性,定义变量
//行为,定义方法
}
对象Object
对象是类的一个具体实例,是类的具体表现。
创建对象:类名 对象名=new 构造方法(参数);
创建好的对象,使用.点操作符访问类中的非私有属性和方法
类和对象的关系
对象是类的具体表现,类是对象的合集(模板)。
成员变量、局部变量、静态常量
成员变量:
定义在类中的变量,称为成员变量,拥有默认值。
局部变量:
定义在方法中的变量,称为局部变量,没有默认值,赋值后才能使用
静态常量:
特殊的成员变量,使用范围在该类中,用static和final修饰,它通常需要在定义时赋值,在类加载时就创建,通过类名方法。
成员变量相关问题
简述成员变量和局部变量的区别以及生命周期
**区别:**成员变量定义在类中,有默认值。局部变量定义在方法中,没有默认值
**生命周期:**成员变量的生命周期:随着类创建对象,成员变量初始化,该对象回收,成员变量销毁局部变量的生命周期:随着方法调用,局部变量初始化,方法调用结束,局部变量销毁
构造方法
**是一个特殊的方法,没有返回值,方法名和类名一致。**每个类在定义时,都有一个默认隐藏的无参数的构造方法,在创建对象时自动调用,通常用于初始化成员变量。
特点
-
没有返回值(没有返回值,并不是void),方法名和类名必须相同
-
每个类默认有一个无参数的构造方法,方法体中没有内容
-
构造方法不能通过.操作符调用,在创建对象时自动调用,所以通常用于初始化成员变量
-
如果自己写了有参的构造方法,默认无参的构造方法就会失效,如果想要使用无参的构造方法,需要再写出来才能使用
-
构造方法可以限制创建对象时的参数
-
可以同时存在多个不同参数的构造方法,这称为构造方法的重载
面向对象的三大特性
封装
使用private关键字对属性进行修饰,可以防止除自身类之外的地方对该属性进行访问。
这样可以保护关键属性,隐藏类内部的实现细节,再对外提供一组公开的get/set方法用于对该属性的赋值和读取。
步骤
-
给类中的所有属性添加private修饰符
-
给每个属性定义setXX()方法用于赋值
-
给每个属性定义getXX()方法用于读取属性
继承
类A可以通过extends关键字继承类B。
**语法:**class 类A extends 类B
类A称为子类、派生类、衍生类、subClass
类B称为父类、基类、超类、superClass
特点:
-
不同的子类中相同的代码,都可以定义在父类中,减少子类中的代码冗余。
-
子类对象可以直接访问父类中非私有的属性和方法。
-
子类可以对父类中的方法进行拓展或覆盖,这称为方法重写,重写后,子类对象再调用该方法时,执行的是重写后的内容。
-
java中是单继承,一个子类只能有一个父类,一个父类可以有多个子类。
-
java中可以多重继承,类A可以继承类B,类B也可以继承类C,这时类A可以访问类B和类C中非私有的成员。
-
任何类都是Object类的子类。
-
在创建子类对象时,先执行父类中相应的构造方法。
重写override
当子类继承父类后,可以对父类中非私有的方法进行拓展。这个行为称为方法重写。
重写用于子类拓展父类的某个方法。
要求:
-
方法名、参数列表、返回值必须和父类一致
-
访问权限不能比父类更严格
-
不能抛出比父类更大的异常
重载overload
在一个类中,如果多个方法的方法名相同,参数列表不同(参数类型不同或参数数量不同)时,这些方法称为重载的方法。同名不同参。
重载用于在一个类中,某个方法在不同的条件下,执行不同的内容。
要求:
-
方法名相同
-
参数列表(参数类型和数量)不同
重载和重写相关问题
问:构造方法能重载吗?能重写吗?
答:构造方法能重载不能重写
问:构造方法执行时,一定创建对象吗?
答:不一定。创建子类时自动调用父类构造方法,不创建父类对象。
多态
需要使用一个父类对象时,实际传递的是一个子类对象,这时可以将子类对象当做父类对象使用。这种特性称为多态。
实现前提:
- 必须是继承关系
- 子类的对象保存到父类的变量中,子类通常会重写父类的方法
父类 对象 = new 子类();
this和super
都可以当做对象或构造方法使用。
**当做对象:**this表示当前类的对象,super表示当前类的父类对象
this或super当对象时,只能用在非静态方法中。
**当做构造方法:**this()表示当前类的无参构造方法,super()表示当前类的父类的无参构造方法
this或super当构造方法时,只能放在另一个构造方法的第一行。
每个继承关系中,如果父类和子类都没有重载构造方法时,子类里都有一个默认无参的构造方法,其中在调用父类的无参的构造方法
如果重载了父类的构造方法,在子类的构造方法中,一定要调用父类的某个重载的构造方法
Object类
是所有类的根类。任何类都直接或间接的继承了该类,但没有显式地写出来。所有类都可以调用或重写Object类中的方法。
重写toString()方法
在输出某个类的对象时,会自动调用该方法。该方法在Object类
中,默认输出"该对象的所在类全限定名@十六进制哈希码",通
常会重写该方法。
对象造型
类似于原始类型之间的数据类型转换。
向下转型
在有继承关系的两个类中,父类对象可以强行保存到子类变量中。
向上转型
在有继承关系的两个类中,子类对象可以直接保存到父类变量中。
重写equals()方法
equals()是比较两个对象是否相同的方法,默认Object中使用==比较,所以自定义类后,如果要比较该类的对象,一定要重写equals方法和hashcode方法,根据指定参数比较两个对象是否相同。
final
是一个关键字,通常用户修饰类、方法和属性。
**修饰类:**类不能被继承。
**修饰方法:**方法不能被重写。
**修饰属性:**变量变为常量,不能改变其值。
final、finally、inalize的区别
final是一个修饰符,用于修饰类、方法和属性,表示最终的,不可改变。
finally是一个关键字,在处理异常时,用于一定执行一段代码。
try{
//有可能抛出异常的代码
}catch(异常类型 异常变量){
//如果抛出的异常和catch后的异常匹配,则执行的代码 }finally{
//一定执行的一段代码
}
finalize是一个方法名,即finalize()方法,属于Object类。在某个对象被垃圾回收机制GC当做垃圾处理时调用。
abstract
是一个修饰符,用于修饰方法或类。
修饰方法
用法:访问修饰符 abstract 返回值 方法名(参数列表);
修饰方法,该方法称为抽象方法,没有方法体,同时该方法所在类一定也要使用abstract修饰成为抽象类。
修饰类
如果一个类中有抽象方法,该类一定得是抽象类。
用法:访问修饰符 abstract class 类名**{}**
特点:
-
抽象方法只能出现在抽象类中,不能出现在普通类中。
-
抽象类中可以没有抽象方法
-
抽象类中有构造方法,但该构造方法不能使用new调用,所以抽象类不能创建对象
-
抽象类中的构造方法,在创建其子类对象时自动调用
-
抽象类通常需要被继承,继承后子类一定要重写抽象类中的所有抽象方法
interface
用于定义接口的关键字,代替原本的class。
定义接口:访问修饰符 interface 接口名{}
由于java是单继承,如果类A想要继承多个"父类"中的内容时,就不能使用extends,但可以使用implements实现多个接口而达到多继承的目的。
接口是一个完全抽象类,其中的方法都是被public abstract修饰的公开抽象方法,其中的属性,都是被public static final修饰的公开的静态常量,需要在定义时赋值才能使用。
接口和抽象类一样,通常需要子类继承,但继承接口,称为"实现接口"。使用implements关键字实现。
static
可以修饰方法和属性,表示该方法或属性是静态的,在类加载时保存到内存中,无需对象参数,直接通过类名就能访问。
如果某个属性或方法被高度重用时,可以将其定义为静态的,之后直接通过类名调用。
还可以在类中定义静态代码块static{}。在类加载时自动执行的代码块。
难点
1.多态特性的应用
2.重写和重载方法的应用
3.抽象方法
4.static的使用