zoukankan      html  css  js  c++  java
  • 封装

    封装

    面向对象的特征:封装,继承,多态

    一、封装

    1、封装的体现:

    ①方法就是一个最基本封装体。

    ②类其实也是一个封装体。

    2、封装的好处:

    ①提高了代码的复用性。

    ②隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。

    ③提高了安全性。

    二、私有:private

    描述人。Person

    属性:年龄。

    行为:说话:说出自己的年龄。

    未修改前:

    class Person {
        int age;
        String name;
    
        public void show() {
            System.out.println("age=" + age + ",name" + name);
        }
    }
    
    public class PersonDemo {
        public static void main(String[] args) {
            // 创建Person对象
            Person p = new Person();
            p.age = -20; // 给Person对象赋值
            p.name = "人妖";
            p.show(); // 调用Person的show方法
        }
    }

    通过未修改代码发现,虽然我们用Java代码把Person描述清楚了,但有个严重的问题,就是Person中的属性的行为可以任意访问和使用。这明显不符合实际需求。

    可是怎么才能不让访问呢?需要使用一个Java中的关键字也是一个修饰符 private(私有,权限修饰符)。只要将Person的属性和行为私有起来,这样就无法直接访问。

    修改第一步:

    class Person {
        private int age;
        private String name;
    
        public void show() {
            System.out.println("age=" + age + ",name" + name);
        }
    }

    问题:

    年龄已被私有,错误的值无法赋值,可是正确的值也赋值不了

    解决方式:

    对外提供可以访问的方法

    class Person {
        // 私有成员变量
        private int age;
        private String name;
    
        // 对外提供设置成员变量的方法
        public void setAge(int a) {
            // 由于是设置成员变量的值,这里可以加入数据的验证
            if (a < 0 || a > 130) {
                System.out.println(a + "不符合年龄的数据范围");
                return;
            }
            age = a; 
        }
    
        // 对外提供访问成员变量的方法
        public void getAge() {
            return age;
        }
    }

    注意:

    ①类中不需要对外提供的内容都私有化,包括属性和方法。

    以后再描述事物,属性都私有化,并提供setXxx getXxx方法对其进行访问。

    ②注意:私有仅仅是封装的体现形式而已。

    三、this关键字

    问题:成员变量和局部变量同名问题

    解决方式:在成员变量名前面加上this.来区别成员变量和局部变量

    class Person {
        private int age;
        private String name;
        
        public void speak() {
            this.name = "小强";
            this.age = 18;
            System.out.println("name=" + this.name + ",age=" + this.age);
        }
    }
    
    class PersonDemo {
        public static void main(String[] args) {
            Person p = new Person();
            p.speak();
        }
    }

    对象的内存图解:

    class Person {
        private int age;
        public int getAge() {
            return this.age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
    public class PersonDemo {
        public static void main(String[] args) {
            Person p = new Person();
            p.setAge(30);
            System.out.println("大家好,今年我" + p.getAge() + "岁");
        }
    }

    注意:

    ①this到底代表什么呢?this代表的是对象,具体代表哪个对象呢?哪个对象调用了this所在的方法,this就代表哪个对象。

    ②上述代码中的 p.setAge(30)语句中,setAge(int age)方法中的this代表的就是p对象。

    实例:

    判断两个人是不是同龄人

    public class person {
        private String name;
        private int age;
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
        public boolean compare(person p){
            return p.age==this.age;
        }
        public void speak(){
            //程序中有一个就近原则
            //this关键字:用于区分成员变量和局部变量的同名问题
            String name ="李四";
            int age=18;
            System.out.println("我叫"+this.name+",今年"+this.age+"岁了");
        }
    }
    public static void main(String[] args) {
            person p1=new person();
            p1.setName("张三");
            p1.setAge(11);
            p1.speak();
            person p2=new person();
            p2.setName("李四");
            p2.setAge(18);
            boolean flag=p2.compare(p1);
            System.out.println(flag);
        }
  • 相关阅读:
    chrome手动同步书签
    MySQL(5.6/5.7版本)卸载方法
    Windows 搭建IIS+PHP+MySQL环境
    按照innode删除结点
    wsl区分大小win10不区分大小写解决方案
    Docker容器里的centos疑难杂症
    [UGUI]源码调试和修改
    [UnityAPI]EditorWindow类 & Editor类
    [UnityAPI]Selection类
    [Lua]require
  • 原文地址:https://www.cnblogs.com/Ace-suiyuan008/p/9353701.html
Copyright © 2011-2022 走看看