day09 面向对象编程

1、对象关联

对象和属性是隶属关系,即对象拥有属性,属性被对象拥有

对象传递和对象关联的区别是什么?

对象传递:对象和方法之间关系松散 实参-形参

对象关联:关系紧密,一个对象拥有另外一个类的对象,目的是在本对象中方便使用另一个对象

如何关联呢?

在一个类中 把另一个类的对象作为本类的属性

一旦添加了属性,就要进行以下操作:

1、调整构造器

2、提供get。set方法

3、 改造say()方法

对象关联的真实动作,是通过构造器完成

package com.atguigu.javase.javabean;

public class Person {

    private String name;
    private int height;
    private int weight;
    private Phone myphone;//添加属性

    public Person(){}

    //调整构造器
    public Person(String name,int height,int weight,Phone phone){
        this.name = name;
        this.height = height;
        this.weight = weight;
        this.myphone = phone;
    }

    public void setName(String name){
        this.name  = name;
    }
    public String getName(){
        return name;
    }
    public  void setHeight(int height){
        this.height = height;
    }
    public int getHeight(){
        return height;
    }
    public void setWeight(int weight){
        this.weight = weight;
    }
    public int getWeight(){
        return weight;
    }
   //添加set  get方法
    public void setPhone(Phone phone){
        this.myphone = phone;
    }
    public Phone getPhone(){
        return myphone;
    }

    //调整say()方法
    public String say(){
        return "姓名:"+name+"  身高:"+height+" 体重:"+weight+" 手机参数:"+myphone.say();
    }

    public void wangzhe(){
        System.out.println(name+"在使用手机["+myphone.say()+"]玩王者荣耀");
    }

    public void taobao(){
        System.out.println(name+"使用手机["+myphone.say()+"]逛淘宝");
    }

}

2、数组与for循环

完美数组 :所有的数组元素都是有效对象没有空洞

结构良好数组 :前面都是连续的有效对象,后面是连续的空洞

扩容数组   遍历是需要注意空洞

经典for循环和增强性for循环的联系和区别

联系:两者是等价的

区别:

1)增强性for循环也称为foreach循环,其优点是只读、安全、简单

        格式:

        for(数组元素类型 临时变量 :数组名){

                访问临时变量

         }

        它隐藏了数组下标

        for(Student tmp:stuArr){
            System.out.println(tmp.say());
        }

2)找最大值要用下标法,必须用经典for循环;而增强for循环用于遍历

 //创建一个小容量的数组对象
        Student[] newArr = new Student[stuArr.length-6];
        //将老数组对象里的前几个存入新数组对象中
        for (int i = 0; i < newArr.length; i++) {//i 右边的值,谁短就写谁 因为下面刷值操作是大的往小的里放才不会出现空指针异常现象
            newArr[i] = stuArr[i];
        }
        //让老数组也指向新数组的内存地址
        stuArr = newArr;
        //此时老数组也已经指向了新数组,输出的一定是老数组中存的对象
        for (Student s : stuArr) {
            System.out.println(s.say());
        }

   


3、数组算法

反转:首位交换

 for (int i = 0; i < stuArr.length / 2; i++) {
            Student tmp = stuArr[i];
            stuArr[i] = stuArr[stuArr.length-i-1];
            stuArr[stuArr.length -i - 1] = tmp;
        }
        for (Student s : stuArr) {
            System.out.println(s.say());
        }

数组缩减

1)新建一个容量小的数组

2)依此复制元素到新数组,复制的个数为短的为准

3)老引用指向新数组对象,老数组对象变垃圾

分析图

代码分析 

//将学生对象数组缩减为1/3
        Student[] newArr = new Student[stuArr.length/3];//创建新的容量比较小的数组对象
        for (int i = 0; i < newArr.length; i++) {
            newArr[i] = stuArr[i];//复制数组元素到新的数组中,个数以新的为主
        }
        stuArr = newArr;//老引用指向新的数组对象,之前的老数组对象变成垃圾

        for(Student tmp:stuArr){
            System.out.println(tmp.say());//输出的是新数组中的对象元素 因为stuArr的地址已经发生改变
        }
    }

