强调:一定用自己的话总结,避免抄文档,否则视为作业未完成。
this关键字的作用
为了解决成员变量和局部变量所存在的二义性,适用于有参构造时使用
示例
private String name;
private int age;
public person(){}
public person(String name,int age){
this.name =name;//不使用this关键字的话,他的值就是默认值
this.age =age;
}
为成员变量设置值, 构造器和setter方法的选择,为什么?
构造器:在知道具体的参数的时候可以使用,可以创建对象并做初始化,只能使用一次
setter方法:在不知道有具体参数的时候使用,在创建对象后再使用getter方法进行调用,可以多次使用
示例:
public class person {
private String name;
private int age;
public person(){}//无参构造器,添加有参构造器时必须写
public person(String name,int age){//有参构造器
this.name =name;
this.age =age;
}
//getter和setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void p(){
System.out.println("名字:"+name+",年龄:"+age);
}
为什么需要继承?
解决多个类中存在有相同的字段和方法的重复问题
Java中的继承语法
继承时候使用extends关键字
public class 父类名{
//父类,可以编写多个不同类中相同的字段名
// 存放多个子类共同的字段和方法
}
public class 子类名 extends 父类名{
// 存放自己特有的(独有的)字段和方法
}
子类能从父类中继承到哪些成员?
1.public修饰的成员都可以被子类继承
2.private 修饰的成员子类不能继承
3.protected修饰的成员所有的子类都可以继承,专门提供给子类使用
4.默认的关键字只能是在同包下面可以被子类继承
5.有参构造器和无参构造器不能被继承
注意:java只支持单继承,也支持多重继承,不支持多继承
继承有一个根类:Objiect
子类什么时候需要覆盖父类中的方法,方法重写?(override)
在子类中添加一个 和父类一模一样的方法
//执行顺序:
//1. 先找自己是否有对应的方法,没有就找父类的
//2.找父类中是否存在该方法,如果有就执行,否则继续找
//3.知道找到objiect类,如果也没有就报错
方法覆盖的规则
private修饰的方法不能被子类所继承
- 实例方法签名必须相同 (方法签名= 方法名 + 方法的参数列表)
- 子类方法的返回值类型是和父类方法的返回类型相同或者是其子类
- 子类方法的访问权限比父类方法访问权限更大或相等
- 如果父类方法是private,子类方法不能重写。==> 重写建立在继承的基础上,没有继承,就不能重写。
super关键字的作用
在子类中的父类方法被覆盖了,但任然需要父类中方法的东西就需要使用super关键字
示例
public class Ostrich extends Bird {
public void fly() {
System.out.println("自由奔跑");
}
//在子类中,如何调用父类中的方法
public void doWork(){
fly();//调用自己的fly方法
//直接调用父类中的方法
//super指向父类对象,只能找到直接父类
super.fly();
}
什么时候需要把父类中的方法定义成抽象方法?
子类必须要覆盖父类中的某一个方法的时候
使用abstract修饰的方法,称为抽象方法。 0
public abstract 返回类型 方法名(参数);
抽象方法的特点:
-
使用abstract修饰,没有方法体,留给子类去覆盖
-
抽象方法必须定义在抽象类或接口中
使用abstract修饰的类,成为抽象类。/
public abstract class 类名{
}
抽象类应该怎么使用?可以直接使用抽象类创建对象吗?
1.抽象类不可以创建对象,语法不支持
2.抽象类中可以同时拥有抽象方法和普通方法
3.抽象类必须要有子类,并且子类必须覆盖父类的抽象方法,否则该抽象类没有意义,或者子类也是抽象类(可以不覆盖)
抽象类的意义是什么?
必须要有子类来进行继承,子类必须覆盖父类的抽象方法,除非子类也是一个抽象类就不用覆盖
Objiect中的equals和toString关键字
1.equals:
示例:
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//重写父类中的equals
@Override
public boolean equals(Object o) {
if (this == o) return true;//地址相同就是同一个对象
//o为null或者两个对象的类型不同,则不是同一个对象
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
//若果年龄相同并且姓名的值相同则表示同一个对象
return age == student.age && Objects.equals(name, student.name);
}
//省略setter方法
public static void main(String[] args) {
Student s1=new Student("国辉",23);
Student s2=new Student("国辉",23);
//==,基本数据类型比较值,引用类型比较值
System.out.println(s1 == s2);//false
//objiect类中的eqauls方法比较两个对象的地址,作用和"=="相同
//在Student类中重写equals方法之后,此时比较两个对象的值是否相同
System.out.println(s1.equals(s2));//true
}
2.toString
示例:文章来源:https://www.toymoban.com/news/detail-457511.html
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//重写toString
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//省略setter方法
public static void main(String[] args) {
Student s1=new Student("国辉",23);
//cn.wolfcode._07_objiect.Student:全限定名
//@157f12c:地址
//objiect类中的toString:
//重写objiect的toString方法,打印对象的字段值
System.out.println(s1.toString());//不具有打印功能,只做字符串转换
System.out.println(s1);
}
文章来源地址https://www.toymoban.com/news/detail-457511.html
到了这里,关于02 面向对象( 继承,抽象类)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!