1. 掌握什么是封装
**一个好的系统:**高内聚、低(松)耦合(功能之间相互独立,没有影响,不会牵一发而动全身)。
世界上没有完美的系统,只有接近完美的系统。
封装的作用(为什么需要封装):
如果没有封装,那么一个类中属性,可能会出现不合理赋值。
便于使用者正确使用系统,防止错误修改属性
有助于系统之间的松耦合,提高系统独立性
提高软件的可重用性
降低了构建大型系统的风险
**封装的定义:**将类的信息隐藏在类的内部,不允许外部程序直接访问,而是通过类提供的公开的便捷的接口来进行访问赋值等。
原则:尽可能多的隐藏信息,提供公开的接口来访问。
2. 掌握如何使用封装
/**
* 一个类的封装过程:
* 1.属性私有化
* 2.提供公共的getter/setter方法
* 3.在getter/setter方法中添加控制语句(根据需求)
* @author Charles7c
* 2019年1月14日 上午9:55:55
*/
public class Monkey {
// 1.属性私有化-隐藏类信息 除了自己这个类 其他的外部类都无法直接访问
private String name;
private int health;
private int love;
// 2.提供公共的getter/setter方法-用于外部访问操作(便捷的接口)
// name的setter方法
public void setName(String name) {
this.name = name;
}
// name的getter方法
public String getName() {
return this.name;
}
public int getHealth() {
return health;
}
// 3.根据你的【实际需求】 去在对应的getter/setter方法中添加控制语句
public void setHealth(int health) {
if(health < 0 || health > 100) {
System.out.println("健康值非法!已经设置为默认值60!");
this.health = 60;
}else {
this.health = health;
}
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
}
在何处使用继承:
1:继承与真实世界类似
1:符合is-a关系的设计使用继承
2:继承是代码重用的一种方式
1:将子类共有的属性和行为放到父类中
理解继承:
1:继承public 和Protected修饰的属性和方法,不管子类和父类是否在相同的包里。
2:继承默认权限修饰符修饰的属性和方法,但子类和父类必须在一个包里。
以下是不能被继承的父类成员
1:privaate成员
2:子类和父类不在同包,使用默认访问权限的成员
3:构造方法
4:子类不能继承父类的构造方法 但是能调用父类的构造 方法
继承条件写的构造方法:
1:继承条件写构造方法的调用规则
1:子类构造方法没有通过super显示调用父类的有参构造方法, 系统默认调用父类的无参构造方法
2:子类构造方法通过super显示调用父类的有参构造方法
1:执行父类相应构造方法,而不执行父类无参构造方法
java中支持单根继承,一个子类只能有一个父类。
在设计使用继承时,尽量符合is-a的关系。
父类私有的 子类没有办法继承。
父类不是所有的内容都能被子类所继承
1:父类私有的(private修饰的)
2:父类的构造方法不能被继承
3:如果父类和子类不是在同一个包中 那么父类中的默认修饰符修饰的内容 不能被继承
执行流程的特点
1:子类的构造方法中,如果没有显示的去调用父类的构造或者自己其他构造:系统默认调用 父类的无参构造
this:当前对象,谁在调用这个方法谁就是对象
this();调用自己的构造
this.方法();:调用自己的方法
this.成员变量:调用自己的属性
super:父类的对象 谁是它的父类 这个对象就属于谁
super();调用父类的
单根继承:
1:java只支持单根继承
2:一个类只有一个直接父类
3:一个类可以有多个间接父类
## 4. 访问修饰符的使用
**private:**最严格的访问级别,只能在本类中使用。
**什么都不写(默认):**同包之间可以随意访问。
**protected:**// 一会讲完继承说
**public:**在整个项目都能使用
| 作用域 修饰符 | 同一个类中 | 同一个包中 | 子类中 | 任何地方 |
| --------------- | :--------: | :--------: | :----: | :------: |
| private | √ | | | |
| 默认修饰符 | √ | √ | | |
| protected | √ | √ | √ | |
| public | √ | √ | √ | √ |
**访问修饰符:**可以用来修饰类、修饰属性、修饰方法。
**作用:**为了隐藏某些细节,或者公开某些内容,控制访问权限。
## 5. static关键字
**static可以修饰变量:**静态变量/类变量
**static也可以修饰方法:**静态方法/类方法
**static也可以修饰代码块:**静态代码块
```java
public class Dog {
// 成员代码块/构造代码块/非静态代码块:会随着对象的创建而执行里面的代码片段(创建一次对象就执行一次) 它优先于构造方法执行
{
}
// 静态代码块:会随着类的加载而执行里面的代码片段(只会执行一次)
static {
}
}
static修饰的类信息等和普通的成员(实例/对象)信息等的区别:
- 生命周期不同类信息随着类加载而创建实例信息随着对象产生而创建
- "作用域"不同类信息被该类的所有的对象共享,只要有一个对象更改,所有的对象获取的结果都会变化。实例信息仅仅被自身对象所使用,不同对象之间的实例信息相互独立存在。
- 调用上有所不同实例信息必须通过先创建对象,然后才能使用类信息,直接可以用类名.的形式调用(当然也可以用对象来调用)
注意事项:
- 如果在多个对象之间,有共享的数据,且这个数据不会发生变动,最好定义为静态常量,可以有效提升效率。
static final修饰...
- 在类信息中,如果使用实例信息,需要注意先创建对象才能使用。而反之则无所谓。
包的作用和使用
- 因为在各个平台系统中,同一个目录下不允许出现同名文件。
- 当我们文件(java代码等)越来越多的时候,全都放在一起会显得杂乱,不易管理和查找。有一定规则的包可以解决此问题。
- 有助于实施访问权限控制使用包:
- 包名的命名规则:
- 所有的字母都小写(大多数场景下)
- 采用反域名命名法(公司域名的倒序) 例如:cn.kgc.xxx
- 各级包应该有一定的规范:(根据不同公司会有出入)一般都是4级包,可能有更多级,根据具体需求来。cn :一级包kgc :二级包 公司的名称项目的名称:三级包模块名或者层级名:四级包**例如:**com.neteasy.cloudmusic.ui…
- 声明包地址
// 声明包地址的 它必须在文件的有效代码的第一行
package cn.kgc.demo2;
- 导入包(Eclipse快速导包:Ctrl+Shift+O)
// 导包:如果你要使用的类[不再同一个包下] 你就需要将它的地址导入过来
// 导包的语句必须是在类声明的上方,包声明的下方
// 语法:import 类的全类名/全路径/全限定名;(它也支持通配符)
// import java.util.*;
import java.util.Scanner;
java.lang包下的类,不需要你手动声明,JVM会自动进行加载。
**例如:**System
- 特殊情况
// 如果在一个类中,出现了使用两个不同包的同名类 必然有一个需要以全类名形式使用
cn.kgc.demo1.Cat cat = new cn.kgc.demo1.Cat();