讲解一个继承的实现思路
        
        要求定义一个数组操作类(Array类),在这个类里面可以进行整型数组的操作,由外部传入数组的大小
        ,并且要求实现数据的保存以及数据的输出,同时用户可以在外部调整已有数组大小(只能够扩大数组容量)
        随后在这个类上要求派生出两个子类
            排序类:通过此类取得数据可以进行排序
            反转类:通过此类取得的数组数据要求采用到倒序的方式输出
        在整个的开发过程之中暂时不要去考虑子类的问题,只考虑父类自己的设计
        
        数组的核心操作类:Array
        分析:
            1.类里面可以进行整型数组的操作
            里面应该有一个专门的整型数组

class Array{
private int []data;// 数组并不知道具体的长度
}

2.可以通过外部传入数组的大小,需要提供有一个构造方法,并且这个构造方法里面需要接收一个数组大小的参数

public Array(int lan){// 实例化本类对象时必须设置数组大小
if(len <= 0){
this.data = new int[1]; // 至少维持1个大小的数组
}else{
this.data = new int[len];// 根据传人的大小定义数组长度
}
}

3.保存 数据,根据索引保存

private int foot; // 作为保存的脚标
public boolean add(int num){//如果保存成功返回true,否则是false
if(this.foot<this.data.length){//还有空间可以保存数据
this.data[this.foot ++] = num; // 保存数据的同时改变foot的内容
return true;
}
return false;
}

4.数据的输出不可能在类中直接完成,一定要返回给被调用处处理

public int[] getData(){ // 返回全部数据
return this.data;
}

5.可以在外部调整已有数组大小(只能够扩大数组容量)

public void inc(int size){ // 扩充数组大小,在已有数据基础上扩充
if(size>0){
int[] newData = new int[this.data.length+size];
System.arraycopy(this.data,0,newData,0,this.data,length);
this.data = newData;// 改变引用
}
}

范例:程序的测试

class Array{
private int []data;
private int foot; // 作为保存的脚标
public Array(int len){// 实例化本类对象时必须设置数组大小
if(len <= 0){
this.data = new int[1]; // 至少维持1个大小的数组
}else{
this.data = new int[len];// 根据传人的大小定义数组长度
}
}
public boolean add(int num){//如果保存成功返回true,否则是false
if(this.foot<this.data.length){//还有空间可以保存数据
this.data[this.foot ++] = num; // 保存数据的同时改变foot的内容
return true;
}
return false;
}
public int[] getData(){ // 返回全部数据
return this.data;
}
public void inc(int size){ // 扩充数组大小,在已有数据基础上扩充
if(size>0){
int[] newData = new int[this.data.length+size];
System.arraycopy(this.data,0,newData,0,this.data.length);
this.data = newData;// 改变引用
}
}
}
public class arrayOperation{
public static void main(String args[]){
Array arr = new Array(5);//开始有5个元素
System.out.println(arr.add(90));
System.out.println(arr.add(10));
System.out.println(arr.add(100));
System.out.println(arr.add(60));
System.out.println(arr.add(1));
//if(arr.add(99) == false){
arr.inc(3);// 扩充容量
System.out.println(arr.add(20));
System.out.println(arr.add(30));
System.out.println(arr.add(70));
//}
//int temp [] = arr.getData();
for(int x = 0;x<arr.getData().length;x++){
System.out.println(arr.getData()[x]+",");
}
}
}

2.排序数组类
        对于排序的操作从本质上来讲,与数组Array类的操作区别不大,只不过它最后返回的结果应该是排序的
        getData()方法负责返回结果,但是这个结果没有排序,不过方法名称好用,利用覆写来解决此类问题
        范例:定义排序数组子类

