1概念
可以让一个类继承另一个类,此时该类会继承另一个类中的属性和方法
去继承的类称为子类,被继承的类称为父类(超类/ 基类)
继承是一种 is a 的关系 cat is a animal user is a person
2 实现方法
语法:
public class 子类 extends 父类{
}
作用:
- 代码复用: 将多个子类中相同的属性和方法 定义到父类中
- 功能扩展: 子类可以有自己独特的属性和方法
特性:
- java中只支持单继承。 但支持多层继承,继承的传递
- java中所有的类都直接或者是间接的继承了 java.lang.Object类 (后面会讲)
Object类是所有类的父类 ,每个类都会继承 Object类中的方法
3 继承的范围
子类可以继承父类的哪些成员
- 父类中用 public protected 默认 修饰的属性和方法,都可以继承 (同包的情况下)
- 父类中private 修饰的属性和方法不能被子类继承
- 父类的构造方法不能被子类继承( 构造方法 名必须与类名相同,而子类名称不可能与父类名称相同)
package Test0324;
public class Test_子类继承 {
public static void main(String[] args) {
PrimaryStudent s=new PrimaryStudent();
s.show();
}
}
class Student {
String name = "tom";
int age = 0;
String sex = "男";
public void show(){
System.out.println(name+age+sex);
}
}
class PrimaryStudent extends Student{
}
class MiddleStudent extends Student{
}
package Test0324;
public class Test_继承传递 {
public static void main(String[] args) {
//A总共有三个方法。b();.c();方法来自于继承 a();源自本身
A a = new A();
a.a();
a.b();
a.c();
}
}
class A extends B{
public void a(){
System.out.println("A中方法");
}
}
class B extends C{
public void b(){
System.out.println("B中方法");
}
}
class C{
public void c(){
System.out.println("C中方法");
}
}
3 继承的范围
子类可以继承父类的哪些成员
- 父类中用 public protected 默认 修饰的属性和方法,都可以继承 (同包的情况下)
- 父类中private 修饰的属性和方法不能被子类继承
- 父类的构造方法不能被子类继承( 构造方法 名必须与类名相同,而子类名称不可能与父类名称相同)
4构造方法的调用
调用过程:
- 创建子类对象时,会自动调用父类无参的构造方法(此时必须保证父类中有无参的构造,否则子类会报错——有参的构造方法的类系统不会自动创建无参的方法)
- 从子类 开始,依次往上调用父类的构造方法,直到Object类,然后在会到子类中,执行后续的代码
package Test0324;
public class Test_构造方法的调用 {
public static void main(String[] args) {
pig p = new pig();
}
}
class Live{
public Live() {
System.out.println("父父类");
}
}
class Animal extends Live{
public Animal() {
System.out.println("父类方法");
}
}
class pig extends Animal{
public pig() {
System.out.println("子类方法");
}
}
super关键字:
- 表示父类的对象,只能在子类中使用
- 可以使用 super() 调用父类的构造方法 ,位于第一行
- 可以使用 super.xxx 访问父类的属性和方法。解决父类和子类属性同名的问题
package javaSE08_面向对象的特征;
public class Test05_构造方法的调用 {
public static void main(String[] args) {
//创建子类时 父类的构造方法也会被调用
Pig p = new Pig();
p.show();
}
}
//父父类
class Live{
public Live() {
System.out.println("父父类");
}
}
// 父类
class Animal extends Live{
String name="八戒";
String sex;
public Animal() {
System.out.println("父类");
}
public Animal(String name, String sex) {
super();
this.name = name;
this.sex = sex;
}
public void show (){
System.out.println("父类中的show方法");
}
}
//子类
class Pig extends Animal{
int age;
double weight;
String name = "猪刚鬣"; //与父类的同名变量
//构造方法给 name sex age weight 都赋值
public Pig(String name,String sex,int age,double weight){
// this.name = name;
// this.sex = sex;
super(name,sex);// 调用父类中的构造方法,为 name ,sex属性赋值
this.age=age;
this.weight = weight;
}
public Pig() {
System.out.println("子类");
}
public void show(){
System.out.println("子类中的show方法");
System.out.println(name);// 子类中name
// super 表示父类对象
System.out.println(super.name);// 访问 父类中的name
super.show();// 调用的是父类的show方法
}
}
2.5方法的重写
子类中的方法,与父类中的方法名称,参数,返回类型都一样,我们就说子类重写了父类的方法,称为为方法重写 override
- 在父子类
- 返回类型可以相同 也可以是子类类型
- 访问修饰符不能缩小
作用:用来重写定义子类的行为,解决父类和子类的差异性
面试: 方法重写和方法重载
鼠标左击以确定代码插入的位置,使用快捷键CTRL+O,会弹出窗口让选择某个方法
- 在父子类
- 返回类型可以相同 也可以是子类类型
- 访问修饰符不能缩小
作用:用来重写定义子类的行为,解决父类和子类的差异性
面试: 方法重写和方法重载
重写是指参数和方法名相同
重载是参数不同方法名相同
package Test0324;
public class Test_方法重写 {
}
class Pet{
public void cry(){
System.out.println("我是一只宠物会叫");
}
public Pet getPet(){
System.out.println();
Pet p = new Pet();
return p;
}
}
class Dog extends Pet{
@Override
public void cry() {
System.out.println("我是一只小猫会喵喵叫");
}
@Override
public Pet getPet() {
Dog d = new Dog();
return d;//可以返回子类
}
}