• 面向对象之封装


    封装是什么?

    首先我们思考一个问题:如何设计一个Person类?

    • 分析:先抽象出这个类的一些属性和方法,Person类都具有姓名和年龄,都可以说话。
    
    class Person
    {
        int age;
    
        void speak()
        {
            System.out.println("age=" + age);
        }
    }
    
    
    • 上面这段代码咋眼一看没有什么问题,但是当我们在创建对象给age属性赋值时就有问题了:
    
    class  PersonDemo
    {
        public static void main(String[] args)
        {
            Person p = new Person();
            p.age = -20;
            p.speak();
        }
    }
    
    

    比如上面代码中的数据明显就是不符合实际的,那么这个时候我们可能会想在赋值之前能不能先进行判断呢?于是:

    
    class Person
    {
        int age;
    
        public void speak(int a)
        {
            if(a > 0 && a < 130)
            {
                age = a;
                speakAge();
            }
            else
                System.out.println("错误的数据");
        }
    
        void speakAge()
        {
            System.out.println("age=" + age);
        }
    }
    
    class  PersonDemo
    {
        public static void main(String[] args)
        {
            Person p = new Person();
    	p.speak(-20);
        }
    }
    
    

    这样做确实能够避免数据被随意赋值的情况,但这种做法有点复杂并且在实体类中进行判断的情况很少见。那么有没有更简单的方法呢?我们可以使用private关键字来修饰age。private是一个权限修饰符,被它修饰的成员只能在本类中访问。但随之而来的问题就是既然age只能在本类中被访问,那么外界如何操作这个变量呢?我们可以在Person类中提供一个公共的方法,通过这个公共的方法来操作age,于是我们就可以这样来定义Person类:

    
    class Person {
        private int age;
    
        public void setAge(int a)
        {
            age = a;
        }
    
        public int getAge() {
            return age;
        }
    }
    
    

    如上所述,这种将数据保护在类的内部,只保留一些公共的方法来与外界进行联系的思想就是封装。这样做可以尽可能地隐藏类内部的细节,使数据更加安全。修改类结构时也很方便。

    在Java中如何体现封装思想?

    • 我们首先应该注意:封装的概念其实很广,而private只是其中的一种体现形式而已。

    • 为了更好地理解封装,这里就再举个例子:比如笔者在刷算法题的时候(关于算法题,可以参考笔者该目录下的文章),有时候会发现字符串反转的方法会被调用很多次,所以这时我们就可以把这个方法单独提出来并用private修饰,因为这个方法只服务于本类。

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
    
            Scanner sc = new Scanner(System.in);
    
            int n = sc.nextInt();
            for(int i = 10001; i <= 999999; i++) {
                int a = i % 10;
                int b = i / 10 % 10;
                int c = i / 100 % 10;
                int d = i / 1000 % 10;
                int e = i / 10000 % 10;
                int f = i / 100000;
                int sum = a + b + c + d + e + f;
                if(reverse(i) && (sum == n)) {
                    System.out.println(i);
                }
            }
        }
    
        private static boolean reverse(int x) {
            String s1 = String.valueOf(x);
            String s2 = new StringBuffer(s1).reverse().toString();
    
            if(s1.equals(s2)) {
                return true;
            }
            else
                return false;
        }
    
    }
    
    
  • 相关阅读:
    Spark ListenerBus 和 MetricsSystem 体系分析
    Scala使用JUnit4单元测试
    Error:java: Compilation failed: internal java compiler error
    Spark 2.2 DataFrame的一些算子操作
    Spark SQL中UDF和UDAF
    Scala基础
    Spark Sql的UDF和UDAF函数
    Kafka笔记整理(二):Kafka Java API使用
    Kafka笔记整理(一)
    【口语英语】小学英语1-6年级听力必备知识汇总,建议收藏!
  • 原文地址:https://www.cnblogs.com/syhyfh/p/12485484.html
Copyright © 2020-2023  润新知