什么是继承
为什么要使用继承
可以使用继承避免此种情况出现
满足条件:
is-a 关系
继承只能单根继承,不能多根继承。
继承的关键字:extends
继承不是所以的都可以继承的,以下的是不能被继承的
private修饰的内容是不能被继承的
父类的构造方法是不能被继承的,只能调用
super
上面我们说了父类的构造方法是不能被继承的,但是我们想要使用怎么办?
我们就可以使用super方法来调用父类中的 属性 , 方法, 构造方法。
用法:
大白话解释一下super( ) : super( )其实就相当于一个指向基类的指针,(Java中没有指针,但是可以这样理解)。至于用法有一下三种形式:
1. super.XXX( 这里的XXX指的是父类的成员变量名即父类的属性,或者对象名)
2. super.XXX( ) ( 这里的XXX是父类中的其中一个方法名)
3. super( ) ( 这种形式指的是:调用父类没有参数的构造方法(也叫构造函数)注意: 这里super( ) 只能放在子类的构造方法里面,并且只能放在构造方法的首句)
4. super( x,y,z...) (此形式指:调用父类有参数的构造方法,也必须放在子类的构造方法(成员方法不可以)里面,并且只能放在构造方法的首句。其中x,y,z是指的与父类此有参构造方法中参数数据类型相对应的子类中的参数)
构造方法执行顺序
在子类中如果明确写了调用父类的某一个构造方法,则会执行被明确调用的构造方法,如果在子类
构造方法中,没有写任何调用的构造方法,则会默认调用父类的无参构造方法。
我个人总结一下,不管你有没有调用父类的构造方法,只要你父类有构造方法,那么执行顺序都是先执行父类的构造方法在执行子类的构造方法。
abstract
abstract :表示抽象的,abstract修饰的方法叫抽象方法,abstract修饰的类也叫抽象类
抽象方法是没有方法体的,且必须在抽象类中。反过来
抽象类当中可以有普通方法,也可以有抽象方法。
抽象类中的抽象方法一定会被子类重写,如果子类没有重写,则子类也必须是抽象类且再有子类的子类来重写。
抽象类是不能创建对象
案例:
public abstract class Zuoye {
public abstract void jia();
public abstract void jian();
public void sum(){ }
}
abstract class Zs extends Zuoye{
public void jia(){
System.out.println("加法..");
}
}
class zs extends Zs{
@Override
public void jian() {
}
}
重写:
以前的方法不能满足我们现在的需求了,需要重写编写。
概念:出现在子父类中
方法名和参数列表相同
返回住类型相同或者是其子类
访问修饰符不能严于父类
抛出的异常不能大于父类
(简单说明一下,需要重写的时候子类方法和父类方法一模一样即可)
案例:
public static void main(String[] args) {
Cat cat1=new Cat();
cat1.cry();
Dog dog1=new Dog();
dog1.cry();
}
}
class Animal
{
String name;
int age;
//都会叫
public void cry()
{
System.out.println("我不知道怎么叫");
}
}
//猫类
class Cat extends Animal
{
//覆盖(重写)父类
public void cry()
{
System.out.println("我是小小猫");
}
}
//狗类
class Dog extends Animal
{
//覆盖(重写)父类
public void cry()
{
System.out.println("我是小小狗");
}
}
案例2:
@Test
public void test01(){
Student s1 = new Student(101,"张三");
Student s2 = new Student(101,"张三");
System.out.println(s1.equals(s2));
// "男".equals(sex);
}
当没有重写equals的时候是false,其实是true
Object 是所有类的父类,可以接受一切数据类型
* 在这里我们要想判断两个数值是否相同,首先得确保是同种类型
* 可以使用 instensOf 判断 Object 所表示的值类型是否为某个类型
* 当一个方法是重写方法的时候在eclipse左侧有绿色向上三角形
== 和 equals() 的区别
== 可以比较基本数据类型也可以比较应用数据类型
* 当比较的是基本数据类型的时候比较的是数值,比较引用
* 数据类型的时候比较的是地址值
* equals()在没有进行重写的情况下的比较方式和==是一样的,重写之后就按照重写的规则进行比较。
简单概括:==比较两个对象的地址,equals比较的是两个对象的内容。
public boolean equals(Object obj) {
//判断两个对象的地址值是否相同,如果相同则返回true
if (this == obj){
return true;
}
//如果地址相同,再判断信息是否一致,首先得确保是同种类型
if(obj instanceof Student){
//如果能够进入此方法则表示传入的形参和Student是同种类型,就可以对里面的属性
//进行一一比对,为了编写方便先转换为同种类型
Student s = (Student)obj;
if(this.id==s.id && this.name.equals(s.name)){
return true;
}
}
return false;
}