javase个人垃圾复习笔记13Java 封装、Java 枚举(enum)和包(package),还有接口interface

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);
    }
  }
}
/*执行以上代码输出结果为:
RED
GREEN
BLUE

在 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 0
GREEN at index 1
BLUE at index 2
RED

枚举类成员
枚举跟普通类一样可以用自己的变量、方法和构造函数,构造函数只能使用 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 : RED
Constructor called for : GREEN
Constructor called for : BLUE
RED
Universal 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 eats
Mammal 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接口的类需要实现六个方法。

猜你喜欢

转载自blog.csdn.net/qq_45864370/article/details/108608854