Java中封装的概念
2.封装
2.1.步骤
- 使用 private 关键字来修饰成员变量。
- 对需要访问的成员变量,提供对应的一对 getXxx 方法 、 setXxx 方法。
2.2.private关键字
- private是一个权限修饰符,代表最小权限;
- 可以修饰成员变量和成员方法;
- 被private修饰后的成员变量和成员方法,只在本类中才能访问。
权限修饰符的对比:
- public:任意类均访问,实际就是没有限制访问权限
- protected:同包中的其他类,和不同包的(可见)子类均可见,一部分类可以访问到,一部分不行。
- default(默认权限,隐式定义,不写任何关键字),同包中的其他类可见,不关心是不是子类
private,仅对同类中的其他成员可见
public protected (default) private 同一类中 √ √ √ √ 同一包中 √ √ √ 不同包的子类 √ √ 不同包中的无关类 √ 定义上含糊的说了,protected在不同包的子类中可以访问但实际上不同包的子类,仍然可以细分
- 不同包的子类中,创建父类对象,用父类对象访问protected成员
- 不同包的子类中,创建子类对象,用子类对象访问protected成员
不同包的子类中,创建该类的其他子类对象,用这个其他子类对象访问protected成员
后续在继承中补充说明。
使用 private 修饰成员变量,并提供 getXxx 方法 / setXxx 方法,可以访问成员变量,代码如下:
//private 数据类型 变量名 ;
public class Student {
private String name;
private int age;
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}
2.3.this关键字
this代表所在类的当前对象的引用(地址值),即对象自己的引用。
注意事项:方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁。
使用 this 修饰方法中的变量,解决成员变量被隐藏的问题,代码如下:
public class Student {
private String name;
private int age;
public void setName(String name) {
//name = name;
this.name = name;
}
public String getName() {
return name;
}
public void setAge(int age) {
//age = age;
this.age = age;
}
public int getAge() {
return age;
}
}
2.4.构造方法
构造方法的写法上,方法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚至不需要void。使用
构造方法后,代码如下:public class Student {
private String name;
private int age;
// 无参数构造方法
public Student() {
}
// 有参数构造方法
public Student(String name,int age) {
this.name = name;
this.age = age;
}
}
注意事项:
- 如果你不提供构造方法,系统会给出无参数构造方法。
- 如果你提供了构造方法,系统将不再提供无参数构造方法。
- 构造方法是可以重载的,既可以定义参数,也可以不定义参数。
- 无论是否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个无参数构造方法,
一旦自己定义了构造方法,Java自动提供的默认无参数构造方法就会失效。
2.5.标准代码—JavaBean
JavaBean 是 Java语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具有无
参数的构造方法,提供用来操作成员变量的 set 和 get 方法。public class ClassName{
//成员变量
//构造方法
//无参构造方法【必须】
//有参构造方法【建议】
//成员方法
//getXxx()
//setXxx()
}
编写符合 JavaBean 规范的类,以学生类为例,标准代码如下:
public class Student {
//成员变量
private String name;
private int age;
//构造方法
public Student() {
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
//成员方法
publicvoid setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
publicvoid setAge(int age) {
this.age = age;
}
publicint getAge() {
return age;
}
}
测试类,代码如下:
public class TestStudent {
public static void main(String[] args) {
//无参构造使用
Student s= new Student();
s.setName("柳岩");
s.setAge(18);
System.out.println(s.getName()+"‐‐‐"+s.getAge());
//带参构造使用
Student s2= new Student("赵丽颖",18);
System.out.println(s2.getName()+"‐‐‐"+s2.getAge());
}
}
2.6.匿名对象
应用场景:应对于某个对象只应用一次的场景。
注意事项:匿名对象可以作为参数和返回值
作为参数
class Test1 {
public static void main(String[] args) {
// 普通方式
Scanner sc = new Scanner(System.in);
input(sc);
//匿名对象作为方法接收的参数
input(new Scanner(System.in));
}
public static void input(Scanner sc){
System.out.println(sc);
}
}
作为返回值
class Test2 {
public static void main(String[] args) {
// 普通方式
Scanner sc = getScanner();
}
public static Scanner getScanner(){
//普通方式
//Scanner sc = new Scanner(System.in);
//return sc;
//匿名对象作为方法返回值
return new Scanner(System.in);
}
}
还没有评论,来说两句吧...