当前位置 : 主页 > 编程语言 > c语言 >

访问修饰符和封装

来源:互联网 收集:自由互联 发布时间:2023-09-07
1. 访问修饰符 1.1 基本介绍 278 java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围): 1) 公开级别:用 public 修饰,对外公开 2) 受保护级别:用 protected 修饰

1. 访问修饰符

1.1 基本介绍 278

java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围):

1) 公开级别:用 public 修饰,对外公开

2) 受保护级别:用 protected 修饰,对子类和同一个包中的类公开

3) 默认级别:没有修饰符号,向同一个包的类公开.

4) 私有级别:用 private 修饰,只有类本身可以访问,不对外公开.

访问修饰符和封装_System

1.2 注意事项 279

访问修饰符和封装_封装_02

在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

访问修饰符和封装_System_03

4. 封装的理解和好处 280

访问修饰符和封装_访问修饰符_04

5. 封装的实现步骤(三步)281

访问修饰符和封装_封装_05

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】
网友评论