类的封装
1、概念
封装是一种信息隐蔽技术。
一是把对象的属性和行为看成一个密不可分的整体,将这两者“封装”在一个不可分割的独立单位。二是指“信息隐蔽”把不需要让外界知道的信息隐藏起来,或是有些对象的属性及行为允许外界使用。
2.类的封装特性
(1)数据封装
数据封装是指将数据和操作数据的方法封装在一起,通过定义访问权限来保护数据,这样可以确保数据的安全性和一致性。在实际开发中,可以通过封装来隐藏对象的内部状态,只允许通过对象的方法来访问和修改数据,从而降低了对象之间的耦合性,提高了系统的可维护性和可扩展性。
(2)访问控制
访问控制是类的封装特性之一,通过访问修饰符来限制对类的成员的访问权限,实现了对类内部数据和方法的保护。这样可以避免外部的代码直接访问和修改类的内部数据,保证了数据的安全性和一致性。
(3)抽象
抽象是类的封装特性之一,通过抽象可以将具体的事物抽象成一个独立的实体,从而可以更加有效地管理程序。通过抽象,可以将共性的部分提取出来,形成一个抽象的类或接口,然后具体的实现可以根据需要进行扩展和改进,从而提高了程序的灵活性和可维护性。
(4)继承
继承是类的封装特性之一,通过继承可以将相关的操作封装放到基类中,然后子类可以继承基类的属性和方法,并根据需要进行相应的改进和扩展。这样可以减少代码的冗余,提高了程序的可复用性和扩展性。同时,通过继承可以构建类的层次结构,从而提高了代码的组织性和可读性。
this关键字
1、this是一个变量 ,一个引用。
his保存的就是当前对象的地址,指向对象本身,即this代表的就是“当前对象”。
2、this存储在堆内存中,存在于对象的内部。
3、this只能用在实例方法中,谁调用这个实例方法,this就是“谁自己”。
4、this不能出现在静态方法中,因为this代表当前对象,静态方法中不存在当前对象行调用会出现错误: 无法从静态上下文中引用非静态 变量 this
5、大多数情况下,this可以省略
构造方法
一、构造方法的概念
构造方法(也称为构造器)是一个特殊的成员方法。名字必须与类名相同,在创建对象时由编译器自动调用,并且在整个对象的生命周期内只调用一次。
二、构造方法特点
构造方法的名称必须与类名相同;
● 构造方法可以有0个、1 个或多个参数;
● 构造方法没有任何返回值,也不带void关键字;
● 构造方法不能被static、final、synchronized、abstract 和native修饰;
● 构造方法的默认返回类型就是对象类型本身;
● 构造方法只能与new运算符结合使用;
● 一个类中可以有多个同名的构造方法,但参数不同,即构造方法也可以被重载;
● 所有的类都有一个默认的构造方法。
类的继承
1、继承是面向对象的三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
继承是指在原有类的基础上,进行功能扩展,创建新的类型。
继承的优缺点
继承好处:
实现了数据和方法的共享
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
提高了代码的可扩展性
继承弊端:继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟看变化,削弱了子类的独立性
继承的格式
class 父类{
}
class 子类 extends 父类{
}
继承的注意事项:
1、在Java中, 类只支持单继承 ,也就是说一个类只能有一个直接父类
2、多个类可以继承一个父类 。
3、在Java中, 多层继承是可以的 ,即一个类的父类可以再去继承另外的父类。
抽象类与接口
一、抽象类的概念
在一个类中,含有的方法只有方法名,没有方法体的类,我们称之为抽象类。
认识抽象类
abstract class Shape {
public abstract void draw ();
}
抽象类和抽象方法的注意事项
1.抽象类和抽象方法都是使用abstract进行修饰的。
2.抽象类不能进行实例化,但是普通类是可以的。
3.抽象类当中 不一定包含抽象方法,但是包含抽象方法的类,一定是抽象类。
4.抽象类当中 可以定义成员变量和成员方法。
5.当一个普通类 继承我们的 抽象类了,此时在普通类当中一定要重写抽象类中的抽象方法。
6.抽象类存在的最大的意义 就是 为了被继承。
7.当一个抽象类A继承一个抽象类B,此时抽象类A不需要重写抽象类B中的成员,但是当一个普通类C,继承了抽象类A,此时就需要重写所有没有被重写的抽象方法。
8.一定要满足重写的要求。
9.final关键字 不可能同时作用在一个方法或者类上。
10.抽象类当中可以存在构造方法,在子类实例化的时候,会帮助父类的成员进行初始化。
二、接口的定义和使用
其实接口的定义跟类的定义差不多接口本质上来说也是一个类,接口就相当于一个公共规范,定义接口的关键字为interface,类和接口之间 使用关键字 implements来进行关联,先让我们用一段代码看一下接口的定义和类和接口的关联
定义接口样例:
interface A {// 定义了接口
public static final String MSG = "Hello";
public abstract void print();
}
接口的使用原则:
1、接口必须要有子类,但是此时一个子类可以使用implements关键字实现多个接口;
2、接口的子类(如果不是抽象类),必须要覆写接口中的全部抽象方法;
3、接口的对象可以利用子类对象的向上转型进行实例化操作。
接口中其他成员的特点:
1.接口中,无法定义成员变量,但是可以定义常量,其值不可以改变, 接口中常量默认使用public static final修饰
接口中的常量修饰符可以省略不写.不写默认也是public static final
常量的命名规则:所有的单词都要大写,多个单词之间可以使用下划线连接 AAA_BBB_CCC 定义一些常用的常量:
2.接口中,没有构造方法,不能创建对象。
3.接口中,没有静态代码块
类的多态
一、多态的概念
多态:通俗的来说就是多种形态,对于不同的情况,会产生不同的状态
二、多态的使用概念
1.必须在继承体系下,子类必须继承父类
2.子类必须要对父类中方法进行重写
3.通过父类的引用调用重写的方法
三、多态的两种形式–向上转型和向下转型
1、向上转型的特点和规则如下:
(1)子类对象可以隐式地转型为父类对象,不需要任何显式的类型转换操作。
(2)父类引用变量可以引用子类对象,但通过父类引用变量只能访问到子类对象中定义的父类成员,无法访问子类独有的成员。
(3)子类对象中重写的方法,在通过父类引用变量调用时,会调用子类中的实现(动态绑定)。
(4)向上转型是安全的操作,因为子类对象本身就是一个父类对象
2、向下转型的特点:
(1)只能强制转换父类的引用,不能强制转换父类的对象
(2)要求父类的引用必须指向的是当前目标类型的对象
(3)当向下转型后,可以调用子类类型中所有的成员
四、多态的优缺点
1、Java多态性的优点:
(1)灵活性和可扩展性:多态性使得代码具有更高的灵活性和可扩展性。通过使用父类类型的引用变量,可以以统一的方式处理不同类型的对象,无需针对每个具体的子类编写特定的代码。
(2)代码复用:多态性可以促进代码的复用。可以将通用的操作定义在父类中,然后由子类继承并重写这些操作。这样一来,多个子类可以共享相同的代码逻辑,减少了重复编写代码的工作量。
(3)可替换性:多态性允许将一个对象替换为其子类的对象,而不会影响程序的其他部分。这种可替换性使得系统更加灵活和可维护,可以方便地添加新的子类或修改现有的子类,而无需修改使用父类的代码。
(4)代码扩展性:通过引入新的子类,可以扩展现有的代码功能,而无需修改现有的代码。这种可扩展性使得系统在需求变化时更加容易适应和扩展。
2、Java多态性的缺点:
(1)运行时性能损失:多态性需要在运行时进行方法的动态绑定,这会带来一定的性能损失。相比于直接调用具体的子类方法,多态性需要在运行时确定要调用的方法,导致额外的开销。
(2)代码可读性下降:多态性使得代码的行为变得更加动态和不确定。在某些情况下,可能需要跟踪代码中使用的对象类型和具体的方法实现,这可能降低代码的可读性和理解性。
(3)限制访问子类特有成员:通过父类类型的引用变量,只能访问父类及其继承的成员,无法直接访问子类特有的成员。如果需要访问子类特有的成员,就需要进行向下转型操作,这增加了代码的复杂性和维护的难度。
类的高级特性
在 Java 类下,使用 { } 括起来的代码被称为 代码块
分类:
局部代码块 | 位置:方法中定义 作用:限定变量的生命周期,及早释放,提高内存利用率 |
构造代码块 | 位置:类中方法外定义 特点:每次构造方法执行的时,都会执行该代码块中的代码,并且在构造方法执行前执行 作用:将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性 |
静态代码块 | 位置:类中方法外定义 特点:需要通过static关键字修饰,随着类的加载而加载,并且只执行一次 作用:在类加载的时候做一些数据初始化的操作 |
同步代码块 |
内部类
概述:把类定义在另一个类的内部,将该类称之为内部类。
特点:1.内部类可以直接访问外部类的成员,包括私有成员。
2.外部类访问内部类的成员,必须先创建内部类对象。
分类:
1.成员内部类
2.局部内部类
匿名内部类
return new A(){
...//内部类体
};
其中,A指类名。在匿名内部类定义结束后,需要加分号进行标识,这个分号不代表内部类的结束,而是代表A引用表达式的创建。
实质上,这种内部类的作用就是创建一个实现与A接口的匿名类的对象。
静态内部类
静态内部类具有以下两个特点:
(1)创建静态内部类的对象,不需要其外部类的对象。
(2)不能从静态内部类的对象中访问非静态外部类的对象。