这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。
一、Object
1.1 概述
- 顶层父类
一个类,如果不继承其他类,默认继承 Object
class A /*extends Object*/ {
}
1.2 方法
- toString() ,获得一个对象的字符串表示。
Object 的默认实现是:
"day0903.Point@a9c104"
"类型@地址" ,如果需要,可以在子类中重写这个方法。
- equals(Object obj) ,当前对象,与参数对象比较是否相等。
Object 中的默认实现是:
比较内存地址
this == obj
如果想比较对象的属性值,可以重写这个方法。
1.3 练习:Object类
package day0903;
public class Point /*extends Object*/ {
int x;
int y;
//alt+shift+s,
//generate constructor using fields
public Point(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "("+x+", "+y+")";
}
@Override
public boolean equals(Object obj) {
//参数obj是否是 Point 类型
if(obj instanceof Point) {
Point p = (Point) obj;
return this.x == p.x && this.y == p.y;
}
return false;
}
}
package day0903;
public class Test1 {
public static void main(String[] args) {
Point a = new Point(3,4);
Point b = new Point(3,4);
System.out.println(a);
System.out.println(a.toString());
System.out.println(">>>"+a);
System.out.println("---------------");
System.out.println(a == b); // 比的是内存地址
System.out.println(a.equals(b));
}
}
1.4 练习:编写“数组列表类”
- 数组
1.长度固定
2.插入或删除数据,操作繁琐
- 数组列表,针对数组类型的缺点,封装数组的繁琐操作,提供便利易用的方法。
add() 向末尾添加
get(i) 访问i位置数据
size() 数据的数量
remove(i) 从i位置移除数据
package 练习;
import java.lang.reflect.Array;
import java.util.Arrays;
/*
* @title数组列表类
* 封装数组的繁琐操作
* add()方法,自动扩展数组空间并添加数组
* get()下标访问数组数据
* size()数组中数据的数量,而不是空间大小
* remove()删除指定下标数据
*/
/* 泛型,是一种类型参数。<>中定义的是一个变量,使用时传入一个数据类类型。
* 例如,<String>,<Student>
*/
public class ShuZuLieBiao<T> {
T[] a;
int index;
public ShuZuLieBiao() {
this(10);
}
public ShuZuLieBiao(int length) {
a = (T[]) new Object[length];/*泛型本质上是Object类型,但在创建时,还要
将创建的Object[]转型为T[]类型,以便使用*/
}
public void add(T t) {
// 确认容量是否可以添加新数据
queRenRongLiang();
a[index] = t;
index++;
}
public T get(int i) {
// 检查范围
jianChaFanWei(i);
// 合法情况下,返回下标数据
return a[i];
}
public int size() {
return index;
}
public T remove(int i) {
// 检查范围
jianChaFanWei(i);
// 取出i位置的值,用于返回,用户确认删除的数据
T t = a[i];
// 将[i+1,index)范围的值,向前复制1位
System.arraycopy(a, i+1, a, i, index-1-i);;
a[index-1] = null; // 末尾数据置null
index--; // 下标自减
return t;
}
private void jianChaFanWei(int i) {
// 检查访问下标是否合法,非负且下标未越界
if (i < 0 || i >= index) {
// 抛出异常,表示出错
throw new IndexOutOfBoundsException("下标:" + i);
}
}
// 确认容量
private void queRenRongLiang() {
// 还有空余位置
if(index<a.length) {
return;
}
// 当容量不足时,自动增加数组的容量。新增的容量 = 现有数组容量的一半 + 2
// 为了避免构造0长度数组,造成无法增加空间,在此+2
int n = a.length +a.length/2 +2;
a = Arrays.copyOf(a, n);// 将a数组对象复制到一个新建的长度为n的数组中,并用引用变量a指向
}
}
package练习;
public class Test1 {
public static void main(String[] args) {
// 泛型的类型参数不支持基本类型,可以用对应的包装类代替
ShuZuLieBiao<String> d1 = new ShuZuLieBiao<String>(5);
for(int i = 0;i<5;i++) {
d1.add("A"+i);
}
System.out.println("数组数据长度:"+d1.size());
System.out.println("数组下标4的数据:"+d1.get(4));
d1.add("X");
d1.add("Y");
d1.add("Z");
System.out.println("数组数据长度:"+d1.size());
System.out.println("数组下标6的数据:"+d1.get(7));
System.out.println("删除下标为4的数据"+d1.remove(4));
System.out.println("数组下标6的数据:"+d1.get(6));
}
}