zoukankan      html  css  js  c++  java
  • Java 面向对象三大特性之封装

    封装

    1、什么是封装?

      隐藏事物的属性和实现细节,对外提供公共的访问方式。

    2、封装的好处

      提高了代码的安全性

      隐藏了代码的实现细节

      提高了代码的复用性

    3、封装的原则

      隐藏事物的属性

      隐藏事物的实现细节

      对外提供访问方式

    4、private 关键字

      (1)private单词:私有的。

      (2)可以修饰的内容
          修饰成员变量
          修饰成员方法
          修饰构造方法
          修饰内部类
      (3)修饰之后的效果
          被private修饰的成员,只能在本类中访问,不能在外界其它类中访问。
          private只是封装的一种体现形式,封装还可以使用其它的修饰符来完成。

    5、Getter()和Setter()方法

      为类中的私有属性对外提供修改和访问的方法

    6、变量访问原则和this关键字

      变量访问遵循就近原则

      this关键字:

        表示当前类型当前对象的引用

        哪个来调用this所在的方法,this就代表哪个对象

       作用:用于区分局部变量和成员变量同名的情况。使用this.属性名称的一定是成员变量,没有使用this.的变量,

         根据就近原则来确定使用哪个变量。

    public class Test1 {
    
        public static void main(String[] args) {
            Person p = new Person();
            p.test();
    
        }
    
    }
    class Person{
        int age=5;
        public void test() {
            int age = 10;
            System.out.println(age);
        }
    }

     7、构造方法

      1.什么是构造方法?构造函数,构造器Constructor

      2.有什么作用?用于给对象中的变量赋值,在创建对象时会自动调用构造方法,

       如果没有写构造方法,会自动执行一个无参的构造方法,但只要自己定义了,无论有参无参,都不会自动调用了

      3.构造方法的定义格式:

         修饰符  方法名称(参数列表){方法体}

      4.构造方法的格式说明:

        构造方法的名称必须与类名完全一致

        构造方法没有返回值,void 也不用写

        构造方法没有return语句,或者直接写return;

      5.注意事项  

        构造方法不需要手动调用,由JVM虚拟机在创建对象时候自动调用

        对象本身不能调用构造方法

        构造方法只能调用一次(一个对象),就在对象创建的时候

        构造方法可能发生重载

      6.构造方法和set的比较 

        1、构造方法和set方法都是用于给成员变量赋值。不希望外界直接访问私有成员变量,

          通过构造方法或者set方法,间接的访问私有变量。

        2、区别:

           构造方法是在创建对象的同时,由jvm自动调用执行,用于给属性赋值,只能执行一次

           set方法是在创建对象之后,由对象手动调用执行,用于给属性修改值,可以调用多次

        3、使用场景比较:

           一般set方法使用更加灵活,使用更加频繁

           构造方法只能在创建对象的时候被自动调用一次,代码更加简洁。

          一旦对象创建成功,就不能继续使用构造方法修改成员变量的值

    8、对象创建内存理解

      创建对象时有三个初始化过程:

        构造方法初始化

        默认初始化

        显示初始化  eg:int a =3;

      三者顺序:默认初始化  显示初始化  构造方法初始化

      创建对象的过程:

         1、将创建的对象所属类型加载到方法区

          2、在栈内存中创建对象的引用,将来用于存储对象的地址

          3、在堆内存中开辟内存空间,给成员变量分配内存

          4、给成员变量默认初始化赋值

          5、给成员变量显式初始化赋值

          6、给成员变量构造方法初始化赋值

          7、将对象的地址,赋值给栈内存中的引用

    /*
        3、设计一个类Student,该类包括姓名、学号和成绩。
        设计一个方法,按照成绩从高到低的顺序输出姓名、学号和成绩信息。[选做题]
    */
    import java.util.Arrays;
    class Homework3 
    {
        public static void main(String[] args) 
        {
            StudentManager sm = new StudentManager(5);
            sm.add(new Student("h1",01,50));
            sm.add(new Student("h2",02,60));
            sm.add(new Student("h3",03,70));
            sm.add(new Student("h4",04,30));
            sm.add(new Student("h5",05,20));
            sm.add(new Student("h5",05,20));
            System.out.println("数组的长度为"+sm.length());
            Student h5 = sm.find(05);
            h5.show();
            sm.printAll();
            System.out.println("-------------------------");
            sm.paixu();
            sm.printAll();
        }
    }
    class StudentManager
    {
        private Student[] sdm = null;
        private int count = 0;//记录当前数组的元素个数
        public StudentManager(int size){
            if (size>0)
            {
                sdm = new Student[size];
            }else {
                sdm = new Student[5];
            }
        }
        //添加
        public void add(Student a){
            if (count>=sdm.length)//数组已满需扩充
            {
                //扩充到原来的两倍 sdm.length*2
                int newlen = sdm.length*2;
                sdm = Arrays.copyOf(sdm,newlen);
            }
            sdm[count] = a;
            count++;
            
        }
        //返回数组长度
        public int length(){
            return sdm.length;
        }
        //按成绩排序
        public void paixu(){
            for (int i=0; i<count-1;i++ )
            {
                for (int j=0; j<count-1-i;j++ )
                {
                    /*if(arr[j]>arr[j+1]){
                        int temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;}*/
                    if(sdm[j].getScore()>sdm[j+1].getScore()){
                        Student temp = sdm[j];
                        sdm[j] = sdm[j+1];
                        sdm[j+1] = temp;
                    }
                }
            }
        }
        //更新数据
        public void update(Student c){
            Student temp = find(c.getId());
            if (temp!=null)
            {
                temp.setName(c.getName());
                temp.setScore(c.getScore());
            }
        }
        //删除
        public void delete(int id){
            for (int i=0;i<count;i++ )
            {
                if (sdm[i].getId()==id)
                {
                    for (int j=i; j<count-1;j++ )
                    {
                        sdm[j]=sdm[j+1];
                    }
                    sdm[count-1]=null;
                    count--;
                    break;
                }
            }
        }
        //打印
        public void printAll(){
            for (int i=0;i<count;i++)
            {
                sdm[i].show();
            }
        }
        //查找
        public Student find(int id){
            for (int i=0;i<count;i++ )
            {
                if (sdm[i].getId()==id)
                {
                    return sdm[i];
                }
            }
            return null;
        }
        
    }
    class Student
    {
        private String name;
        private int id ;
        private int score;;
        public Student(){}
        public Student(String name,int id,int score){
            this.name = name;
            this.id = id;
            this.score = score;
        }
        public void setName(String name){
            this.name=name;
        }
        public String getName(){
            return name;
        }
        public void setId(int id){
            this.id = id;
        }
        public int getId(){
            return id;
        }
        public void setScore(int score){
            this.score =score;
        }
        public int getScore(){
            return score;
        }
        public void show(){
            System.out.println("姓名:"+name+"..学号:"+id+"成绩:"+score);
        }
    }
    数组与对象的应用
  • 相关阅读:
    非阻塞式线程安全列表-ConcurrentLinkedDeque
    计数器
    Linux 查看服务器内存使用情况
    Oracle to_date, to_timestamp
    Hibernate session.flush() 使用
    阿里规约认证(题库附答案)
    多态性
    Java数据类型
    String类特点分析
    数组的定义
  • 原文地址:https://www.cnblogs.com/xfdhh/p/11180826.html
Copyright © 2011-2022 走看看