一阶段:第5天:多态(7.29)
一.常用方法
1.1 equals()方法
"=="操作符与equals方法的区别:
1 "==" 比较基本类型比较的是数据 ,引用类型比较对象的引用(地址)
2 默认情况Object中equals和"=="一样
3 String类型重写了Object中的equals,所以String比较使用equals方法。
1.2 hashCode()方法
返回该对象的哈希码值(理解为对象的地址)。每一个对象的哈希码值唯一
System.identityHashCode(stu1);//调用重写之前的hashCode()
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = obj2;
//obj2与obj3两个对象的哈希码值一样
System.out.println(obj1.hashCode());
System.out.println(obj2.hashCode());
System.out.println(obj3.hashCode());
1.3 getClass()方法
返回此Object的运行时类。获取某个类的类对象。
Object obj = new Object();
Class cls = obj.getClass();//通过反射获取到了Object类
1.4 toString()方法
返回该对象的字符串表示。可以在自定义类中重写toString方法,以实现是对象转成指定格式的字符串。
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
二.常用关键字
2.1 instanceof关键字
我们可以通过instanceof关键字判断引用指向的实例是否可以进行强制转换成某个子类对象
if (pet instanceof Dog) {//如果pet是Dog类型
Dog dog = (Dog) pet;
dog.playBall();
}
2.2 final关键字
在Java中声明类、属性和方法时,可以使用关键字final来修饰。
- final修饰成员变量或局部变量,则成为(符号)常量,只能赋值一次,用大写字母表示。作用:提高程序执行效率
(1)修饰成员变量时,定义时同时给出初始值,或在构造方法中赋值
(2)修饰局部变量时,只能赋值一次 - final修饰方法,则该方法不能被子类重写,能被继承
- final修饰类,则类不能被继承
三.多态
- 多态:同一个父类引用类型,使用不同的子类实例而执行不同操作 ,一句话理解:父类变量,子类对象。
- 多态实现步骤
(1) 编写父类、子类,子类重写父类方法。
(2) 运行时,使用父类变量,子类的对象。(编译时看父类,运行时看子类) - 多态使用形式
(1) 使用父类作为方法形参实现多态
(2) 使用父类作为方法返回值实现多态 - 向上转型、向下转型
(1) 向上转型:父类表示的数据范围比子类要大,所以子类对象可以自动向上转型成父类
a. <父类型> <引用变量名> = new <子类型>();
b. 此时通过父类引用变量调用的方法是子类重写或父类的方法,编译时看父类,运行时看子类
c. 此时通过父类引用变量无法调用子类特有的属性和方法
(2) 向下转型:子类创建变量,赋值的是父类的对象,在向下转型的过程中,如果没有转换为真实子类类型,会出现类型转换异常ClassCastException
向下转型有一个前提:必须先向上转型,才能向下转型
Pet p=new Dog();//向上转型
Dog d=(Dog) p;//向下转型
四.综合实例-电话本
public class StartMenu {
public static void main(String[] args) {
System.out.println("---------欢迎使用电话本管理系统v1.0---------");
PhoneBook phoneBook=new PhoneBook();
Scanner input=new Scanner(System.in);
mm:do {
System.out.println("-------1.添加联系人------");
System.out.println("-------2.查找联系人------");
System.out.println("-------3.查看所有联系人---");
System.out.println("-------4.修改联系人------");
System.out.println("-------5.删除联系人------");
System.out.println("-------6.退出系统--------");
System.out.println("请选择:");
int choice=input.nextInt();
switch (choice){
case 1:
Linkman linkman=inputLinkman();
phoneBook.addLinkman(linkman);
break;
case 2:
System.out.println("请输入您要查找人的姓名");
String name=input.next();
phoneBook.searchByName(name);
break;
case 3:
phoneBook.findAll();
break;
case 4:
System.out.println("请输入要修改联系人的id");
int id=input.nextInt();
Linkman linkman1=phoneBook.modify(id);
System.out.println("请输入新的姓名");
String newname=input.next();
System.out.println("请输入新的电话");
String phone=input.next();
linkman1.setName(newname);
linkman1.setPhone(phone);
break;
case 5:
System.out.println("请输入要删除的联系人的id");
int id2=input.nextInt();
phoneBook.delete(id2);
break;
case 6:
break mm;
default:
System.out.println("输入有误,请重新输入");
}
} while (true);
System.out.println("谢谢使用");
}
public static Linkman inputLinkman(){
Scanner input=new Scanner(System.in);
System.out.println("请输入姓名:");
String name=input.next();
System.out.println("请输入性别");
String gender=input.next();
System.out.println("请输入年龄");
int age=input.nextInt();
System.out.println("请输入电话号码");
String phone=input.next();
System.out.println("请输入身份证号");
String identity=input.next();
Linkman linkman=new Linkman(name,gender,age,phone,identity);
return linkman;
}
}
public class PhoneBook {
//电话本联系人数组固定200
private Linkman[] linkmans=new Linkman[200];
private int count=0;//联系人实际个数
//1.新增联系人
public void addLinkman(Linkman linkman){
if (count>=200){
System.out.println("对不起,电话本已满");
return;
}
linkmans[count]=linkman;
count++;
}
//2.查找符合条件的所有联系人
public void searchByName(String name){
System.out.println("查找结果:");
int temp=0;
for (Linkman linkman : linkmans) {
if (linkman!=null){
if (linkman.getName().equals(name)){
temp++;
System.out.println(linkman.toString());
}
}else {
break;
}
}
if (temp==0){
System.out.println("该联系人不存在");
}
}
//3.查找所有联系人
public void findAll(){
System.out.println("联系人信息");
for (Linkman linkman : linkmans) {
if (linkman!=null){
System.out.println(linkman.toString());
}else {
break;
}
}
}
//4.选择一个联系人修改信息
public Linkman modify(int id){
for (Linkman linkman : linkmans) {
if (linkman!=null){
if (linkman.getId()==id){
return linkman;
}
}else {
break;
}
}
return null;
}
//5.删除---根据编号删除
public void delete(int id){
//查找要删除的元素的下标
int index=-1;
for (int i = 0; i < count; i++) {
if (linkmans[i].getId()==id){
index=i;
break;
}
}
if (index!=-1){
for (int i = index; i < count-1; i++) {
linkmans[i]=linkmans[i+1];
}
linkmans[count-1]=null;
System.out.println("删除成功...");
count--;//把联系人减少一个
}else {
System.out.println("要删除的联系人不存在");
}
}
}
public class Linkman {
private int id;
private String name;
private String gender;
private int age;
private String phone;
private String idcard;
private static int count=1;
public Linkman() {
this.id=count;
count++;
}
public Linkman(String name, String gender, int age, String phone, String idcard) {
this.id=count;
count++;
this.name = name;
this.gender = gender;
this.age = age;
this.phone = phone;
this.idcard = idcard;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getIdcard() {
return idcard;
}
public void setIdcard(String idcard) {
this.idcard = idcard;
}
public static int getCount() {
return count;
}
public static void setCount(int count) {
Linkman.count = count;
}
@Override
public String toString() {
return "Linkman{" +
"id=" + id +
", name='" + name + '\'' +
", gender='" + gender + '\'' +
", age=" + age +
", phone='" + phone + '\'' +
", idcard='" + idcard + '\'' +
'}';
}
}