1. 访问修饰符 1.1 基本介绍 278 java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围): 1) 公开级别:用 public 修饰,对外公开 2) 受保护级别:用 protected 修饰
1. 访问修饰符
1.1 基本介绍 278
java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围):
1) 公开级别:用 public 修饰,对外公开
2) 受保护级别:用 protected 修饰,对子类和同一个包中的类公开
3) 默认级别:没有修饰符号,向同一个包的类公开.
4) 私有级别:用 private 修饰,只有类本身可以访问,不对外公开.
1.2 注意事项 279
在A类中定义不同的属性和方法
package com.stulzl.test41;
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);
}
//方法的修饰和属性一样
protected void m2(){}
void m3(){}
private void m4(){}
//在同一类中,可以访问 public protected 默认 private 修饰属性和方法
public void hi()
{
m1();
m2();
m3();
m4();
}
}
在B类中引用A类中的属性和方法
package com.stulzl.test41;
public class B
{
public void say()
{
A a = new A();
//在同一个包下,可以访问 public , protected 和 默认修饰属性或方法,不能访问 private 属性或方法
System.out.println("n1="+a.n1+"n2="+a.n2+"n3="+a.n3);
//在同一个包下,可以访问 public , protected 和 默认修饰属性或方法,不能访问 private 属性或方法
a.m1();
a.m2();
a.m3();
}
}
在Test41中运行,验证(同类)(同包)不同属性的区别,看看能否输出
package com.stulzl.test41;
public class Test41
{
public static void main(String[] args)
{
A a = new A();//100 200 300 400//测试同类
a.m1();
B b = new B();//100 200 300//测试同胞
b.say();
}
}
在不同包引用A类中的属性和方法
package com.stulzl.pkg;
import com.stulzl.test41.A;
public class Test
{
public static void main(String[] args)
{
A a = new A();
//在不同包下可以访问public修饰的属性或者方法
//但不能访问protected,默认,private修饰的属性或者方法
System.out.println("n1="+a.n1);//100 //验证不同包
//在不同包下可以访问public修饰的属性或者方法
//但不能访问protected,默认,private修饰的属性或者方法
a.m1();
}
}
2. 基本介绍
面向对象编程有三大特征:封装、继承和多态。
3. 封装(encapsulation) 280
4. 封装的理解和好处 280
5. 封装的实现步骤(三步)281
6. 快速入门 282
那么在 java 中如何实现这种类似的控制呢?
请大家看一个小程序不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。年龄合理就设置,否则给默认 年龄, 必须在 1-120, 年龄, 工资不能直接查看 , name 的长度在 2-6 字符 之间
package com.stulzl.test42;
import java.util.Scanner;
//请大家看一个小程序不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。
// 年龄合理就设置,否则给默认 年龄, 必须在 1-120,
// 年龄, 工资不能直接查看 ,name 的长度在 2-6 字符 之间
public class Test42
{
public static void main(String[] args)
{
Person person = new Person();
person.setName("jack");
person.setAge(30);
person.setSalary(30000);
//输出信息
System.out.println(person.info());
System.out.println("salary="+person.getSalary());
}
}
class Person
{
public String name;//名字公开
private int age;//年龄私有
private int salary;//工资私有
//自己写 setXxx 和 getXxx 太慢,我们使用快捷键
//然后根据要求来完善我们的代码
public String getName() {
return name;
}
//name 的长度在 2-6 字符 之间
public void setName(String name) {
//假如对数据的校验
if(name.length()>=2 && name.length()<=6)
{
this.name=name;
}
else
{
System.out.println("名字长度不对,给出默认名");
this.name = "无名氏";
}
}
public int getAge() {
return age;
}
//年龄, 必须在 1-120
public void setAge(int age) {
//设置验证
if(age>=1 && age<=120)
{
this.age=age;
}
else
{
System.out.println("你设置的年龄不对必须在 1-120,先给一个默认年龄");
this.age = 18;//给一个默认年龄
}
}
//工资不能直接查看
public int getSalary() {
//增加对当前对当前对象的权限判定
Scanner scanner = new Scanner(System.in);
System.out.println("查看工资请输入密码");
String key = scanner.next();
if(key.equals("123"))
{
return salary;
}
else
{
System.out.println("密码错误");
return -1;//错误返回-1
}
}
public void setSalary(int salary) {
this.salary = salary;
}
//写一个方法返回信息
public String info()
{
return "信息为 name="+name+" age="+age;
}
}
6.2 封装和构造器结合
补充上题
package com.stulzl.test42;
import java.util.Scanner;
public class Test42
{
public static void main(String[] args)
{
Person person = new Person();
person.setName("jack");
person.setAge(30);
person.setSalary(30000);
//输出信息
System.out.println(person.info());
System.out.println("salary="+person.getSalary());
//使用构造器输出
System.out.println("=====smith信息=====");
Person person1 = new Person("smith",80,20000);
System.out.println(person1.info());
System.out.println("salary="+person1.getSalary());
}
}
class Person
{
public String name;//名字公开
private int age;//年龄私有
private int salary;//工资私有
//无参构造器
public Person() {//这个无参构造器是输出jack信息的,因为宅main中jack的person()没有传值,而我们又写了一个
// 有参构造器为了输出smith信息,但是Jack的person()无传参和smith的person1()有传参,
// 防止jack和smith在输出信息而是用到构造器时矛盾,所以接一个无参构造器给jack使用
}
//三个属性的构造器
public Person(String name, int age, int salary) {
// this.name = name;
// this.age = age;
// this.salary = salary;
//我们可以将set方法写在构造器中,这样仍然可以验证
setName(name);
setAge(age);
setSalary(salary);
}
//自己写 setXxx 和 getXxx 太慢,我们使用快捷键
//然后根据要求来完善我们的代码
public String getName() {
return name;
}
//name 的长度在 2-6 字符 之间
public void setName(String name) {
//假如对数据的校验
if(name.length()>=2 && name.length()<=6)
{
this.name=name;
}
else
{
System.out.println("名字长度不对,给出默认名");
this.name = "无名氏";
}
}
public int getAge() {
return age;
}
//年龄, 必须在 1-120
public void setAge(int age) {
//设置验证
if(age>=1 && age<=120)
{
this.age=age;
}
else
{
System.out.println("你设置的年龄不对必须在 1-120,先给一个默认年龄");
this.age = 18;//给一个默认年龄
}
}
//工资不能直接查看
public int getSalary() {
//增加对当前对当前对象的权限判定
Scanner scanner = new Scanner(System.in);
System.out.println("查看工资请输入密码");
String key = scanner.next();
if(key.equals("123"))
{
return salary;
}
else
{
System.out.println("密码错误");
return -1;//错误返回-1
}
}
public void setSalary(int salary) {
this.salary = salary;
}
//写一个方法返回信息
public String info()
{
return "信息为 name="+name+" age="+age;
}
}
【本文由:武汉网页开发公司 http://www.1234xp.com/wuhan.html 复制请保留原URL】