封装(好比ATM机)
将类的某些信息隐藏在类内部,不允许外部程序直接访问(隐藏对象的信息),通过该类提供的方法来实现对隐藏信息的操作和访问(留出访问的接口)。
特点:
1.只能通过规定的方法访问数据。
2.隐藏类的实例细节,方便修改和实现。
实现步骤:
1.修改属性的可见性——设为private。
2.创建getter/setter方法——设为public,用于属性的读写(只读属性(无法修改)/只写属性(无法获取))。
3.在getter/setter方法中加入属性控制语句——对属性值的合法性进行判断。
封装前
public class Dog { int age; } public class DogTest { public static void main(String[] args){ Dog d=new Dog(); d.age=3; System.out.println("年龄:"+d.age); } }
//运行结果
昵称:3
封装后
public class Dog { private int age; public int getAge() { return age; } public void setAge(int age) { if(age<0){ System.out.println("输入错误"); }else this.age = age; } } public class DogTest { public static void main(String[] args){ Dog d=new Dog(); d.setAge(3); System.out.println("年龄:"+d.getAge()); Dog d1=new Dog(); d1.setAge(-3); System.out.println("年龄"+d1.getAge());//因为没有赋值成功,所以值为默认初始值0 Dog d2=new Dog(); d1.setAge(-5); if(d1.getAge()==0) //简单地加个判断处理 return; System.out.println("年龄"+d1.getAge()); } } //运行结果 年龄:3 输入错误 年龄0 输入错误
用带参构造函数给对象的属性赋值
public class Dog { private int age; public Dog(int age){ this.setAge(age); //这里若用this.age=age;则不能判断是否输入错误 } public int getAge() { return age; } public void setAge(int age) { if(age<0){ System.out.println("输入错误"); }else this.age = age; } } public class DogTest { public static void main(String[] args){ Dog d=new Dog(3); if(d.getAge()==0) return; System.out.println("年龄:"+d.getAge()); Dog d1=new Dog(-3); if(d1.getAge()==0) return; System.out.println("年龄"+d1.getAge()); } } //运行结果 年龄:3 输入错误
包
作用:
1.提供多层命名空间,解决命名冲突,通过使用package,使处于不同package的类可以存在相同的名字(因为处在不同的文件夹下)。
2.对类按功能分类,使项目的组织更加清晰。当开发一个有非常多的类的项目时,如果不使用package对类进行分类,而是把所有类都放在一个package下,这样的代码不仅可读性差,而且可维护性也不好,会严重影响开发效率。
定义包:
语法:package 包名;
(1)必须放在Java源文件中的第一行
(2)一个Java源文件中只能有一个package语句
(3)包名全部英文小写
(4)命名方式:域名倒序+模块+功能
导入包:
语法:import 包名.类名
例:
导入util包中全部类:
import java.util.*;
导入包中指定类:
import java.util.Scanner;
常用系统包:
java.lang 包含java语言基础的类 (此包不需要显式地导入)
java.util 包含java语言中各种工具类
java.io 包含输入、输出相关功能的类