网站建设方式湘潭网站设计外包公司
目录
一、访问修饰符
一、权限范围
二、注意事项
二、封装(面向对象的三大特征之一)
一、封装的好处
二、封装的实现步骤
三、和构造器结合
四、练习题中的细节
一、访问修饰符
一、权限范围
访问修饰符用于控制方法和属性(成员变量)的访问权限
四种访问修饰符: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-120if(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());}
}