继承
首先你要知道万类的基类为Object类
只要你创建一个类,都默认继承Object类
1.在继承关系中,“子类就是一个父类”,也就是说子类可以被当作一个父类看待
比如说,父类是人类,子类是学生类,那么学生就是一个人类
2.定义父类 ,就是一个普通的类
3.定义子类的格式:
public class 子类名称 extends 父类名称{
}
this关键字解决成员变量和局部变量(方法)重名的问题
4.子类继承父类以后,父类声明的属性、方法,子类都可以获取到
注意:当父类中有私有的属性或方法时,子类同样可以获取,只是因为封装的原因,不能直接用属性,但可以写入getset方法中调用。
5.子类除了通过继承获取父类的属性和方法外,还可以定义自己独有的方法和属性。
6.java继承是单继承的,一个子类只能继承一个父类,一个父类可以有多个子类
super关键字
为什么用extends后
需要new一个新对象,(对象也叫类的实例,使用关键字new 构造器(…)的方式)
才能访问到父类的方法?
因为new 构造方法,其实省略了super关键字
而super();就会使你调用父类的无参构造方法
从而才能调用父类中其他方法,才有继承这个说法
当然super关键字的用法不止这一点,
super关键字可以修饰属性、方法、构造方法
1).当子类和父类属性重名时,可以通过”super.属性名“的方式调用父类中声明的属性
如果想区分类中属性和局部变量重名,用”this.属性名“
2).子类重写父类方法以后,如果子类想再次调用父类被重写的方法,可以用super.方法名进行修饰
3).super修饰构造方法,通过在子类中使用“super(形参)”的方式来显式调用父类指定的构造方法
注意:在构造方法内部,“super(形参)”必须声明在首行
在构造方法内部,this(形参)或者“super(形参)”只能出现一个。
在构造方法内部,不显示的调用“super(形参)”,默认会调用父类的无参构造方法
定义一个person父类
其中有有参无参构造方法,getset方法 定义的eat方法
public class Person {
int id=1001;//身份证号
private String name;//姓名
private int age;//年龄
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
System.out.println("hehe");
}
public void eat(){
System.out.println("吃饭");
}
public void eat(int i){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void info(){
System.out.println("姓名:"+name+",年龄:"+age+",学号:"+id);
}
}
子类学生类
public class Student extends Person{
int id=1002;//学号
private String schoolName;
public Student() {
super();
System.out.println("hehe2");
}
public Student(String schoolName) {
super(1001,"王老五",100);//调用了父类三个参数的构造方法
//直接传参
this.schoolName = schoolName;
}
public void learn(){
System.out.println("学习");
}
public void eat(){
System.out.println("我是一名学生,因为我是祖国的发多,所以我要吃营养");
}
public void show(){
System.out.println(this.id);//1002
System.out.println(super.id);//1001
eat();//子类方法
super.eat();//父类方法
}
}
测试类
可以自己调用方法看看输出什么
特别说明一点:
受保护的:同一个类中,同一个包下,不同包但继承父类 ,都可以调用受保护的方法或是属性。
public class OrderA {
public int no;
protected String name;
int orderNum;
private String desc;
}