class Array{
private int []data;
private int foot; // 作为保存的脚标
public Array(int len){// 实例化本类对象时必须设置数组大小
if(len <= 0){
this.data = new int[1]; // 至少维持1个大小的数组
}else{
this.data = new int[len];// 根据传人的大小定义数组长度
}
}
public boolean add(int num){//如果保存成功返回true,否则是false
if(this.foot<this.data.length){//还有空间可以保存数据
this.data[this.foot ++] = num; // 保存数据的同时改变foot的内容
return true;
}
return false;
}
public int[] getData(){ // 返回全部数据
return this.data;
}
public void inc(int size){ // 扩充数组大小,在已有数据基础上扩充
if(size>0){
int[] newData = new int[this.data.length+size];
System.arraycopy(this.data,0,newData,0,this.data.length);
this.data = newData;// 改变引用
}
}
}
class SortArray extends Array{ // 排序子类
public SortArray(int len){
super(len);
}
public int[] getData(){
java.util.Array.sort(super.getData());
return super.getData();
}
}
public class arrayOperation{
public static void main(String args[]){
SortArray arr = new SortArray(5);//开始有5个元素
System.out.println(arr.add(90));
System.out.println(arr.add(10));
System.out.println(arr.add(100));
System.out.println(arr.add(60));
System.out.println(arr.add(1));
//if(arr.add(99) == false){
arr.inc(3);// 扩充容量
System.out.println(arr.add(20));
System.out.println(arr.add(30));
System.out.println(arr.add(70));
//}
//int temp [] = arr.getData();
for(int x = 0;x<arr.getData().length;x++){
System.out.println(arr.getData()[x]+",");
}
}
}

子类定义过程之中需要继续保留父类已有功能,当发现功能不合适的时候利用覆写解决此类问题
        
    3.反转子类
        只是在使用getData()方法的时候返回的是一个反转后的结果
        范例:定义排序数组子类

class Array{
private int []data;
private int foot; // 作为保存的脚标
public Array(int len){// 实例化本类对象时必须设置数组大小
if(len <= 0){
this.data = new int[1]; // 至少维持1个大小的数组
}else{
this.data = new int[len];// 根据传人的大小定义数组长度
}
}
public boolean add(int num){//如果保存成功返回true,否则是false
if(this.foot<this.data.length){//还有空间可以保存数据
this.data[this.foot ++] = num; // 保存数据的同时改变foot的内容
return true;
}
return false;
}
public int[] getData(){ // 返回全部数据
return this.data;
}
public void inc(int size){ // 扩充数组大小,在已有数据基础上扩充
if(size>0){
int[] newData = new int[this.data.length+size];
System.arraycopy(this.data,0,newData,0,this.data.length);
this.data = newData;// 改变引用
}
}
}
class SortArray extends Array{ // 排序子类
public SortArray(int len){
super(len);
}
public int[] getData(){
java.util.Array.sort(super.getData());
return super.getData();
}
}
class ReverseArray extends Array{
public ReverseArray(int len){
super(len);
}
public int[] getData(){
int center = super.getData().length/2;
int head = 0;
int tail = super.getData().length-1;
for(int x = 0;x<center:x++){
int temp = super.getData()[head];
super.getData()[head] = super.getData()[tail];
super.getData()[tail] = temp;
head ++;
tail--;
}
return super.getData();
}
}
public class arrayOperation{
public static void main(String args[]){
ReverseArray arr = new ReverseArray(5);//开始有5个元素
System.out.println(arr.add(90));
System.out.println(arr.add(10));
System.out.println(arr.add(100));
System.out.println(arr.add(60));
System.out.println(arr.add(1));
arr.inc(3);// 扩充容量
System.out.println(arr.add(20));
System.out.println(arr.add(30));
System.out.println(arr.add(70));
int temp[] = arr.getData();
for(int x = 0;x<temp.length;x++){
System.out.println(temp[x]+",");
}
}
}

在以后进行代码设计的时候,实际上你设计的初期环境依然是只考虑单独类
            而后在设计子类的时候,如果不是必须的情况下,不用特别多的考虑扩充大量的新方法(优先考虑的是利用覆写这一概念去完善父类的方法)
             以后如果考虑类的继承关系的时候:一个类绝对不要去继承一个已经实现好的类,如果非要继承就去继承抽象类或接口

    4.总结
        面向对象继承关系的设计思路:
            父类的设计很重要,父类中的方法必须要有意义
            子类定义的时候就应该已经可以明确该类的功能是什么
            如果子类在进行操作中发现父类的方法不好用了,优先考虑的是覆写,而不是建立新的方法

