博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javase个人垃圾复习笔记13Java 封装、Java 枚举(enum)和包(package),还有接口interface
阅读量:3966 次
发布时间:2019-05-24

本文共 7184 字,大约阅读时间需要 23 分钟。

Java 封装

封装的优点

  1. 良好的封装能够减少耦合。

  2. 类内部的结构可以自由修改。

  3. 可以对成员变量进行更精确的控制。

  4. 隐藏信息,实现细节。

    实现Java封装的步骤

  5. 修改属性的可见性来限制对属性的访问(一般限制为private),例如:

public class Person {
private String name; private int age;}

这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。

2. 对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

public class Person{
private String name; private int age;​ public int getAge(){
return age; }​ public String getName(){
return name; }​ public void setAge(int age){
this.age = age; }​ public void setName(String name){
this.name = name; }}/*采用 this 关键字是为了解决实例变量(private String name)和局部变量(setName(String name)中的name变量)之间发生的同名的冲突

让我们来看一个java封装类的例子:

/* 文件名: EncapTest.java */public class EncapTest{
private String name; private String idNum; private int age; public int getAge(){
return age; } public String getName(){
return name; } public String getIdNum(){
return idNum; } public void setAge( int newAge){
age = newAge; } public void setName(String newName){
name = newName; } public void setIdNum( String newId){
idNum = newId; }}/* F文件名 : RunEncap.java */public class RunEncap{
public static void main(String args[]){
EncapTest encap = new EncapTest(); encap.setName("James"); encap.setAge(20); encap.setIdNum("12343ms"); System.out.print("Name : " + encap.getName()+ " Age : "+ encap.getAge()); }}/*以上代码编译运行结果如下:Name : James Age : 20

//蛮简单,无问题。

Java 枚举(enum)

Java 枚举是一个特殊的类,一般表示一组常量,比如一年的 4 个季节,一个年的 12 个月份,一个星期的 7 天,方向有东南西北等。
Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。
例如定义一个颜色的枚举类。

enum Color{
RED, GREEN, BLUE;} public class Test{
// 执行输出结果 public static void main(String[] args) {
Color c1 = Color.RED; System.out.println(c1); }}/*执行以上代码输出结果为:RED

枚举类也可以声明在内部类中:

public class Test{
enum Color//每个枚举都是通过 Class 在内部实现的,且所有的枚举值都是 public static final 的。 {
RED, GREEN, BLUE; } // 执行输出结果 public static void main(String[] args) {
Color c1 = Color.RED; System.out.println(c1); }}/*执行以上代码输出结果为:RED*///相当于:class Color{
public static final Color RED = new Color(); public static final Color BLUE = new Color(); public static final Color GREEN = new Color();}

迭代枚举元素

可以使用 for 语句来迭代枚举元素:

