继承:extends
定义:子类继承父类的成员
1.继承可以使代码的重用率提高,冗余降低,程序的可扩展性提升
2.继承只能子类继承父类
3.子类可以继承父类使用public修饰的成员,除了构造方法,但可以调用
4.父类private修饰的内容子类不能继承
5.一个子类只能继承一个父类,一个父类可以被多个子类继承
6.Java允许连续继承
7.所有类都直接或间接的继承Object类;(Object类是所有类的祖先类)
8.子类虽然继承父类,但也可有特有的属性和方法
注意的问题:
1、非私有成员才可以被继承
2、重写方法:重写方法必须和被重写方法具有相同的方法名称、参数列表、返回值类型;重写方法的访问权限不能小于被重写方法
super:继承父类的子类可以使用super调用父类的构造方法,super语句必须是子类构造方法的第一条语句;子类构造方法默认隐藏调用父类无参构造方法;子类也可以通过super调用父类的成员
/*
* 父类
*/
public class People {
public String name;
public String sex;
public int age;
public final String type = "people";
/*
* 不同对象的类型不同 所以在子类中也声明了type常量
*/
public void show() {
System.out.println("I am a " + type);
}
/*
* 继承是 is a 的关系 即 子类是父类
* 现实生活中广泛的父子关系不等同于java中的继承关系
*/
}
/*
* 子类
*/
public class Student extends People {
/*
* 子类继承了父类的成员变量与方法
*/
public final String type = "student";
public Student() {
/*
* 通过super() 可以调用父类的构造方法
* 子类构造方法默认隐藏调用父类无参构造方法
* 可以super(参数) 指定调用有参构造方法
*/
super();
}
/*
* 子类若是不重写父类的show()方法, 通过继承的方法,输出type,只会输出"people"
* 通过重写show()方法,可以输出自己独有的类型
*/
@Override
public void show() {
// 通过super可以调用父类的方法
super.show();
System.out.println("I am a " + type + ",too.");
}
public void f(){
//子类也可具有自己独有的成员,当成员与父类继承的成员冲突
//通过super可以访问父类的成员变量
System.out.println(type +" is a "+ super.type);
}
}
多重继承的初始化
- 如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法
- 如果子类的构造方法中通过super显示调用父类的有参构造方法,那将执行父类相应构造方法,而不执行父类无参构造方法。
- 如果子类的构造方法中通过this显示调用自身的其他构造方法,在相应构造方法中应用以上两条规则。
- 特别注意的是,如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级父类应用,一直到执行顶级父类Object类的无参构造方法为止
访问修饰符
protected : 受保护的
default : 默认
private : 私有
public : 公有
只有public、默认修饰符才可以修饰类;默认的修饰符,只能在相同包的对象中使用
同包的相互访问:只有私有的无法被访问、继承;私有的只能在当前类内部访问
不同包的相互访问:
继承:只有public类 中的public、protected成员才可以在子类内部使用;在子类外部只能,通过子类对象名只能访问public成员
无任何关系:只有public类中public成员可以被访问
Object类
Object类是所有类的父类;所有类都间接或直接继承了Object类
1.取得对象信息的方法:toString()
该方法在打印对象时被调用,将对象信息变为字符串返回,默认输出对象地址。
2.对象相等判断方法:equals()
该方法用于比较对象是否相等,而且此方法必须被重写。
3.对象地址:hashCode()
该方法用来返回其所在对象的物理地址(哈希码值),常会和equals方法同时重写,确保相等的两个对象拥有相等的.hashCode
4.getClass()
获取当前对象所属的类信息,返回Class对象