菜鸡的Java笔记 实践 - java 数组操作的更多相关文章

  1. 转 Java笔记:Java内存模型

    Java笔记:Java内存模型 2014.04.09 | Comments 1. 基本概念 <深入理解Java内存模型>详细讲解了java的内存模型,这里对其中的一些基本概念做个简单的笔记 ...

  2. RX学习笔记:JavaScript数组操作

    RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...

  3. 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现

    /*  现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息    对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...

  4. java 笔记(4) —— java I/O 流、字节流、字符流

    Java中使用流来处理程序的输入和输出操作,流是一个抽象的概念,封装了程序数据于输入输出设备交换的底层细节.JavaIO中又将流分为字节流和字符流,字节流主要用于处理诸如图像,音频视频等二进制格式数据 ...

  5. Java笔记:Java集合概述和Set集合

    本文主要是Java集合的概述和Set集合 1.Java集合概述 1)数组可以保存多个对象,但数组长度不可变,一旦在初始化数组时指定了数组长度,这个数组长度就是不可变的,如果需要保存数量变化的数据,数组 ...

  6. Java笔记:Java 流(Stream)、文件(File)和IO

    更新时间:2018-1-7 12:27:21 更多请查看在线文集:http://android.52fhy.com/java/index.html java.io 包几乎包含了所有操作输入.输出需要的 ...

  7. 菜鸡的Java笔记第二 - java 数据类型

    1.程序的本质实际上就是在于数据的处理上. JAVA中的数据类型有两类 基本数据类型:是进行内容的操作而不是内存的操作 数值型: 整型:byte(-128 ~ 127),short(-32768 ~ ...

  8. 菜鸡的Java笔记 第九 - java 接收键盘输入

    package mysterious; import java.util.Scanner; public class lianxi { public static void hhh (){ Scann ...

  9. java笔记--理解java类加载器以及ClassLoader类

    类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...

随机推荐

  1. IP多播与NAT地址转化

    IP多播 与单播相比,在一对多的通信中,多播可以大大减少网络资源.在互联网上进行多播就叫做IP多播,IP多播所传送的分组需要使用IP多播地址. 如果某台主机想要收到某个特定的多播分组,那么怎样才能是这 ...

  2. Linkerd stable-2.11.0 稳定版发布:授权策略、gRPC 重试、性能改进等!

    公众号:黑客下午茶 授权策略 Linkerd 的新服务器授权策略(server authorization policy)功能使您可以细粒度控制允许哪些服务相互通信.这些策略直接建立在 Linkerd ...

  3. 反调试——7——CRC检测

    反调试--7--CRC检测 CRC32: CRC的全称是循环冗余校验,作用是为了检测数据的完整性. CRC32的检测原理: 程序被编译后,代码段是固定的,因为已经被写死了. 我们在调试程序的时候,打断 ...

  4. linux 信号与处理

    一.linux信号是什么 基本概念 信号是事件发生时对进程的通知机制,也就是所谓的软件中断.信号和硬件的中断类似,是软件层对中断机制的模拟,在多数情况下是无法预测信号产生的时间,所以软件层提供了一种处 ...

  5. 洛谷3119 草鉴定(tarjan)

    题目大意 约翰有\(n\)块草场,编号\(1\)到\(n\),这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从\(1\)号草场出发,最后回到\(1 ...

  6. SpringBoot使用注解进行分页

    分页使用可以说非常普遍了,有时候会需要非常灵活的方式去开启或关闭分页,尝试使用一下注解的方式来进行分页. 依赖安装 需要使用的依赖: Mybatis-Plus PageHelper SpringBoo ...

  7. Spring Boot 如何热加载jar实现动态插件?

    一.背景 动态插件化编程是一件很酷的事情,能实现业务功能的 解耦 便于维护,另外也可以提升 可扩展性 随时可以在不停服务器的情况下扩展功能,也具有非常好的 开放性 除了自己的研发人员可以开发功能之外, ...

  8. PAT (Basic Level) Practice (中文)1061 判断题 (15分)

    1061 判断题 (15分) 判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过 100 的正整数 N 和 M,分别是学生人数 ...

  9. python中常用的导包的方法和常用的库

    python中常用的导包的方法               导入包和包名的方法:1.import package.module 2.from package.module import  * 例一: ...

  10. UltraSoft - DDL Killer - Alpha 项目展示

    团队介绍 CookieLau fmh 王 FUJI LZH DZ Monster PM & 后端 前端 前端 前端 后端 后端 软件介绍 项目简介 项目名称:DDLKiller 项目描述:&q ...