一、封装
引入
当创建完对象以后,如果直接通过“对象名.属性”的方式进行赋值的话,可能会出现不符合实际情况的值, 所以我们不考虑“对象名.属性名”的方式进行赋值,而是创建一个方法,通过“对象名.方法名”的方式进行赋值, 这样可以在方法里面写大量的业务逻辑限制属性值
1.什么是封装
把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性,java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
- 隐藏一个类中不需要对外提供的实现细节
- 使用者只能通过事先定制好的方法来访问数据,可以方便的加入控制逻辑,限制对属性的不合理操作
- 便于修改,增强代码的可维护性
- 安全性更好
注意:对封装的属性不一定要通过get/set方法,其他方法也可以对封装的属性进行操作。当然最好使用get/set方法,比较标准
优点:
- 增加内聚
- 降低耦合
- 提高代码复用性
2.给属性赋值的两种方式
通过set方法,如果有单个值需要更改用set方法
通过有参构造方法赋值,常用在同时给多个属性赋值的场合
3.this关键字
(1)为什么使用this关键字
当局部变量和成员变量重名是,方法会根据就近原则使用局部变量的值,如果想要区分局部变量和成员变量,可以使用this关键字
(2)格式:this.成员变量
(3)this可以修饰成员变量,成员方法,构造方法,修饰成员变量和成员方法的格式就是this.成员变量或成员方法
(4)this可以理解为当前使用的对象,或者正在创建的对象,谁调用了方法,谁就是当前使用的对象
(5)可以在构造方法中通过"this(形参)"的方法来调用本类中其他重载的构造方法
// 构造方法
public Person(){
//调用构造方法
this("张三");
System.out.println("Person无参构造方法执行了");
}
// alt+insert 创建构造方法或右键generate
public Person(String name) {
//调用构造方法
this("李四",12);
this.name = name;
System.out.println("Person带name的有参构造方法执行了");
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
注意:this必须声明在构造方法首行,如果一个类中有n个构造方法,那么最多有n-1个构造方法中使用this()
二、继承
1.什么是继承?
继承就是子类拥有父类的属性和行为,子类通过继承可以复用父类的代码
2.继承的优点和缺点
优点:提高了代码的复用性
缺点:类和类之间的耦合度变高了
3.语法
class 子类 extends 父类{}
4.继承的特点
(1)子类继承父类以后,父类声明的属性和行为子类都可以获取
(2) 子类除了通过继承获取了父类的属性和方法外,还可以自己定义独有的属性和方法(子类的功能比父类多)
(3)java是单继承的,一个子类只能继承一个父类,一个父类可以有多个子类。一个子类可以再派生一个子类,新派生的子类可以同时获取子类里面的独有属性和方法,还可以获取子类的父类的属性和方法
5.方法重写:如果父类的方法满足不了子类的要求,子类可以重写父类的方法
要求:(1)子类重写父类的方法,要求方法名、形参列表、返回值类别必须和父类一致
(2)子类重写的方法的访问修饰符权限不能低于父类的访问修饰符
(3)子类方法和父类方法必须同为静态的或者为非static的
三、多态
例如定义了一个人Person类,Student和Worker类,Student和Worker类继承Person类,创建一个Student对象 stu,此时stu既有学生的形态,又有人类的形态,这就叫对象的多态性(水的三态变化),多态的前提必须有继承和接口的实现
1.多态的理解
- (1)同一个动作作用于不同的对象产生不同的行为(多种形态)
- (2)多态就是一个对象的多种形态
- (3)允许将子对象赋值给父对象的一种能力
2.多态的实现方法
- (1)基于继承的实现,不同的子类重写了父类方法以后体现不同的形式
- (2)接口的实现
3.多态的条件
- (1)继承:子类去继承父类
- (2)重写:子类重写父类的方法
- (3)重载:同一个方法名,根据形参不同,实现的功能也不同
- (4)子类对象的多态性:父类的引用指向子类的实例
Pet p1= new Dog("泰迪","小泰");// 向上转型
p1.info();
4.程序分为两种状态,一种是编译状态,一种是运行时状态
- 对于多态来说,编译时看左边,会把p1看成pet类型
- 运行时看右边,真正执行的对象,也就是子类对象,执行的就是子类重写后的方法
5.向上转型和向下转型
- 向上转型:将子类对象交给父类的引用,可以自动类型转换
- 向下转型:把父类转成子类,需要强制类型转换
6.多态的类型
- (1)编译时多态:方法的重载(在编译期间,调用相同的方法名根据不同的参数列表确定调用的是哪个方法)
- (2)运行时多态:方法的重写(只有在运行期间才能确定使用的对象类型,才能确定变量的引用指向哪个实例)
- instanceof 运算符
用于判断类型是否匹配,是不是同一个类型或者是否存在继承关系
if(p1 instanceof Dog){
// p1是Dog类型
Dog dog2 = (Dog)p1;
dog2.sleep();
}else if(p1 instanceof Penguin){
Penguin pg2 = (Penguin)p1;
pg2.swimming();
}
7.supper关键字
supper关键字可以修饰属性、方法、构造方法
- 1.当子类和父类的属性名同名时,默认会使用子类的属性,可以通过super.属性名调用父类的属性
- 2.子类重写父类方法后,如果子类想再次调用父类重写前的方法,可以用super.方法名,调用父类重写前的方法
- 3.super修饰构造方法,通过在子类构造方法中使用super(形参)来显示的调用父类的构造方法
(1) super()必须放在构造方法的首行
(2) 在构造方法内部this(形参)或super(形参)只能出现一个
(3) 在构造方法中,如果显示的不使用super(形参)的方法调用父类对应的构造方法,默认会调用父类的构造方法,只是隐藏了
8.final关键字
final关键字代表最终的意思,可以修饰类、方法、成员变量、局部变量
- 修饰类,代表这个类是一个最终类,这个类不能被继承,但是可以继承别的类
- 修饰方法,就是一个最终方法,方法不能别重写
- 修饰成员变量,成员变量的值不可改变
1.成员变量不会再有默认值
2.如果加了final关键字,需要对成员变量直接赋值 - 修饰局部变量,局部变量就变成了常量,一旦赋值不可更改
9.static关键字
在java类中,可用static修饰属性、方法、代码块、内部类
(1)静态变量和实例变量
- 按照是否使用static进行修饰,可以分为:实例变量(创建完对象以后才可以使用)和静态变量
- 实例变量:创建了多少对象,每个对象都独立有一套类中非静态变量,当修改了其中一个对象的非静态变量时,不会导致其他对象同样属性的修改
- 静态变量:创建了多个对象,多个对象共享同一个静态变量,当其中一个对象对静态变量进行了修改,会导致其他对象同样的属性值的更改
(2)static 修饰属性
- 这个属性就不再属于对象了,而属于类本身,只要通过这个类创建的对象,都可以共享该静态变量
- 实例变量属于对象
- 静态变量是随着类的加载而加载,实例变量随着对象的创建而加载
- 静态变量的加载时机早于对象的创建
- 由于类只会加载一次,静态变量在内存中也只有一份
(3)static修饰方法
- 这个方法就不在属于对象了,而属于类本身
- 静态方法是随着类的加载而加载,通过 “类名.方法名” 的方式调用
- 静态方法中只能调用静态变量和静态方法,非静态方法可以调用静态方法和静态变量,也可以调用非静态方法和非静态变量
(4)代码块(初始化块)
- 代码块的作用就是初始化类、对象
- 代码块如果进行修饰只能通过ststic进行修饰
静态代码块
- 可以写输出语句
- 随着类的加载而执行
- 属于类
- 静态代码块的执行优于非静态代码块的执行
- 静态代码块里面只能调用静态变量和静态方法
- jdbc对数据库连接池进行初始化时会用到静态代码块
非静态代码块
- 可以写输出语句
- 随着对象的创建而执行
- 属于对象
- 创建几个对象,非静态代码块就加载几次
- 作用:可以在创建对象的同时,给对象的属性进行初始化
public class Animal {
String name;
int age;
static String desc = "动物";
// 非静态代码块
{
name = "小白";
age = 20;
System.out.println("非静态代码块");
}
// 静态代码块
static {
System.out.println("静态代码块");
}
}
10.问题
(1)在静态方法里面可以使用this和super关键字吗?
- 不可以,因为这两个关键字是有了对象以后才存在,静态方法早于对象的创建
(2)开发中,如何确定一个属性使用static进行修饰呢
- 如果一个属性需要被多个对象共享,使用static进行修饰
(3)开发中,如何确定一个方法使用static进行修饰呢
- 工具类会使用static进行修饰方法,比如jdbc工具类,collection连接对象
- 操作静态变量的方法,一般使用static进行修饰