enum Color{
RED, GREEN, BLUE;}public class MyClass {
public static void main(String[] args) {
for (Color myVar : Color.values()) {
System.out.println(myVar); } }}/*执行以上代码输出结果为:REDGREENBLUE

在 switch 中使用枚举类

枚举类常应用于 switch 语句中:

enum Color{
RED, GREEN, BLUE;}public class MyClass {
public static void main(String[] args) {
Color myVar = Color.BLUE; switch(myVar) {
case RED: System.out.println("红色"); break; case GREEN: System.out.println("绿色"); break; case BLUE: System.out.println("蓝色"); break; } }}/*执行以上代码输出结果为:蓝色

values(), ordinal() 和 valueOf() 方法

enum 定义的枚举类默认继承了 java.lang.Enum 类,并实现了 java.lang.Seriablizable 和 java.lang.Comparable 两个接口。

values(), ordinal() 和 valueOf() 方法位于 java.lang.Enum 类中:

values() 返回枚举类中所有的值。
ordinal()方法可以找到每个枚举常量的索引,就像数组索引一样。
valueOf()方法返回指定字符串值的枚举常量。

enum Color{
RED, GREEN, BLUE;} public class Test{
public static void main(String[] args) {
// 调用 values() Color arr[] = Color.values(); // 迭代枚举 for (Color col : arr) {
// 查看索引 System.out.println(col + " at index " + col.ordinal()); } // 使用 valueOf() 返回枚举常量,不存在的会报错 IllegalArgumentException System.out.println(Color.valueOf("RED")); // System.out.println(Color.valueOf("WHITE")); }}/*执行以上代码输出结果为:RED at index 0GREEN at index 1BLUE at index 2RED

枚举类成员

枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 private 访问修饰符,所以外部无法调用。

enum Color{
RED, GREEN, BLUE; // 构造函数 private Color() {
System.out.println("Constructor called for : " + this.toString()); } public void colorInfo() {
System.out.println("Universal Color"); }} public class Test{
// 输出 public static void main(String[] args) {
Color c1 = Color.RED; System.out.println(c1); c1.colorInfo(); }}/*执行以上代码输出结果为:Constructor called for : REDConstructor called for : GREENConstructor called for : BLUEREDUniversal Color

Java 包(package)

包的作用
1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。

2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。

3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。

import 关键字

为了能够使用某一个包的成员,我们需要在 Java 程序中明确导入该包。使用 “import” 语句可完成此功能。

import package1[.package2…].(classname|*);

例子

下面的 payroll 包已经包含了 Employee 类,接下来向 payroll 包中添加一个 Boss 类。Boss 类引用 Employee 类的时候可以不用使用 payroll 前缀,Boss 类的实例如下。

package payroll; public class Boss{
public void payEmployee(Employee e) {
e.mailCheck(); }}

如果 Boss 类不在 payroll 包中又会怎样?Boss 类必须使用下面几种方法之一来引用其他包中的类。

使用类全名描述,例如:

payroll.Employee

用 import 关键字引入,使用通配符 “*”

import payroll.*;

使用 import 关键字引入 Employee 类:

import payroll.Employee;

注意:

类文件中可以包含任意数量的 import 声明。import 声明必须在包声明之后,类声明之前。

//包管理什么的,最喜欢了。

Java 接口

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

接口与类相似点:

一个接口可以有多个方法。
接口文件保存在 .java 结尾的文件中,文件名使用接口名。
接口的字节码文件保存在 .class 结尾的文件中。
接口相应的字节码文件必须在与包名称相匹配的目录结构中。

接口与类的区别:

接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。

接口有以下特性:

接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
接口中的方法都是公有的。

接口的实现

当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。
类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
实现一个接口的语法,可以使用这个公式:

...implements 接口名称[, 其他接口名称, 其他接口名称..., ...] ...

例子:

interface Animal {
public void eat(); public void travel();}public class MammalInt implements Animal{
public void eat(){
System.out.println("Mammal eats"); } public void travel(){
System.out.println("Mammal travels"); } public int noOfLegs(){
return 0; } public static void main(String args[]){
MammalInt m = new MammalInt(); m.eat(); m.travel(); }}/*以上实例编译运行结果如下:Mammal eatsMammal travels

重写接口中声明的方法时,需要注意以下规则:

类在实现接口的方法时,不能抛出强制性异常,只能在接口中,或者继承接口的抽象类中抛出该强制性异常。

类在重写方法时要保持一致的方法名,并且应该保持相同或者相兼容的返回值类型。
如果实现接口的类是抽象类,那么就没必要实现该接口的方法。
在实现接口的时候,也要注意一些规则:

一个类可以同时实现多个接口。

一个类只能继承一个类,但是能实现多个接口。
一个接口能继承另一个接口,这和类之间的继承比较相似。

接口的继承

一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。

下面的Sports接口被Hockey和Football接口继承:

public interface Sports{
public void setHomeTeam(String name); public void setVisitingTeam(String name);} public interface Hockey extends Sports{
public void homeGoalScored(); public void visitingGoalScored(); public void endOfPeriod(int period); public void overtimePeriod(int ot);} //Hockey接口自己声明了四个方法,从Sports接口继承了两个方法,这样,实现Hockey接口的类需要实现六个方法。

转载地址:http://ptcki.baihongyu.com/

你可能感兴趣的文章
函数返回值、引用和指针的区别思考
查看>>
AT指令中文手册
查看>>
AT指令中文手册
查看>>
module_param&&MODULE_PARM_DESC
查看>>
struct inode 和 struct file
查看>>
mknod
查看>>
模板匹配函数cvMatchTemplate中的…
查看>>
模板匹配函数cvMatchTemplate中的…
查看>>
模板匹配函数cvMatchTemplate中的…
查看>>
C语言 链表操作
查看>>
C语言 链表操作
查看>>
深入探讨C++中的引用
查看>>
深入探讨C++中的引用
查看>>
assert用法
查看>>
assert用法
查看>>
堆与栈有什么区别?
查看>>
堆与栈有什么区别?
查看>>
操作系统:进程/线程同步的方式和…
查看>>
操作系统:进程/线程同步的方式和…
查看>>
Makefile的编写
查看>>