一.继承
1.什么叫继承?
继承允许一个类(子)基于另一个已存在的类创建新类。子类会自动继承父类中的非私有成员,因此无需编写相同的代码。
2.继承的写法
public class son entends father
3.注意
* A.子类可以直接使用父类的功能(非私有)
* B.子类可以重写(override)父类的方法
* C.子类对象是由子类和父类多张设计图共同设计而成。
* D.每个类只能继承一个类(只能有一个父亲),不支持多继承,但是可以多级继承
4.特点
*1.单继承,多层继承
*2.所有java类的祖宗类都是object,也就是object是祖宗
*3.就近原则:优先访问自己的类,没有再去访问父类
子类局部——>子类成员变量——>父类成员变量
二.方法重写
1.定义
当子类认为父类的某些方法不好时,子类可以重新写一个方法名称相同,参数列表一样的方法来覆盖继承过来的父类的方法
2.注意
* 1.重写时,子类的返回值类型应该与父类相同或者比父类更大,方法名称,参数个数、顺序、类型等应完全相同。
* 2.子类的方法可以比父类更加宽松。
* 3.static静态方法、final修饰的、私有的方法都不可以重写。
* 4.建议:在子类重新写父类之前,加上@override注释。
3.应用
一般是用来重写 “toString”这个方法。我们常常打印 实例s1,即...print(s1),实际是打印的是 s1.toString(),最终会得到s1的地址,但是我们实际想得到的是s1的信息,所以我们常常在子类中重写祖宗类的toString
三.子类构造器
1.子类构造器的特点
*A. 子类的全部构造器会先调用父类的构造器,再去调用自己的
*B. 当父类中存在无参构造器,那么子类中就算你不写,也会有在子类构造器中的首个地方默认有 super()
*C. 当父类中的有参构造器覆盖了父类默认的无参,你又没写父类的无参;或者私密无法访问;或不可访问,这个时候,你就必须在子类的构造器开头手写 super(父类有参需要的参数)
*子类中不是必须要明确有或者一定有super,但是每个子类构造器需要调用一次父类的构造器,可以直接,可以间接
2.super和this
super(...)是调用父类构造器
this(...)是调用本类中其他构造器
//有时候几个构造器的内部传参都十分相似,那么我们可以在参数少的构造器中直接this (传参),这个传的参是能够包容小的构造器的大构造器的参数,具体见实例。
3.注意
* super()必须直接或者间接存在;this根据需要写即可;
* super和this如果存在,一定要写在构造器中的最前面(注意构造器是没有返回值的,今天写代码就写成void类型了!不要犯低级错误)
* super和this不可同时存在,因此某一构造器写了this,就没有super,但是this会将其带入最终要传入的构造器中,那个构造器肯定是有super的,因此这就叫间接访问父类的构造器。
四.修饰符权限
private:私有,只能在本类中随意调用,在测试类中可用该类提供的set和get方法赋值
没写:可以在本类、同一个包中的类之间进行调用
protected:可以在本类、同一个包的类、子孙类之间调用
public:任何位置
范围: public > protected > 没写 > private
五.代码实例
//儿子类
package father_son;
import javax.xml.validation.SchemaFactoryConfigurationError;
public class student extends people{
public student(String name,String school){
this(name,98,school);
System.out.println("这个是第一个子类的构造器");
//因为this的存在。所以先会执行下面的构造器,然后再回到zhis后面这个语句继续执行
}
public student(String name,int score,String school){
super(name);
this.score=score;
this.school=school;
System.out.println("这个是第二个子类构造器");
}
public int score;//子类的成员变量
public String school;
@Override//方法重写
public void skill(){//未加修饰的父类方法重写,因此这里可以 不写,protected,public修饰
System.out.println("每个人都有自己擅长的东西");
System.out.println("重写people方法");
}
public void info(){//子类方法,super调用父类变量及方法
System.out.println(super.name+"的成绩是"+this.score+",他就读的学校是"+this.school);
super.setAge(13);
super.setSex('男');
System.out.println("他的性别是:"+super.getSex()+"; 年龄是:"+super.getAge()+"岁。");
}
}
package father_son;
//父类
public class people extends Object {
//如果不写,默认继承Object祖宗类
//这里父类没有重写无参构造器,因此父类只有有参构造器
public people(String name){//记住了,构造器没有返回值类型
this.name=name;
System.out.println("调用了父类的构造器");
}
public String name;//公有成员变量
private int age;//私有成员变量
private char sex;//私有成员变量
public void Study(){
System.out.println("人可以学习知识");
}
void skill(){//未加修饰
System.out.println("每个人都有自己擅长的东西");
}
public void setAge(int age) {
this.age = age;
}
public void setSex(char sex) {
this.sex = sex;
}
public char getSex() {
return sex;
}
public int getAge() {
return age;
}
}
//测试类
import father_son.student;
public class Main {
public static void main(String[] args) {
student s1=new student("张明","第一初级中学");
s1.info();//调用自己的方法
s1.skill();//调用子类重写的方法
s1.Study();//调用父类方法
}
}
