目录
一、访问修饰符
一、权限范围
二、注意事项
二、封装(面向对象的三大特征之一)
一、封装的好处
二、封装的实现步骤
三、和构造器结合
四、练习题中的细节
一、访问修饰符
一、权限范围
访问修饰符用于控制方法和属性(成员变量)的访问权限
四种访问修饰符:public、protected、默认、 private
四种访问修饰符的权限(图片)
二、注意事项
包的优先级>类,
package com.hspedu.modifier;
public class A {
//四个属性,分别使用不同的访问修饰符来修饰
public int n1 = 100;
protected int n2 = 200;
int n3 = 300;
private int n4 = 400;
public void m1(){
//在同一个类中该方法可以访问public、protected,默认,private修饰的属性或方法
// 属性
System.out.println("n1=" + n1 + " n2=" + n2 + " n3=" + n3 +" n4=" + n4);
}
}
package com.hspedu.pkg;
import com.hspedu.modifier.A;
public class Test {
public static void main(String[] args) {
A a = new A();
//在不同包下只能访问public修饰的属性或方法
//不可以访问protected,私有,private修饰的属性或方法
System.out.println("n1 =" + a.n1);
a.m1();
}
}
比如下面代码中,方法m1()是public修饰的,但是其中的属性n1-n4是四种访问修饰符修饰的,但是在pkg包中可以访问方法m1,自然也可以访问n1-n4
二、封装(面向对象的三大特征之一)
英语:encapsulation
一、封装的好处
1)隐藏实现细节
2)对数据进行验证,保证安全合理
二、封装的实现步骤
需要使用set和get方法
1)将属性进行私有化 private (只有在同一个类中才可以访问,外部不能修改属性)
2)提供一个public set方法,用于对属性判断并赋值(比如第七章作业中的十三题,设置的setRadius方法),用于对属性进行判断并赋值
例子
package com.hspedu.encap;
public class Encapsulation0207 {
public static void main(String[] args) {
Person0207 person0207 = new Person0207();
person0207.setName("jack解开了");
person0207.setAge(190);
person0207.setSalary(30000);
System.out.println(person0207.info());
//工资不能直接查看,只能通过get方法查看
//System.out.println(personRev.salary);
System.out.println(person0207.getSalary());
//如果直接使用构造器指定属性,那么get和set方法的逻辑判断就失效了
Person0207 smith = new Person0207("smith", 200, 50000);
System.out.println("==========smith的信息===========");
System.out.println(smith.info());
}
}
//不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。
//年龄合理就设置,否则给默认年龄,必须在 1-120,年龄,
//工资不能直接查看,name的长度在 2-6字符 之间
class Person0207 {
private String name;
private int age;
private double salary;
public Person0207() {
}
//有三个属性的构造器
public Person0207(String name, int age, double salary) {
// this.name = name;
// this.age = age;
// this.salary = salary;
//将set方法写在构造器中,这样仍然可以验证
//在创建新对象的时候,name/age/salary依次被传参进来
//然后依次调用以下set方法,进行逻辑判断,即套娃
setName(name);
setAge(age);
setSalary(salary);
}
public void setName(String name) {
// name的长度在 2-6字符 之间
if(name.length() >= 2 && name.length() <= 6){
this.name = name;
}else{
System.out.println("name的长度需要在2-6字符之间,赋予默认名字");
this.name = "无名";
}
}
public int getAge() {
return age;
}
public void setAge(int age) {
//年龄合理就设置,否则给默认年龄,必须在 1-120
if(age >= 1 && age <= 120){
this.age = age;
}else{
System.out.println("你设置的年龄不对,需要在(1-120),给出默认年龄18");
this.age = 18;
}
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String info(){
return "个人信息:name=" + name + " age=" + age + " salary=" + salary;
}
}
三、和构造器结合
操作:在构造器(构造方法)内调用setXxx()方法
public Person0207(String name, int age, double salary) {
// this.name = name;
// this.age = age;
// this.salary = salary;
//将set方法写在构造器中,这样仍然可以验证
//在创建新对象的时候,name/age/salary依次被传参进来
//然后依次调用以下set方法,进行逻辑判断,即套娃
setName(name);
setAge(age);
setSalary(salary);
}
四、练习题中的细节
1.属性都设置为private
2.无参构造器和有参构造器都需要写上(构造器和set方法结合)
package com.hspedu.encap;
public class Account0207 {
private String name;
private double bala;
private String passwd;
public Account0207() {
}
//set方法和构造器结合
public Account0207(String name, double bala, String passwd) {
setName(name);
setBala(bala);
setPasswd(passwd);
}
public String getName() {
return name;
}
public void setName(String name) {
int len = name.length();
if(len == 2 || len == 3 || len ==4 ){//只要满足一个条件就不会再判断后面的
this.name = name;
}else{
System.out.println("要求名字的长度为2位或3位或4位,输入有误,给出默认名字");
this.name = "无名";
}
}
public double getBala() {
return bala;
}
public void setBala(double bala) {
if(bala > 20){
this.bala = bala;
}else{
System.out.println("要求余额必须>20,给出值");
this.bala = 0;
}
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
//密码必须是六位
if(passwd.length() == 6){
this.passwd = passwd;
}else{
System.out.println("密码必须是六位,如果不满足,则赋默认值");
this.passwd = "000000";
}
}
public String info(){
return "账户姓名:" + name + " 余额:" + bala + " 密码:" + passwd;
}
}
package com.hspedu.encap;
public class TestAccount0207 {
public static void main(String[] args) {
Account0207 account0207 = new Account0207();
account0207.setName("李白");
account0207.setBala(13);
account0207.setPasswd("6666");
System.out.println(account0207.info());
System.out.println("==================");
Account0207 account0208 = new Account0207("李响", 8, "888888");
System.out.println(account0208.info());
}
}