是一种屏障,作用为防止对象数据被外界任意访问
可以选择性的为私有化属性提供getter、setter方法,但是通常情况下,都需要具备。
属性封装后,无法通过(对象名.属性名)方式访问属性,需要通过调佣方法实现。
语法: 取值:对象名.getXxx() 、 赋值:对象名.setXxx(实参);
控制内容可被访问的范围
| 本类 | 同包 | 非同包子类 | 非同包非子类 | |
|---|---|---|---|---|
| private(私有的) | √ | |||
| default(默认的) | √ | √ | ||
| protected(受保护的) | √ | √ | √ | |
| public(公开的) | √ | √ | √ | √ |
实际开发中,类与类之间代码会出现冗余,处理方式为将重复代码提炼至第三个类,书写双方之间的继承关系
将子类的共性内容进行抽取,生成父类,建立在继承关系下,子类可以继承拥有父类所有可被继承的内容。
public class 子类类名 extends 父类类名{
}
在继承关系下,如果子类不满足于父类提供的方法实现,则可以选择对方法实现进行重写
子类对父类中继承过来的方法进行方法体的重写,简称方法重写
方法名、参数列表、返回值类型必须与父类保持一致
访问修饰符必须与父类相同或者更宽
不允许抛出比父类更大或更多的异常
方法重写后,子类对象会优先执行自身重写之后的内容
父类的作用:
1. 解决子类之间的代码冗余问题
2. 强制子类拥有某些内容
子类的内存空间由父类内容+独有内容构成
父类将属性封装之后,子类无法直接通过对象名.属性名的方式直接访问父类声明属性,必须通过对象名.getter()|对象名.setter()的形式对属性进行访问
代表父类对象
作用为调用父类构造内容
- 1. 父类中正常声明有参构造
- public class Animal {
- //特征:名字、年龄、性别
- private String name;
- private int age;
- private String sex;
-
- public Animal(){}
- public Animal(String name,int age,String sex){
- System.out.println("正在执行animal有参构造...");
- this.name = name;
- this.age = age;
- this.sex = sex;
- }
-
- //getter、setter方法
- ...
- //行为:吃饭、睡觉
- ...
- }
- 2. 子类书写有参构造,将希望赋值的形参正常声明,内部调用super()利用对应的父类有参构造实现赋值
- public class Dog extends Animal{
- public Dog(){}
- public Dog(String name,int age,String sex){
- //调用父类中的有参构造方法为父类中声明的属性赋值
- super(name,age,sex);
- }
- }
指明调用父类属性或方法
- super.属性名
- super.方法名(实参)
父类属性封装后,无法通过super.属性名调用父类属性
给父|子类属性分配空间,赋默认值
给父类属性赋初始值
执行父类构造再次赋值
给子类属性赋初始值
执行子类构造再次赋值
父类引用的多种具体值的不同形态
父类引用可以指向不同的子类对象
语法:
- 父类引用名=子类对象;
- 父类类名 引用名=new 子类类名();
父类引用=子类对象;
子类类型=(子类类型)父类引用;
子类类名 引用名=(子类类名)父类引用名;
1. 用于容器:将容器(变量、数组、集合等)类型声明为大类型,则内部可以存放不同的小类型对象
2. 用于参数:将方法形参类型声明为大类型,则传入实参时可以为不同子类对象
3. 用于返回值:将方法返回值类型声明为大类型,则可以实际return不同的子类对象
( 接收返回值时,也应该使用父类引用类型接收)
判断引用是否与指定类型兼容
语法:引用名 instanceof 类名
子类对象可以被父类类型兼容
父类对象无法被子类类型兼容
同级子类之间无法兼容
大类型可以兼容小类型,但是小类型无法兼容大类型
更加贴合现实逻辑
提高代码扩展性
减少代码冗余