Java面向对象编程篇2——面向对象三大特点
1、封装
1.1、封装的概念
通常情况下可以在测试类给成员变量赋值一些合法但不合理的数值,无 论是编译阶段还是运行阶段都不会报错或者给出提示,此时与现实生活不符
为了避免上述错误的发生,就需要对成员变量进行密封包装处理,来隐 藏成员变量的细节以及保证成员变量数值的合理性,该机制就叫做封装
1.2、封装实现流程
-
私有化成员变量,使用private关键字修饰
-
提供公有的get和set方法,并在方法体中进行合理值的判断
-
在构造方法中调用set方法进行合理值的判断
2、继承
2.1、继承的概念
- 当多个类之间有相同的特征和行为时,可以将相同的内容提取出来组成 一个公共类,让多个类吸收公共类中已有特征和行为而在多个类型只需 要编写自己独有特征和行为的机制,叫做继承。
- 在Java语言中使用extends(扩展)关键字来表示继承关系。
- 使用继承提高了代码的复用性,可维护性及扩展性,是多态的前提条件。
public class Worker extends Person{} - 表示Worker类继承自Person类
其中Person类叫做超类、父类、基类。
其中Worker类叫做派生类、子类、孩子类。
2.2、继承的特点
- 子类不能继承父类的构造方法和私有方法,但私有成员变量可以被继承 只是不能直接访问
- 无论使用何种方式构造子类的对象时都会自动调用父类的无参构造方法, 来初始化从父类中继承的成员变量,相当于在构造方法的第一行增加代 码super()的效果
- 使用继承必须满足逻辑关系:子类 is a 父类,也就是不能滥用继承
- Java语言中只支持单继承不支持多继承,也就是说一个子类只能有一个父 类,但一个父类可以有多个子类
3、多态
3.1、多态的概念
- 多态主要指同一种事物表现出来的多种形态
- 饮料:可乐、雪碧、红牛、脉动
- 宠物:猫、狗、鸟、小强、鱼
- 人:学生、教师、工人、保安
- 图形:矩形、圆形、梯形、三角形
3.2、多态的格式
父类类型 引用变量名 = new 子类类型();
3.3、多态的特点
- 当父类类型的引用指向子类类型的对象时,父类类型的引用可以直接调 用父类独有的方法
- 当父类类型的引用指向子类类型的对象时,父类类型的引用不可以直接 调用子类独有的方法
- 对于父子类都有的非静态方法来说,编译阶段调用父类版本,运行阶段 调用子类重写的版本(动态绑定)
- 对于父子类都有的静态方法来说,编译和运行阶段都调用父类版本
3.4、多态的意义
多态的实际意义在于屏蔽不同子类的差异性实现通用的编程带来不同的效果
4、构造方法
.构造方法名与类名完全相同并且没有返回值类型
4.1、构造方法作用
使用new关键字创建对象时会自动调用构造方法实现成员变量初始化工作
4.2、构造方法格式
class 类名 {
类名(形参列表) {
构造方法体;
}
}
4.3、构造方法注意事项
- 当一个类中没有定义任何构造方法时,编译器会自动添加一个无参空构 造构造方法,叫做默认/缺省构造方法,如:Person(){}
- 若类中出现了构造方法,则编译器不再提供任何形式的构造方法。
5、方法重载与方法覆盖重写
5.1、方法重载
与参数列表的数量、类型和顺序有关,与修饰符和返回值类型以及抛出异常类型无关
在一个类中为一种行为提供多种实现方式并提高可读性
public class Test3 {
public int add(int a,int b){
return a+b;
}
public int add(int a,int b,int c){
return a+b+c;
}
}
5.2、方法覆盖重写
父类方法无法满足子类的要求,子类通过方法重写满足需求
public class Test4 {
public int add(int a,int b){
return a+b;
}
}
class Test5 extends Test4 {
@Override
public int add(int a, int b) {
return a-b;
}
}
6、方法递归
6.1、递归的概念
方法自己调用自已
6.2、递归三要素
- 一定有一种可以退出程序的情况;
- 总是在尝试将一个问题化简到更小的规模
- 父问题与子问题不能有重叠的部分
6.3、递归范例
public class Test6 {
public static void main(String[] args) {
System.out.println(add(100));
}
public static int add(int a){
if (a!=1){
return a+add(a-1);
}else{
return 1;
}
}
}
7、访问权限
访问权限 | 本类 | 本包的类 | 子类 | 非子类的外包类 |
---|---|---|---|---|
public | 是 | 是 | 是 | 是 |
protected | 是 | 是 | 是 | 否 |
default | 是 | 是 | 否 | 否 |
private | 是 | 否 | 否 | 否 |
- public: 所修饰的类、变量、方法,在内外包均具有访问权限;
- protected: 这种权限是为继承而设计的,protected所修饰的成员,对所有子类是可访问的,但只对同包的类是可访问的,对外包的非子类是不可以访问
- 包访问权限(default): 只对同包的类具有访问的权限,外包的所有类都不能访问;
- private: 私有的权限,只对本类的方法可以使用;
8、static关键字
static是不允许用来修饰局部变量
8.1、static方法
static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
public class Test7 {
public static void main(String[] args) {
Test8.sleep();
}
}
class Test8{
public static void sleep(){
System.out.println("sleep~");
}
}
8.2、sattic变量
static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
static成员变量的初始化顺序按照定义的顺序进行初始化
8.3、static代码块
static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
private static Date startDate,endDate;
static{
startDate = Date.valueOf("2000");
endDate = Date.valueOf("2021");
}
9、final关键字
9.1、修饰类
当用final修饰一个类时,表明这个类不能被继承。
9.2、修饰方法
类的private方法会隐式地被指定为final方法
方法无法被覆盖重写
9.3、修饰变量
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象,但其属性仍可以更改。
9.4、final注意事项
- 当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。
- static作用于成员变量用来表示只保存一份副本,而final的作用是用来保证变量不可变。