面向对象
三大特征 :封装、继承、多态
类
public class 类名{
···
}
- 成员变量(代表属性,一般为名词)
- 成员方法(代表行为,一般为动词)
- 构造器
- 代码块
- 内部类
得到类的对象 :
类名 对象名 = new 类名();
使用对象 :
访问属性: 对象名.成员变量
访问行为: 对象名.方法名()
注意事项:一个Java文件中可定义多个class类,但只能有一个用public修饰
构造器
作用:用于初始化一个类的对象,并返回对象的地址。
格式:
public class Car{
public Car(){ //无参数构造器
}
public Car(String n,double p){ //有参数构造器
}
}
调用构造器得到对象:
类 变量名称 = new 构造器;
Car c = new Car();
Car c1 = new Car("奔驰",666);
分类和作用
- 无参数构造器(默认存在):初始化对象时,成员变量均为默认值
- 有参数构造器:初始化对象,同时接收参数为对象进行赋值
注意事项:
-
任何类一旦定义出来,默认就自带了无参数构造器
-
定义了有参数构造器后就没有了无参数构造器,需要自己手写一个无参数构造器
封装
定义:隐藏实现细节,暴露出合适的访问方式
原则:对象代表什么,就封装对应的数据,并提供数据对应的行为
更好地封装:
- 对成员变量使用
private
关键字修饰 ,(只能在当前类中进行访问) - 为每个成员变量提供配套public修饰的getter\setter方法暴露其取值和赋值
JavaBean
定义 :
- 成员变量使用
private
修饰 - 提供每一个成员变量对应的 setXxx()/getXxx()
- 必须提供一个无参构造器
成员变量与局部变量区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ECK9Nn4c-1657534196150)(C:\Users\hy020\AppData\Roaming\Typora\typora-user-images\image-20220709170620398.png)]
继承
格式
class 父类 {
}
class 子类 extends 父类 {
}
类型
- 单继承
- 多重继承
- 不同类继承一个类
- 多继承
特性
- 子类有父类非 private 的方法
- 子类可以有自己的属性和方法,对父类进行扩展
- 可以用自己的方式实现父类的方法(重写)
- Java为单继承,但是可以多重继承
- 提高了类之间的耦合性(缺点,使得代码的独立性变差)
关键字
extends
class 子类 extends 父类{
}
implements
使用该关键字可变相使 Java 具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口
public interface A {
public void eat();
public void sleep();
}
public interface B {
public void show();
}
public class C implements A,B {
}
this
- 可以出现在构造器、方法中,代表当前对象的地址
- 作用:访问当前对象的成员变量、成员方法
super
通过super来实现对父类成员的访问,来引用当前对象的父类
final
用来修饰变量,方法和类
- 修饰的类为最终类,不能被继承
- 修饰的方法不能被子类重写
构造器
- 父类的无参构造器:默认自动调用
- 父类的有参构造器:必须使用
super
调用
重写
子类对父类的方法进行重新编写,返回值和形参不能改变
好处 :可以根据需要来定制方法
要求 :不能抛出新的检查异常或者更多的检查异常
规则:
- 参数列表必须相同
- 返回类型可以不同, 但必须是父类返回值的派生类
- 访问权限不能比父类中的方法权限更低
- 父类成员方法只能被其子类重写
- final声明的方法不能重写
- 构造方法不能被重写
- 在一个包中子类可重写父类的所有方法,除了
private
和final
- 不在一个包中子类只能重写父类的
public
和protected
方法
重载
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
多态
存在的必要条件
- 继承
- 重写
- 父类引用 指向 子类对象
使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
实现方式
- 重写
- 接口
- 抽象类和抽象方法
抽象类与抽象方法
抽象类不能实例化对象,其他与一般类无异,只能通过继承实现抽象类。
抽象方法
public abstract class Employee
{
private String name;
private String address;
private int number;
public abstract double computePay();
//其余代码
}
注意 :
- 只有抽象类才能包含抽象方法
- 任何子类必须重写父类的抽象方法,或者声明自身为抽象类
- 继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类
必须有子类实现抽象方法,否则从父类到子类都不能实例化对象
规定
- 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
- 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
- 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
- 构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
- 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
接口
- 不是类,接口包含类要实现的方法
- 除非是抽象类,否则该类要定义接口中的方法
- 无法被实例化,可以被实现
- 可用来声明一个变量
特性
-
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
-
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
-
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
-
接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
-
接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
-
接口中的方法都是公有的。