面向对象之继承
为了代码的复用性,提出了继承。
1.继承:使用 extends 关键字
public class Student extends Person(){
}
2.如果类A继承自类B,则B称为父类、超类、基类(Superclass);A称为子类、派生类(Subclass)。
3.什么时候才能建立父子关系: A is a B,A就可以继承B
4.有哪些会被继承:
* 一般方法会被继承,受访问修饰符的限制
* 属性会被继承,但是受访问修饰符的限制,比如private修饰的属性,在类的外部就不能直接访问
* 构造方法不会被继承
5.super关键字的使用
* super.
来调用父类的属性或一般方法,但是要注意访问修饰符
public class Student extends Person{
private int sno;
public Student(){}
public Student(String name,int age,int sno){
super.setName(name);// 对父类一般方法的调用
super.setAge(age);
this.sno = sno;
}
}
super()
来调用父类的构造方法
public class Student extends Person{
private int sno;
public Student(){}
public Student(String name,int age,int sno){
super(name,age);// 对父类构造器的调用
this.sno = sno;
}
}
- 如果一个构造方法的第一行,没有任何的this()和super(),则默认有一个super(),即对父类无参构造的引用。因此如果一个类没有写无参构造器,子类的构造方法可能报错。所以通常对所有的类写出无参构造器,即使当前类不需使用。
public class Student extends Person{
private int sno;
public Student(){// 子类构造器
super();// 表示对父类无参构造的使用
}
}
6.方法的重写
* 概念:如果子类中有和父类中同名同参同返回的方法,则子类中的方法会覆盖父类中的相应方法。
* 发生在父子类之间
* 同名同参同返回
* 如果一个方法是重写的方法,则可以在方法之前加一个标注:@Override,用于表明这个方法是重写方法。同时,该标注可以给我们检测语法。
public class Student extends Person{
@Override
public void learn(){// 重写父类的learn()方法
System.out.println("学习Java");
}
}
- 要注意区分重载与重写的区别:
重载发生在同一个类中的不同方法之间
重写发生在父类的方法和子类继承来的方法间
7.Java中的继承是单继承,一个类只能有一个直接父类
* 如果一个类没有继承自任何的其他类,则默认继承自Object
8.Object类方法的重写
* toString()
* 使用System.out.println()输出一个对象时,其实就是输出对象的字符串形式,也即输出对象.toString()
的内容
* equals()
* 基本数据类型之间的比较,是用==
* 引用数据类型之间
* 如果使用==,比较的是对象在堆中的地址,地址相同(同一个对象)则为 true ,否则为 false
* 如果使用 equals
1.如果没有重写 equals,则使用默认的 equals,默认的equals 比较的是两个对象的地址,和 == 一样
2.重写 equals ,自己定义比较规则,完成逻辑上的相等比较。(String:重写了Object的 equals方法,规则是比较两个字符串每一位上的字符,如果所有字符都相同,则返回 true)
* 使用alt+shift+s
,选中Generate hashCode() and equals()
可以快捷生成重写equals方法。
7.字符串常量池
String s3="abc";
语句先判断字符串常量池中有没有”abc”这样的一个字符串常量,如果没有,则将”abc”放入字符串常量池,同时将引用给s3,如果有,则直接将字符串常量池中的”abc”的引用给s3
String s3 = "abc";
String s4 = "abc";
System.out.println(s3==s4);// true 内存地址相同
System.out.println(s3.equals(s4));// true 均为字符串常量池中"abc"的引用