目录,更新ing,学习Java的点滴记录
目录放在这里太长了,附目录链接大家可以自由选择查看--------Java学习目录
封装_含义和作用
- 封装是面向对象三大特征之一。对于程序合理的封装让外部调用更加方便,更加利于写作。同时,对于实现者来说也更加容易修正和改版代码。
- 看电视,只需要按一下开关和换台就可以了。有必要了解电视机内部的结构吗?有 必要碰碰显像管吗?制造厂家为了方便我们使用电视,把复杂的内部细节全部封装起来,只 给我们暴露简单的接口,比如:电源开关。具体内部是怎么实现的,我们不需要操心。
- 需要让用户知道的才暴露出来,不需要让用户知道的全部隐藏起来,这就是封装。说的 专业一点,
封装就是把对象的属性和操作结合为一个独立的整体,并尽可能隐藏对象的内部实现细节
。 - 我们程序设计要追求“
高内聚,低耦合
”。高内聚就是类的内部数据操作细节自己完成, 不允许外部干涉;低耦合是仅暴露少量的方法给外部使用,尽量方便外部调用。 封装的优点
:
提高代码的安全性。
提高代码的复用性。
“高内聚”:封装细节,便于修改内部代码,提高可维护性。
“低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。- 未进行封装的示例
如果没有使用封装的话,便可以给年龄赋值成任意的整数,这显然不符合我们的正常逻辑思维。如果使用封装,我们只需要稍微修改下 Person 类的 setAge()方法即可,而无需修改使用了该类的客户代码。后面会使用setter和getter实现对成员变量的封装效果.
封装的实现_四个访问控制符
- public,protected,包访问权限(default,没有关键字),private这几个Java访问权限修饰符在使用时,是置于类中每个成员的定义之前的—它是一个字段还是一个方法.每个访问权限修饰符仅控制它所修饰的特定定义的访问权.
- 各类修饰符访问范围
1.private 表示私有,只有自己类能访问
2.default 表示没有修饰符修饰,只有同一个包的类能访问
3.protected 表示可以被同一个包的类以及其他包中的子类访问
4.public 表示可以被该项目的所有包中的所有类访问 - 下面给出一个示例
首先我们创建 4 个类:Person 类、Student 类、Animal 类和 Computer 类,分别比较本类、本包、子类、其他包的区别。
1)public访问权限修饰符
2)protected访问权限修饰符:将 Person 类中属性改为 protected,其他类不修改。
3)默认访问权限修饰符:将Person类中的属性改为默认的,其他类不改变
4)private访问权限修饰符:将Person类中属性改为private,其他类不修改
- 关于protected的细节
1.若父类和子类在同一个包
中,子类可访问
父类的 protected 成员,也可访问
父类对象的 protected 成员。
2.若子类和父类不在同一个包
中,子类可访问
父类的 protected 成员,不能访问
父类对象的 protected 成员。
封装_get和set方法
- 封装的简单规则:
属性一般使用 private 访问权限
。
属性私有后, 提供相应的get/set 方法
来访问相关属性,这些方法通常是public 修饰的,以提供对属性的赋值与读取操作(注意:boolean 变量的 get 方法是 is 开头!)。
方法:一些只用于本类的辅助性方法可以用 private 修饰,希望其他类调用的方法用 public 修饰。 - 一个Person类的封装
package com.m1;
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
//不在构造器中直接赋值,而是调用对应setter方法
// this.name = name;
// this.age = age;
setName(name);
setAge(age);
}
//setter和getter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
//赋值之前进行合法性判断
if (age >130 || age<0){
System.out.println("输入年龄不合法!");
}else {
this.age = age;
}
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
- 封装优点:
1)提供属性对应的setter和getter方法,使得属性不会受到外界的直接影响
2)可以改变内部实现,除了该类的方法之外,不会影响其他代码
3)setter方法可以为我们执行错误检查,然而直接对域进行赋值将不会做这些处理