封装
封装概念
封装: 将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行 交互。
Java中主要通过类和访问权限来实现封装:类可以将数据以及封装数据的方法结合在一起,更符合人类对事物的认知,而访问权限用来控制方法或者字段能否直接在类外使用。
访问限定符
Java中提供了四种访问限定符:private、default、protected、public
public:公开的,被其修饰的变量或方法都可以公开使用
private:私人的,被其修饰的变量或方法只能在当前类中使用。一般情况下,我们用private修饰成员变量,用public修饰成员方法
default:包访问权限,被其修饰的变量或方法只能在同一个包中被使用。需要注意的是,在修饰变量或方法时并不是在前面写上default,而是什么也不写。
protected:是继承相关知识里的,这里先不做解释
public class Test {
class Animal {
public String name;//可以被公开访问和使用
String color;//包访问权限,只能在同一个包中被访问
private int age;//只能在当前类中被访问
public Animal(String name, String color, int age) {
this.name = name;
this.color = color;
this.age = age;
}
}
}
包
包是对类、接口等的封装机制的体现,是一种对类或者接口等的很好的组织方式,比如:一个包中的类不想被其他包中的类使用。
包还有一个重要的作用:在同一个工程中允许存在相同名称的类,只要处在不同的包中即可。
导入包中的类
Java当中提供了很多类供我们使用,当我们用到一个包中的某个类时,就需要导入包中的这个类。比如要使用Scanner类创建一个对象时,需要用import导入这个类。这里的 java.util
就是类所在的包, Scanner
就是用到的类。需要注意的是,我们常说的 导包 其实是导入包里的某个类。
import java.util.Scanner;
public class Test {
Scanner scan = new Scanner(System.in);
}
自定义包
- 在文件的最上方加上一个
package
语句指定该代码在哪个包中。 - 包名需要尽量指定成唯一的名字, 通常会用公司的域名的颠倒形式(例如
com.demo.www
)。 - 包名要和代码路径相匹配. 例如创建
com.demo.www
的包, 那么会存在一个对应的路径 com/demo/www 来存储代码。 - 如果一个类没有 package 语句, 则该类被放到一个默认包中。
既然Java提供了很多包,我们也可以自己创建一个包。
操作步骤
1)右击src,选择New---->Package
2)输入Name (注意这里的名字 应全部为 小写字母)
3)下面是创建好的包
这里可以再解释一下包访问权限的范围,如果在www这个包里面创建一个Test1类,类内部定义有 包访问权限的age
,在不同包 demo包中创建一个Test2类,那么对于age
来说 在不同包中Test2类就不能访问age
,只能在demo这个包中被访问
static修饰的成员变量和方法
修饰成员变量
用 static 修饰的成员变量称为静态成员变量,未被其修饰的称为实例成员变量。
- 被static修饰的成员变量属于类的变量,储存在方法区中,随类的加载而被加载,不再属于对象,不再依赖于对象。
- 静态成员变量不属于某个对象,是类的属性,是多个对象共享的,即使创建多个对象也不会新增第二个静态成员变量。
- 在其类外使用时需要用类名进行访问,但也可以用当前对象的引用进行访问,但是这种方法不合理。
- 生命周期伴随类的一生:随类的加载而创建,随类的卸载而销毁。(当用类名进行访问类的属性时,类就会被加载,进而这些静态成员变量就会被创建)
- 方法中不能定义和使用静态成员变量,在方法当中定义的变量是局部变量,而静态的变量属于类变量。随着类的加载而被创建,而局部变量是调用该方法的时候,才创建的。所以,此时两种变量的性质是冲突的。Java当中不允许定义局部的静态变量
修饰成员方法
- 静态成员方法不属于某个具体的对象,属于类的方法。
- 要用类名的方式调用,也可以用当前对象的引用进行调用,但是这样调用不合理
- 静态成员方法里面不能任何访问非静态的成员变量或成员方法,也不能出现this参数,因为这些都是依赖于对象的,而静态成员方法属于类的方法,不依赖于对象
代码块
普通代码块
使用{}定义在方法中的一段代码,这种用法不多
构造代码块(实例代码块)
定义在类中的代码块(不加修饰符)。一般用来初始化实例成员变量
静态代码块
用static修饰的定义在类中的代码块,一般用于从初始化静态成员变量
同步代码块
现在还没学…
执行顺序
- 执行顺序:静态代码块 > 实例代码块 > 构造方法
- 静态代码块不管生成多少个对象,其只会执行一次(在类被加载时被执行)
- 如果一个类中有多个静态代码块,会按照定义的先后顺序进行依次执行
- 实例代码块只有在创建对象时才会执行