数组扩容

本质上和数组扩容一样

//扩容的原理和缩减的原理是一样的
        //创建一个容量足够大的数组对象
        Student[] newArr = new Student[(int)(stuArr.length*1.5)];//特别要注意类型转换
        //将老数组中的对象存入新数组之中,i右边的范围要是两者中短的哪一个
        for (int i = 0; i < stuArr.length; i++) {
            newArr[i] = stuArr[i];
        }
        //让老数组也指向新数组得地址
        stuArr = newArr;

        for (Student s : stuArr) {
            //这里会出现一个空洞问题 那么我们就要进行判断 如果数组元素为null 不.say()  否则.say()
            if(s != null){
                System.out.println(s.say());
            }else{
                System.out.println(s);
            }
        }

取子数组

1)创建容量足够大的新数组,防止全是有效元素
2)声明计数器,初始值为0,共功能有2:a.本质功能 b.新元素插入到新数组时的下标
3)遍历老数组
4)查找符合条件的数据
5把符合条件的元素插入到新数组中,下标由计数器指示
6)调整计数器
7)把新数组缩减为计数器个数的数组

分析图

 代码实现

 //创建一个和老数组一样大的新数组,用来存放取出来的对象
        Student[] newArr = new Student[stuArr.length];
        //设置一个计数器  其作用有二  1.用来记录满足条件的数的个数 2.用来指示下一个数的下标
        int count = 0;
        //遍历老数组 找出符合条件的对象
        for (int i = 0; i < stuArr.length; i++) {
            if(stuArr[i].getGrade() == 3){
                //如果符合条件,就要将老数组中的对象传给新数组
                newArr[count] = stuArr[i];//把这个对象放在新数组的count位置上 使其成为一个结构良好的数组(有来连续的有效值)
                count++;
            }
        }
        //再创建一个最终数组,用来存放新数组中的对象,使之成为一个完美数组(没有空值)
        Student[] finalArr = new Student[count];//count位置前的数都是新数组中的有效位置
        for (int i = 0; i < count; i++) {
            finalArr[i] = newArr[i];
        }
        //并不用提防空洞现象,因为如果不满足条件的话,数组中就什么也没有 就好像一个没放任何东西的空抽屉
        for (Student f : finalArr) {
            System.out.println(f.say());
        }

删除一个元素

1)把要删除的下标置为空洞

2)把右面搜友有效对象整体左移

3)把之前最的后的元素处置空

4)调整计数器

分析图

代码实现

//将要删除的元素下标置为空
        int index = 4;  //删除下标是四的元素
        //设置count用来标记空洞的前一个位置,也是本省数组的长度 这样做是因为我们只处理有效元素 如果后面有很多null 就可以不用做处理
        int count = 10;
        //对从index开始到count-1结束的元素进行移动
        stuArr[index] = null;
        for (int i = index; i < count-1; i++) {//这里之所以要设置成count-1 是因为最后一个数字移动到前面,那里会变成空洞
            stuArr[i] = stuArr[i+1];
        }
        //对count进行操作让它移动到重复的哪一个元素的位置 并设置为空洞
        stuArr[count-1] = null;
        //这里要count--是因为删除了一个元素 所以长度就减一
        count--;

        for (int i = 0; i < count; i++) {
            System.out.println(stuArr[i].say());
        }

冒泡排序

//冒泡排序
for (int i = 0; i < stuArr.length; i++) {
    for (int j = 0; j < stuArr.length-1-i; j++) {
        if(stuArr[j].getScore() > stuArr[j+1].getScore()){
            Student t =  stuArr[j];
            stuArr[j] = stuArr[j+1];
            stuArr[j+1] = t;
        }
    }
}

4、Debug模式

跟踪程序的执行,让程序慢动作

快捷键:

F7 是进入代码细节

alt+shift+F7 进入代码底层细节

shift+F8 强行推出

F8 执行当前行


总结

今天学习的内容

1)对象关联;

2)数组与增强for循环;

3)数组算法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值