封装
在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法。
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
封装的优点:
- 良好的封装能够减少耦合
- 类内部的结构可以自由修改
- 可以对成员变量进行更精确的控制
- 隐藏信息,实现细节
类里面的所有数据都应该保持私有,除提供给对外的接口。
实现封装
修改属性的可见性来限制对属性的访问(一般限制为private),例如:
1 2 3 4
| public class Person { private int age; private String name; }
|
将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏。同时提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public class Person { private int age; private String name;
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; } }
|
Java中的成员内部类
当一个类包含另一个类时,内部类如何访问外部类中的成员属性?如何在外部调用内部类中的方法?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class Person { private String name = "Sillywa"; int age = 20; public class Inner { String name = "wenwen"; public void show() { System.out.println("外部类中的name:" + Person.this.name); System.out.println("外部类中的age:" + Person.this.age); System.out.println("内部类中的name:" + name); } } }
|
1 2 3 4 5 6 7 8 9 10 11
| public class Main { public static void main(String[] args) { Person person = new Person(); Inner inn = person.new Inner(); inn.show(); } }
|
可以看出:
内部类通过 外部类名.this.成员属性 访问外部类中的成员属性。
当需要调用内部类中的方法时,需要先实例化外部类,再实例化内部类。
Java中的静态内部类
静态内部类如何访问外部类的变量?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class Person { private static String name = "Sillywa"; private static String city = "wuhan"; int age = 20; public static class Inner { String name = "wenwen"; public void show() { System.out.println("外部类中的age:" + new Person().age);
System.out.println("外部类中的age:" + city);
System.out.println("外部类中的name:" + Person.name); } } }
|
调用时需要实现引入静态内部类。
1 2 3 4 5 6 7 8 9
| import packageName.Person.Inner; public class Main { public static void main(String[] args) { Inner inn = new Inner(); inn.show(); } }
|
两种情况:
- 静态内部类访问外部的非静态成员:
new 外部类().成员
- 静态内部类访问外部的静态成员:
- 内部类没有与该成员同名的变量: 直接通过
变量名访问
- 内部类存在与该成员同名的变量: 通过
类名.静态成员访问
Java中的方法内部类
方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内可以使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| public class Person { public void show() { class MInner { int score = 83; public int getScore() { return score + 10; } } MInner minner = new MInner(); minner.getScore(); } }
|
一定注意哦:由于方法内部类不能在外部类的方法以外的地方使用(相当于“局部类”),因此方法内部类不能使用访问控制符和static修饰符。