JAVA_TOJAVASE_Day0809(面向对象,数组工具的建立和对象继承、单例设计模式、抽象类)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhaostrong/article/details/79708306

面向对象,数组工具的建立和对象继承

这里写图片描述

这里写图片描述

优化:

package com.ttzx.study.utils;
/**
 * 建立一个用于操作数组的工具类,其中包含着常见的对数组操作的函数,如:最值排序等。
 * @author 子龙
 * @version V1.0
 *
 */
public class ArrayTool {

    private ArrayTool() {}//该类中的方法都是静态的,所以该类是不需要创建对象的,为了保证不让其他的创建该类对象可以将构函数私有化
    /**
     * 获取整型数组的最大值
     * @param arr 传入整型数组。
     * @return 返回该数组中的最大元素值。
     */
    public static int getMax(int[] arr) {
        int maxIndex = 0;
        for (int x = 1; x < arr.length; x++) {
            if (arr[x] > arr[maxIndex]) {
                maxIndex = x;
            }
        }
        return arr[maxIndex];
    }
    /**
     * 对数组选择排序
     * @param arr 接收一个int类型的数组
     */
    public static void selectSort(int[] arr) {
        for (int x = 0; x < arr.length - 1; x++) {
            for (int y = x + 1; y < arr.length; y++) {
                if (arr[x] > arr[y]) {
                    swap(arr, x, y);
                }
            }
        }
    }
    /*
     * 用于给数组进行元素的位置置换
     * @param arr int类型的数组
     * @param x   需要置换元素的角标
     * @param y   需要置换元素的角标
     */
    private static void swap(int[] arr, int x, int y) {
        int temp = arr[x];
        arr[x] = arr[y];
        arr[y] = temp;
    }
    /**
     * 获取指定的元素在指定数组中的索引
     * @param arr 要查询的int数组
     * @param key 要找的元素
     * @return      返回元素第一次出现的位置,如果不存在返回-1
     */
    public static int getIndex(int[] arr, int key) {
        for (int x = 0; x < arr.length; x++) {
            if (arr[x] == key) {
                return x;
            }
        }
        return -1;
    }

    /**
     * 整型数组转字符串 格式是[ e,e2,e3.....]
     * @param arr 接收整型的int数组 
     * @return 返回一个固定格式的字符串
     */
    public static String arrayToString (int []arr) {
        String str="";
        for(int i=0;i<arr.length;i++) {
            if(i!=arr.length-1) {
                str=str+arr[i]+",";
            }else {
                str=str+arr[i]+"]";
            }
        }
        return str;
    }

}

注意当使用javadoc 导出文档注释时,需要添加-encoding UTF-8 -charset UTF-8如下:

将-encoding UTF-8 -charset UTF-8这一段复制到elipse的相应输入框中,如下图:

这里写图片描述

这里写图片描述

面向对象 设计模式——单例设计模式 概述、体现

这里写图片描述

输出的结果是 true

这里写图片描述

单例设计模式 ——懒汉式

这里写图片描述

饿汉式(实际都用饿汉式较多。)

这里写图片描述

面相对象之继承

概述

这里写图片描述

这里写图片描述

java中支持单继承,不直接支持多继承,但对C++中的多继承机制进行改良

这里写图片描述

成员变量的体现:

这里写图片描述

成员方法的体现:

这里写图片描述

输出的结果是:这里写图片描述

什么时候用覆盖操作
这里写图片描述

面向对象——继承,子父类构造函数,子类的实例化过程

package com;
/**
 * 在子类构造对象时,发现访问子类构造函数,父类也运行了。
 * 为什么呢?
 * 原因是:在子类的构造函数中第一行有一个默认的隐式语句。super()
 * @author Administrator
 *
 */
public class ExtendsDemo3 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ExtendsDemo3().new Zi();
    }

    class Fu{

        public Fu() {
            // TODO Auto-generated constructor stub
            System.out.println("Fu...");
        }

    }
    class Zi extends Fu{
        public Zi() {
            //super();//调用的就是弗雷中的空参数的构造函数
            // TODO Auto-generated constructor stub
            System.out.println("Zi...");

        }
    }

}


package com;

public class ExtendsDemo33 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ExtendsDemo33().new Zi();
    }
    //为什么子类实例化的时候要访问父类中的构造函数?
    //那是因为子类继承父类,获取到了父类中内容,所以在使用父类内容之前,要先看父类是如何对自己的内容进行初始化的。
    //所以子类在构造对象时,必须访问父类中的构造函数。
    //为什么完成这个必须的动作,就在子类的构造函数中加入super()语句
    //如果父类中没有定义空参数构造函数,那么子类的构造函数必须用super明确要调用父类中的那个构造函数。同时子类构造函数中如果使用this调用了本类构造函数时,那么super就没有了,因为super和this都只能定义第一行,所以只能有一个。
    但是可以保证的,子类中肯定会有其他的构造函数来访问父类的构造函数
    //注意super语句必须要定义在子类构造函数的第一行,因为父类的初始化先完成。


    class Fu{

        public Fu() {
            // TODO Auto-generated constructor stub
            System.out.println("Fu...A");
        }
        public Fu(int x) {
            //super();//调用的就是父类中的空参数的构造函数
            // TODO Auto-generated constructor stub
            System.out.println("Fu...B"+x);

        }
    }
    class Zi extends Fu{
        public Zi() {
            //super();//调用的就是父类中的空参数的构造函数
            // TODO Auto-generated constructor stub
            System.out.println("Zi...C");

        }
        public Zi(int x) {

            System.out.println("Zi...D"+x);

        }
    }
}

