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