封装
面向对象的三大特点:封装,继承,多态
面向对象编程语言是对客观世界的模拟,客观世界里的成员变量都是隐藏在对象内部的,外界无法直接操作和修改。
封装可以看作一个保护屏障:
- 防止该类的代码和数据被其它类随意访问。要访问该类的数据,必须通过指定方式。
- 适当的封装可以让代码更容易理解和维护,也加强了代码的安全性
1、封装的好处:
- 提高代码的安全性
- 提高代码的易用性(复用性)
- 隐藏内部的实现,防止外部修改
(1)封装规则(设计原则):
把不想让外界知道的实现细节给封装起来,提供公共的访问方式(调用)
(2)封装的体现形式:
方法,对象(类),private
-
修饰符:
用到修饰符的地方:
- 创建类时
- 声明成员变量
- 方法的定义
修饰符:
- public:公共的
- private:私有的
private的特点:
- private可以修饰成员变量和成员方法,不能修饰类
- private修饰的成员变量和成员方法只有在本类中使用(访问)
- 外界只能通过公共的方法来间接访问
- 使用private可以在我们需要设置属性时添加自己的业务需求
2、标准的封装(Java Bean):
class 类名{
// 私有属性
private String name;
private int age;
// 提供get&set放法间接访问成员属性
public String getName(){
return name;
}
public void setName(String name){
// 如果不写this,name指局部变量(就近原则)
this.name = name;
}
// ...
public 类名(){
// 构造方法,可以重载
}
// 成员方法
}
3、this关键字:
-
在方法中,如果局部变量和成员变量同名的时候,采用就近原则,所以当需要使用这个名字时,它指的是成员变量
-
java提供了一个关键字
this
,来代表当前类的对象注:哪个对象调用这个方法,该方法内的this就指代那个对象。
this的应用场景:
- 解决局部变量和成员变量冲突
- 解决局部变量隐藏成员变量的问题
4、构造函数(方法)
构造方法:创建对象(初始化对象)
注意:
- 如果在编写类时没有构造方法,系统会默认提供一个无参的构造方法。
- 如果我们给出了构造方法系统将不会提供无参的构造方法,这个时候如果需要用到无参的构造方法则需要自己写一个无参的构造方法。
- 建议:永远给出一个无参的构造方法
- 构造方法可以重载
构造方法的格式:
- 方法名与类名相同
- 没有返回值,连void都没有
- 构造方法中可以加return,但要用
return;
public 类名(参数?...){
this.成员属性 = 参数;
// ...
}
案例
Student s = new Student(参数…); // 在内存中的创建流程
1、把Student.class文件加载到内存中(方法区) 2、声明对象s,在栈中为s开辟空间 3、创建对象(new Student(),在堆中开辟空间 4、给学生对象的成员变量进行默认初始化null,0 5、执行构造方法,给学生变量进行显示初始化"张三",18 6、对象构造完成,把对象地址赋值给s
5、static属性和方法
哪些属性定义?
静态属性与静态方法
static是一个修饰符,修饰成员属性时,称为静态变量;修饰成员方法,称为静态方法
static属性特点:
-
随着类的加载而加载
-
优先于对象
-
被类的所有对象共享
-
可以通过类名调用,也可以通过对象名调用,但推荐使用类名调用
class Person{ public static String country = "中国"; } class Demo{ public static void main(String[] args){ // Person p1 = new Person(); // p1.country; System.out.println(Person.country); } }
static关键字的注意事项:
-
静态方法里没有this关键字(不能使用this)
static随着类的加载而加载,this是在创建对象时创建的
-
静态方法只能访问静态属性和静态方法
成员方法:可调用静态和成员变量
记住:静态的只能访问静态的
静态属性与成员属性的区别:
所属不同
静态属性属于类,所以也成为类变量 // 通常用:类名.属性名调用
成员属性属于对象,所以也称为实例变量(对象变量)
内存位置不同
静态变量存储在方法区的静态区
成员变量存储在堆内存中
内存出现时间不同
静态随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而创建,随着对象的消失而消失
调用不同
静态可以通过类名调用,也可以通过对象调用
成员变量只能通过对象调用
6、代码块
代码块:用{}括起来的代码被称为代码块
分类:
-
局部代码块:
在方法中定义的代码块,作用主要是限制变量的作用范围
-
构造代码块:
类中的方法外,每次在构造方法执行之前执行,
作用:如果多个构造方法有相同的代码可以将其放到构造代码块中
每一个构造方法执行之前都会执行构造代码块
-
静态代码块:
在构造代码块的基础上添加static关键字,作用定义类加载的实际时间。
代码块的执行顺序:
- 静态代码块(类加载时)—》构造代码块(构造方法执行之前)—》局部代码块
7、包
java中包的本质就是文件夹
注:在一个包下面同名的同类型文件只能出现一个
当有多级目录时,java中:
包名1.包名2.包名3:创建的是多级包(目录)
包名的命名规范
包名用全小写字母,不能驼峰,不要中文(一般是公司域名的倒序)
包的划分规则:按模块划分
案例
学生
com.gxa.student // 包
Student.java
AddStudent.java
DelStudent.java老师
com.gxa.teacher // 包
Teacher.java
AddTeacher.java// …
怎么去声明包???
用package关键字
写在除了注释外,在java文件的类外面的最上面一行
package com.gxa.student;
怎么使用在不同包中的类???
用import关键字,导入包(需要使用的类所在的包)在java文件的类外面的包下面
// 单个导入(加载单个文件)import 包名.包下的java文件名;
import com.gxa.student.Student;
// 按需导入(用到哪些就导入哪些文件)
import com.gxa.student.*;
按需导入不会影响java代码的执行效率,但是会影响java代码的编译速度。
全局导入和局部导入
-
全局导入:在当前整个类上面都可以使用导入的类
import com.gxa.student.Student
-
局部导入:用的非常少,如果要使用
com.gxa.student.Student stu = new com.gxa.student.Student();
8、静态导入方法:
// 通过import static关键字导入需要的静态方法
import static java.lang.Math.abs; // 静态导入abs方法
public class Demo{
public static void main(String[] args){
// 在本类中可以直接使用该导入的方法,不用使用导入其他类
System.out.println(abs(-100));
}
}
注意:
- 最好不要使用静态导入的方式;
- 静态导入的要求:
- 方法和属性必须是静态
- 注意不要和本类的方法同名,如果同名记得加前缀。