面向对象——继承,子父类构造函数,子类的实例化过程(细节)

package com;

public class T {

    public static void main(String[] args) {
        Zi z = new T().new Zi();
        z.show();
    }

    class Fu {

        public Fu() {
            super();
            show();
            return;
        }

        void show() {
            System.out.println("fu.....show");
        }

    }

    class Zi extends Fu {

        int num = 8;

        public Zi() {
            super();
            //通过super初始化父类内容时,子类的成员变量并未显示初始化。等super()父类初始化完毕后,才进行初始化。
            System.out.println("zi cons run...."+num);
            return;
        }

        void show() {
            System.out.println("zi show " + num);
        }

    }

    /**
     * 一个对象实例化过程:
     * Person p=new Person();
     * 
     * 1.JVM 会读取指定的路径下的Person.class 文件,并加载进内存,
     * 并会先加载Person的父类(如果有直接的父类的情况下)。
     * 2.在堆内存中开辟空间,分配地址。
     * 3.并在对象空间中,对对象中的属性进行默认初始化。
     * 4.调用对应构造函数进行初始化
     * 5.在构造函数中,第一行会先调用父类中的构造函数,进行初始化。
     * 6.默认初始化完毕后,在对子类的属性显示初始化。
     * 7.在进行子类构造函数的特定初始化
     * 8.初始化完毕后,降低至值赋值给引用变量。
     *  
     */
    //输出的结果是:
    zi show 0
    zi cons run....8
    zi show 8

}

final 关键字

package com.myfinal;

public class StudyFinal {
/*
 * 继承弊端: 打破了封装性
 * 
 */
    /**
     * final 关键字
     * 1.final 是一个修饰符,可以修饰类,方法,变量。
     * 2.final 修饰的类不可以被继承。
     * 3.final修饰的方法不可以被覆盖。
     * 4.final修饰的变量是一个常量,只能赋值一次。
     * 
     * 为什么要用fianl 修饰变量,其实在程序如果一个数据是固定的。
     * 那么直接使用这个数据就可以了,但是这样阅读性差,所以它该数据七个名称。
     * 而且这个变量名称值不能变化,所有加上final固定。
     * 
     * 写法规范,常用所有字母大写,如果多个单词连接用_连接。
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

面向对象 抽象类

package myAbstract;

public class AbstractDemo {

    /*
     * 抽象类: 抽象:笼统、模糊,看不懂!不具体。
     */
    public static void main(String[] args) {

    }

    /**
     * DemoA和DemoB 具体功能不一样
     * 
     * @author Administrator
     *
     */
    class DemoA extends Demo {

        @Override
        void show() {
            System.out.println("demoa show");
        }

    }

    class DemoB extends Demo {

        void show() {
            System.out.println("demob show");
        }
    }
}
package myAbstract;

public abstract class Demo {

    abstract void show();
}

面向对象抽象类的特点:

 * 特点:
     *  1.方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。
     * 抽象方法必须定义在抽象类中,该类必须也是abstract。
     *  2.抽象类不可以被实例化,为什么?因为调用抽象方法没有意义。
     * 3.抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化。否则这个子类还是抽象类。

面向对象抽象类细节:

/**
     * 1.抽象类中有构造函数吗?
     * 
     * 有 ,用于给子类对象进行初始化。
     * 
     * 2.抽象类可以不定义抽象方法吗?
     * 可以,目的是不让这个类创建对象。AWT的适配器对象就是这种类。
     * 通常这个类中的方法有方法体,但是却没有内容。
     * 
     * 
     * 3.抽象类关键字不可以和那些关键字共存?
     * 
     * private 不行,如修饰了抽象方法,不能被子类覆盖了。
     * static 不行,如果能用static 就不需要在创建对象了,那就直接用类名.方法名。但是方法没有方法体没有任何意义。
     * final 不行,final 修饰的不能被继承,所以这个抽象类也就不能继承了,也就没有啥意义
     * 
     * 
     * 4.抽象类和一般类的异同点?
     *  相同点:
     *      抽象类和一般来都是用类描述事物的,都在内部定义了成员。
     * 不同:
     * 1.一般类有足够的信息描述事物。
     * 抽象类描述事物的信息可能不足。
     * 2.一般类中不能定义抽象方法,只能定义非抽象方法
     * 抽象类中可以定义抽象方法,也可以定义非抽象方法。
     * 3.一般类可以被实例化,抽象类不可以实例化。
     */

面向对象抽象类 ——练习

猜你喜欢

转载自blog.csdn.net/zhaostrong/article/details/79708306