学习数据结构之前的java基础
讲的主要是实战,怎么用代码把数据结构实现一遍。总的来说,先实战,后理论!
面向对象要点
>对象将数据和操作打包在一起,类描述了这一切
>用构造器创建(实例化)对象
>类和类之间的关系
-关联(组合、聚合)
聚合:Teacher ◇ --> Student (弱关联)
组合:Student ◆ --> Name (强关联,拆开对外界没有意义)
-泛化
动物(一般)
▲
| (泛化:更一般,更普通)
人(特殊)
关于继承
父 - (一般) - 水果
字 - (特殊) - 苹果、香蕉
is - a :是一个就用继承
has - a :就用组合
- 祖先类Object:内置顶级类
- 方法重写
- toString方法
- equals方法
关于接口
接口概述
- Comparable接口:如果你想1个类的对象支持比较(排序), 就必须实现Comparable接口
- Comparator接口:该接口代表一个比较器,java数组工具类和集合工具类中提供对sort方法排序就是使用Comparator接口来处理排序的
- Cloneable接口:我们要使用一个对象的clone方法,必须Cloneable接口,否则会抛出CloneNotSupportException
- Serializable接口:是启用其序列化功能的接口,没有实现此接口的类将不能使它们的任意状态被序列化或逆序列化
java中的构造器
构造器是什么
1.构造器,也称构造方法、构造函数。作用是构造出来一个类的实例,确保对象得到初始化。
2.构造器的格式: 权限修饰符 类名(无参/有参){ }
。
3.根据有无参数,可分为无参构造 和有参构造。
构造器的特性
1.与一般方法名不同的是,构造方法名必须和类名保持一致,并且没有返回值。
2.Java编译器会自动创建无参构造函数,因此在类中,无参构造即使没有,我们也可省略不写。实例化对象时无需赋值。
3.倘若类中已存在有参构造函数,则编译器不再提供默认无参构造。实例化对象时需赋值,不然报错。
4.当类实例化一个对象时会自动调用构造方法。
Student类
1 package cn.itcast.Linear_01;
2
3 public class Student {
4 //定义成protected,就可以在子类中访问
5 protected String name;
6 protected int age;
7 protected int ability;
8
9 //想知道老师是谁,就持有一个teacher
10 //聚集(聚合)
11 private Teacher teacher;
12
13 //重写equals方法,自带的
14 @Override
15 public boolean equals(Object o) {
16 if (this == o) return true;
17 if (o == null || getClass() != o.getClass()) return false;
18
19 Student student = (Student) o;
20
21 return name != null ? name.equals(student.name) : student.name == null;
22 }
23
24 @Override
25 public int hashCode() {
26 return name != null ? name.hashCode() : 0;
27 }
28
29 //构造器,idea可生成
30 public Student(String name, int age) {
31 this.name = name;
32 this.age = age;
33 }
34
35 //方法
36 public void study() {
37 ability++;
38 }
39
40 /**
41 * 重写toString方法
42 * @return
43 */
44 @Override
45 public String toString() {
46 return "Student{" +
47 "name='" + name + '\'' +
48 ", age=" + age +
49 ", ability=" + ability +
50 '}';
51 }
52
53 public static void main(String[] args) {
54 Student stu1 = new Student("唐僧", 200);
55 Student stu2 = new Student("悟空", 500);
56 stu1.study();
57 stu1.study();
58 stu2.study();
59
60 System.out.println(stu1.ability);// 2
61 System.out.println(stu2.ability);// 1
62
63 //打印的是地址
64 System.out.println(stu1);
65 System.out.println(stu2);
66
67 //打印的也是地址,toString方法来自Object父类,都默认继承这个方法
68 //如果toString方法不是自己想要的,可以重写toString方法
69 System.out.println(stu1.toString());
70 System.out.println(stu2.toString());
71
72 //重写完toString方法后,输出为: Student{name='唐僧', age=200, ability=2}
73
74
75 //比对的是地址,equals也是来自Object父类
76 System.out.println(stu1.equals(stu2));// false
77 }
78 }
Teacher类
1 package cn.itcast.Linear_01;
2
3 public class Teacher {
4 private String name;
5 private int ability;
6 }
CleverStudent类
package cn.itcast.Linear_01;
public class CleverStudent extends Student{
public CleverStudent(String name, int age) {
super(name, age);
}
//重写
@Override
public void study(){
//super.study();
//super.study();
ability++;
}
//不是重写,因为没有Override,算是新技能
public void study(int s){
ability+=s;
}
}