封装,继承
目录
面向对象封装,继承
1. 封装
1.1 广义的封装
一段代码出现三遍,封装一个方法
一组相关方法使用三遍,封装一个类
一个类使用三遍,完成完整的说明文档
一段文档在公司中流行三遍,发一篇博客
1.2 JavaBean规范封装实体类
1. 类内所有成员变量全部【私有化 private 修饰】
2. 必须提供无参数构造方法
3. 必须提供所有成员变量对应的 Setter 和 Getter 方法
【补充知识点 private 权限修饰符】
public:
公开的,public 修饰的成员变量和成员方法,可以在类外通过类对象直接操作和调用。
private:
私有化,private 修饰的成员变量和成员方法,类外没有操作权限,受保护!!!
1.4 Setter 和 Getter 方法
因为 成员变量要求全部私有化,导致成员变量操作不变。
Setter 用于赋值成员变量内容
格式:
public void set成员变量名称(对应成员变量数据类型参数) {
赋值语句
}
例如:
private String name;
public void setName(String name) {
this.name = name;
}
规范要求:
1. 方法必须 set 开头
2. 【严格遵守】小驼峰命名法,成员变量名称在和 set 整合为方法名时,首字母需要大写。
Getter 用于获取成员变量数据情况
格式:
public 对应成员变量数据类型返回值 get成员变量名称() {
return 成员变量;
}
例如:
private String name;
public String getName() {
return name;
}
规范要求:
1. 方法必须 get 开头
2. 【严格遵守】小驼峰命名法,成员变量名称在和 get 整合为方法名时,首字母需要大写。
注意:
Setter 和 Getter 不要加入其他任何内容!!!只作为成员变量赋值和取值操作。
package com.anno.a;
public class Person {
private String name;
private int age;
private char gender;
public Person() {
}
public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
2. 继承
2.1 开发中使用继承最多的场景
游戏开发:
LOL英雄有哪些属性???
血量,魔法值,攻击力,法术强度,移动速度,攻击距离,护甲,魔抗....
会将所有英雄共有特征,共有规范,在开发中做成一个基础模型,【基类】
可以在基类上进行增强或者删除,从而得到不同的一些内容,满足类型多样性,同时保证一致性。
2.2 Java 继承格式和关键字
关键字:
extends
格式:
class A extends B {
}
A 类是 B 类的一个子类
B 类是 A 类的【唯一】父类,java是一门单继承语言。
package com.anno.b_extends;
class Father {
/*
* public 修饰的 int 类型成员变量 num 默认值为 10
*/
public int num = 10;
/*
* private 修饰 私有化 成员变量 privateField 默认值为 20
*/
private int privateField = 20;
/*
* public 修饰公开方法 test
*/
public void test() {
System.out.println("public 修饰方法");
}
/*
* private 修饰私有化成员方法
*/
private void privateMethod() {
System.out.println("private 私有化方法");
}
}
/*
* Son 类是 Father 类的一个子类
* Father 类是 son 类唯一父类
*/
class Son extends Father {
}
public class Demo1 {
public static void main(String[] args) {
Son son = new Son();
/*
* public 修饰的成员变量子类可以通过继承得到,并且使用操作
*/
System.out.println(son.num);
/*
* The field Father.privateField is not visible
* Father 类内的 private 修饰成员变量 privateField 不可见
* 私有成员变量不可以通过继承给到子类使用,子类不能继承
*/
// System.out.println(son.privateField);
/*
* public 修饰的成员方法子类可以通过继承得到,并且使用操作
*/
son.test();
/*
* The method privateMethod() from the type Father is not visible
* Father 类内 privateMethod 成员方法不可见
* 私有化成员方法不可以通过继承给到子类使用,子类不可以继承
*/
// son.privateMethod();
}
}
2.3 继承特征【不懂就算了】
有其父必有其子
没你父母哪里来的你!!!
子类对象创建,一定有父类的参与,因为父类中的非私有化成员变量和成员方法可以提供给子类继承使用。
package com.anno.b_extends;
class Fu {
public Fu() {
System.out.println("父类构造方法执行");
}
}
class Ez extends Fu {
public Ez() {
System.out.println("子类构造方法执行");
}
}
public class Demo2 {
public static void main(String[] args) {
/*
* 1. 构造方法做了哪些事情???
* a. 创建对象过程中,提供给 new 关键字当前对象的数据类型,构造方法的名称就是类名
* 【构造方法没有创建对象的能力】有且只能和 new 关键字组合创建对象。
* b. 构造方法用于初始化成员变量数据内容。
*/
/*
Fu fu = new Fu();
System.out.println(fu);
com.anno.b_extends.Fu@15db9742
com.anno.b_extends 包名
Fu 类名
@15db9742 类对象所在内存空间地址
【后期明确一个类,需要完整的包名.类名】
*/
Ez ez = new Ez();
/*
父类构造方法执行
子类构造方法执行
请问 是否存在 new + 父类构造方法出现???
没有
当前情况下不存在【父类对象】
父类构造方法执行 到底执行的什么内容,做了什么操作???
子类可以通过继承得到父类【非私有化】成员变量和成员方法,父类中的成员变量和成员变量,严格来说
是属于父类内容。这部分父类内容应该通过父类的方式进行初始化或者准备工作,这些工作需要
【父类构造方法】完成
*/
}
}
2.4 重写
package com.anno.b_extends;
class Daddy {
public void work() {
System.out.println("机械工程师");
}
public void game() {
System.out.println("黄金矿工");
}
}
/*
* 为了降低开发压力,提高开发效率!!!在不修改【方法声明】情况下,单独修改方法体内容
* 满足子类特征需求,降低方法记忆压力,降低代码冗余度,提高开发效率
* 【后期同名方法众多,需要明确方法的执行者是谁!!!】
*
* @Override 注解!!!注释+解释,开启重写代码声明格式严格检查
*
* 重写
* 1. 子类方法声明和父类完全一致,降低开发压力,提高开发效率
* 2. 子类方法体内容,按照子类所需,完成方法体
*/
class Boy extends Daddy {
@Override
public void work() {
System.out.println("IT讲师");
}
@Override
public void game() {
System.out.println("World Of Tank 老男人的游戏");
}
}
public class Demo3 {
public static void main(String[] args) {
Boy boy = new Boy();
boy.game();
boy.work();
}
}