封装

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);
    }
}
数组与对象的应用

 

posted on 2019-07-13 15:36  幸福的小耗子  阅读(141)  评论(0编辑  收藏  举报