本文共 7184 字,大约阅读时间需要 23 分钟。
Java 封装
封装的优点良好的封装能够减少耦合。
类内部的结构可以自由修改。
可以对成员变量进行更精确的控制。
隐藏信息,实现细节。
实现Java封装的步骤修改属性的可见性来限制对属性的访问(一般限制为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/