封装
面向对象三大特性: 封装,继承,多态
面向对象四大特性: 封装,继承,多态,抽象
面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。
封装可以被认为是一个保护屏障,
防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。
适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。
封装好处:
-
高代码的安全性
-
提高代码的易用性(复用性)
-
隐藏了内部的实现,防止外部的修改
封装原则(设计原则/ 如何实现封装):
把不想让外界知识的实现细节,给封装起来, 提供公共的访问方式(调用)
封装的体现形式:
方法,对象(类), private
用到修饰符的地方:
- 成员变量 的定义( 类中方法外的变量)
- 成员方法的定义
- 类的定义
private 的特点
-
private 修饰符,可以修饰成员变量和成员方法, 不能修饰类
-
private 修饰的成员变量和成员方法,只能在本类中访问(使用)
-
外界只能通过公共的方法来间接的调用
使用private 可以让可以在设置属性时,添加自己的业务需求,为什么? 因为它是通过setXX方法去进行修改.
标准的封装(JavaBean)
class 类名{
// 私有属性
// 成员方法
// setXX 和 getXX
}
this关键字
在方法中,如果局部变量与成员变量同名了,采用的是就近原则 ,所以当你使用这个名字,它指的是局部变量。
java 提供了一个关键字this, 代表是当前类的对象。
注: 哪个对象调用这个方法,该方法内部的this,就代表那个对象
this应用的场景:
- 解决了局部变量隐藏成员问题
- 调用当前类的构造方法 ,如: this(…)
构造方法
构造方法 :
作用是创建对象(对象数据初始化)
构造方法的格式
1.方法名与类名相同
2.没有返回值 ,连void都没有
3.构造方法可以重载
//如学生类的构造方法
public Student(){
} //无参构造
注意事项:
-
如果我们没有构造方法,系统会自动给一个无参构造方法。
-
如果我们给出构造方法,系统将不会提供无参构造方法, 这个要可以写构造方法,无参与有参都要写
建议: 永远给出无参构造方法。
类的组成
成员变量
成员方法
构造方法
给成员变量赋值的方法
- 通过setXX方法
- 带参的构造方法
static
静态变量与静态方法
static 是一个修饰符,修饰成员属性时,称为静态变量, 修饰成员方法,称为静态方法
static 的特点
- 随着类的加载而加载
- 优先于对象
- 被类的所有对象共享
- 可以通过类名调用,也可以通过对象名调用,但是推荐使用类名调用
static 关键字的注意事项
-
静态方法里没有this关键字(就是不能用this)
如何理解 ?
静态随着类的加载而加载,this是随着对象的创建而存在
-
静态方法只能访问静态变量和静态方法
成员方法:即可以调用成员属性,也可以调用静态属性
记住:静态的只能访问静态的
静态变量与成员变量的区别
所属不同
静态变量属于类,所以也称为为类变量
成员变量属于对象,所以也称为实例变量(对象变量)
内存中位置不同
静态变量存储于方法区的静态区
成员变量存储于堆内存
内存出现时间不同
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失
调用不同
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用
main方法
public static void main(String[] args){
}
public : 公共的/公开的 访问权限最大, main 方法由jvm调用 ,所以权限足够大
static : 静态的 不需要创建对象,通过类名可以直接调用。方便jvm调用
void : 方法返回值类型给调用者 由jvm调用的 返回值给jvm是没有意义的
main: 是一个常见的方法入口
String[] args : 字符 中数组 ,用户输入的
这个东西是早期的键盘录入,已经被Scanner淘汰了
代码块
代码块: {} 括起来的代码被称为代码块
分类:
局部代码块: 方法中定义的代码块,它的作用主要是限制变量的作用范围
构造代码块:类中的方法外(类的成员位置),每次在构造方法执行之前会先执行构造代码块
作用: 如果多个构造方法中有相同的代码,可以放在构造代码块中
每个构造方法执行之前,都会先执行构造代码块
静态代码块:类中的方法外(类的成员位置),用{}括起来,且在前面加上static关键字
作用: 对类进行初始化,仅仅执行1次
代码块的执行顺序 : 静态代码块 > 构造代码块 > 局部代码块
包
java中包的本质 : 就是文件夹
注:在一个文件夹下面同名的同类型的文件只能出现一个
当有多级目录的时候,java中
包名1.包名2.包名3
直接右键选择创建包, 如:com.gxa.student idea中看到的一个目录文件夹,但是实现上是创建了3个文件夹
创建包: 选择src 右键 new -> package
包名的命名规则
包名用小写字母,不要驼峰,不要中文
怎么在包中放类
使用package 声明这个类在哪一个包下
不同包下面的类的访问
使用import 关键字,导入包
导入包的两种方法
-
单类型导入(导一个)
import com.gxa.student.Student;
import com.gxa.student.Person;
-
按需导入
import com.gxa.student.*;
按需类型导人 (type-import-on-demand), 例如import java. util.*
单类型导入比较好理解,编程所使用的各种工具默认都是按照单类型导入的,需要什么类便导人什么类,这种方式是导入指定的public类或者接口;
按需类型导入,比如 import java. util. * 可能看到后面的* 程序员会以为是导入java. util 包下的所有类, 其实并不是这样,Java会根据名字知道是按照需求导入,并不是导入整个包下的所有类。
按需类型导入是绝对不会降低Java 代码的执行效率的,但会影响到Java代码的编译速度。
所以在编码时最好是使用单类型导入,这样不仅能提高编译速度,也能避免命名冲突。
全局导入和局部导入
全局导入 在当前整个类上面都可以使用导入的类
import com.gxa.find.Teacher;
局部导入 用的非常少 如果要使用的类和全局导入的类名相同,可以使用局部导入 一次性
com.update.Student s2=new com.update.Student();