继承
组合
核心:将父类对象作为子类的属性
额外知识点:除了继承,组合也能实现代码的复用
- 示例:之前继承的代码用组合重新实现
class Person2 /*extends Object*/{
String name;
int height;
public void rest(){
System.out.println("休息!");
}
}
class Student /*extends Object*/{
Person2 person2 = new person2();
Boy b = new Boy();//需要几个属性加几个属性,可以复用很多类的代码
String name;
int height;
String major;//专业
public void study(){
System.out.println("学习!");
person2.rest;
System.out.println(this.person2.name)
}
public Student(String name,int height,String msjor){
this.person2.name = name;
this.persn2.height = height;
this.person2.major = major;
}
}
注意: 组合比较灵活,继承只能有一个父类,但是组合可以有多个属性。所有,有人声称“组合优于继承”,开发中可以不用继承,但是,不建议走极端,”学生是一个人“,用继承,”学生有一个人“,用组合更好
重写
课前小知识:
“= =”代表比较双方是否相同,如果是基本类型则表示值相等,如果是引引用类型则表示地址相等既是同一个对象。 equals()提供定义“对象内容相等”等逻辑。比如,我们在公安系统中认为id相同的人就是同一个人。学籍系统中认为学号相同的人就是同一个人。 equals()默认是两个对象的hashcode(地址)。但可以根据自己的要求重写equals方法
System.out.println(t.toString());//这里t指对象,作用是查看t的地址 System.out.println(t1.toString()); Sstem.out.orintln(t.equal(t1));//作用是t和t1是否相等
重写equals方法: 用idea中的Generate工具,选择equals和hashCode,选择需要比较的属性通常重写equals时,也需要重写hashCode
public boolean equals (Object o){
if(this == o)return true;//返回true,理解:当前对象和传入o对象是同一个对象时,返回 true
if(o == null || getClass() != o.getClass())return flase;//如果输入对象o等于空或类型不一样,返回flase
TestObject that = (TestObject) o;//如果类型一样
return id == that.id;//输入的id相同,则返回true
}
测试重写
package com.itbaizhan.tast;
import java.util.Objects;
/**
* 测试Object
* 重写tostring()
* 重写equals()
*/
public class TestObject extends Object{
int id;
String name;
String pwd;
public TestObject(int id,String name,String pwd){
this id = new id;
this name = new name;
this pwd = new pwd;
}
TestObject9(){}
// public String toString(){
// return "账户名:"+name+"密码:"+pwd";
// }
public static void main(String[] args) {
/* TestObject t = new TestObject();
System.out.println(t.toString());
TestObject t2 = new TestObject();
System.out.println(t2.toString());
System.out.println(t2);//默认调用toString()方法*/
TestObject t3 = new TestObject(1001,"wangyu","123456");
TestObject t4 = new TestObject(1001,"luotuo","123456");
System.out.println(t3.toString());
System.out.println(t4.toString());
System.out.println(t3.equals(t4));
}
public boolean equals (Object o){
if(this == o)return true;//返回true,理解:当前对象和传入o对象是同一个对象时,返回 true
if(o == null || getClass() != o.getClass())return flase;//如果输入对象o等于空或类型不一样,返回flase
TestObject that = (TestObject) o;//如果类型一样
return id == that.id;//输入的id相同,则返回true
}
课程回顾
- 面向对象的三大特征是什么?
- 继承的两个主要作用是什么?
- Java中实现继承是哪个关键词?
- Java中类继承,是单继承还是多继承?java中其他地方有多继承么?
- 子类继承父类可以获得初父类构造方法之外的所有,但不都见得都能使用。找现实中的例子打比喻描述这个现象。
- 定义类时,没有使用extends,他的父类是是什么?
- person,Student继承关系的代码测试。
- Person,Student组合关系等等代码测试。
- 组合和继承的关系如何理解?
- 方法重写的测试
- 方法重写和方法重载的区别?
- final关键字修饰变量,方法,类都分别代表什么含义?
- 继承,封装,多态
- 方便建模,代码复用,更加容易实现类的扩展
- extends
- 单继承,有多继承,接口
- 父类私有的属性,方法
- Object
9组合和继承都可以继承父类,一般情况下,组合较为方便,但为了代码的严谨性,最好区分开来
11.重载发生在本类,重写发生在父类与子类之间
重载的方法名必须相同,重写的方法名相同且返回值类型必须相同;
重载的参数列表不同,重写的参数列表必须相同
-
修饰变量:被他修饰的变量不可改变,一旦赋了初值,就不能被重新赋值。 fianal int MAX_SPEED = 120;
-
修饰方法:该方法不可被子类重写。但是可以被重载! final void study(){}
-
修饰类:修饰的类不能被继承。比如:MAX、Math、Sting等。 final classA{}
package com.itbaizhan.tast;
/**
* 测试继承
*/
public class TestExtends {
public static void main(String[] args) {
Student s1 = new Student("王誉",174,"java");
System.out.println(s1 instanceof Student);//判断s1是不是student子类
System.out.println(s1 instanceof person);//判断s1是不是person子类
}
}
class person{
String name;
int height;
public void rest(){
System.out.println("休息");
}
}
class Student extends person {//继承父类
String major;//专业
public void Study(){
System.out.println("学习");
rest();//继承父类的方法
System.out.println("this.name");//打印父类的属性,加this避免出现直接输出name单词
}
public Student(String name,int height,String major){//构造器,类名与上面子类类名相同
this.name = name;//调用构造方法
this.height = height;//调用构造方法
this.major = major;//调用构造方法
}
}
package com.itbaizhan.tast;
/**
* 测试组合
*/
public class TestComponent {
}
class person2{
String name;
int height;
public void rest(){
System.out.println("休息");
}
}
class Student2 extends person2 {//继承父类
person2 person2 = new person2();
String major;//专业
public void Study(){
System.out.println("学习");
person2.rest();//继承父类的方法
System.out.println("this.person2.name");//打印父类的属性,加this避免出现直接输出name单词
}
public Student2(String name,int height,String major){//构造器,类名与上面子类类名相同
person2.this.name = name;//调用构造方法
person2.this.height = height;//调用构造方法
person2.this.major = major;//调用构造方法
}
}