封装与类
面向对象的程序设计将数据和对数据的操作行为封装在一起,作为一个相互依存、不可分割的整体——类。
类中的大多数数据只能为本类的行为处理,类会提供公开的外部接口和外界进行通信。
面向对象的显著特点:封装性、继承性、多态性。
封装隐藏了内部实现,继承实现了现有代码的复用,多态在代码复用的基础上可以改写对象的行为。
封装:
(1)把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位。
(2)实现“信息隐蔽”,尽可能隐藏对象的内部细节,对外界形成一个边界,只保留有限的接口和外界进行联系。
类:
1. 定义:[类修饰符] class { }
(1)类的访问控制符:public, protected, private, package(默认)
(2)数据成员/成员变量
(3)数据成员的 set 和 get 方法:通常会将数据成员私有化(声明数据成员为 private),只允许在类的内部直接存取,外界则使用类声明的两个公开的接口(set 和 get 方法)进行访问
packageBlog;public classGanGan {//成员变量
privateString name;//成员变量的 set 和 get 方法
publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}
}
(4)构造方法:用于为新建的对象分配存储空间和对数据成员进行初始化,它只能再创建对象是用 new 命令调用
* 构造方法通常被重载以提供无参、有参等多种初始化的形式,程序运行时,编译系统会根据创建的对象的参数情况匹配相应的构造方法。
* 如果一个类中为定义构造方法,编译系统会为之提供一个缺省的无参、方法体为空的构造方法
publicGanGan() {
}
* 但是,一旦类中自行定义了其他构造方法后,编译系统将不再提供默认的无参构造方法。但无论怎样,都需要在类中自定义一个无参的构造方法
* 如果类中包含了多个重载的构造方法,而这些重载方法之间存在完全包含的关系,那么可以用一个构造方法去调用另一个构造方法
packageBlog;public classGanGan {//成员变量
privateString name;private intage;//空构造
publicGanGan() {super();
}//有参构造,重载
publicGanGan(String name) {this.name =name;
}public GanGan(String name, intage) {//使用 this 调用自己的其它构造方法//this 调用只能再构造方法中使用,且必须是构造方法执行体的第一句
this(name);this.age =age;
}//成员变量的 set 和 get 方法
publicString getName() {returnname;
}public voidsetName(String name) {this.name =name;
}public intgetAge() {returnage;
}public void setAge(intage) {this.age =age;
}
}
对象和引用
1. 创建后的对象存在与堆内存中,通过它的引用变量才能才能访问到,引用变量位于栈内存中。
(Java 中的 String 类型变量为引用类型,其默认的初值为 null)
2. 引用变量只存储了对象的地址,与对象建立了指向的关系
使用对象的成员:引用变量 . 成员变量,引用变量 . 成员方法
关于 static
1. 对于 static 成员,建议使用类名 . 形式进行存取(static成员通常是为类的对象所共享的数据)
packageBlog;public classStaticClass {//成员变量
public static String nationality = "中国";
}
packageBlog;public classStaticDemo {public static voidmain(String[] args) {
System.out.println("干干的国籍:" +StaticClass.nationality);
}
}
运行成果:
2. static 方法只能访问 static 成员;非 static 方法既可以访问 static 成员,又可以访问非 static 成员
3. static 代码块:如果在加载类时希望先进行一些特殊的初始化,可以使用 static 定义一个代码块,将期望最早执行的初始化任务写在代码块中。(类在家在时,会预先执行 static 代码块中的代码,且只执行一次)
packageBlog;public classStaticBlockTest {//静态代码块
static{
System.out.println("static 代码区,类正在被加载......,我只执行一次");
}//构造方法
publicStaticBlockTest() {
System.out.println("在创建类的对象......");
}
}
packageBlog;public classStaticBlockDemo {public static voidmain(String[] args) {newStaticBlockTest();newStaticBlockTest();
}
}
运行结果: