一.继承
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();//调用父类方法}
}
