语法:
修饰符 class 子类名 extends 父类名{
}
自定义类默认隐藏式继承了Object类
class Cat {
...
}
等价于如下
class Cat extends Object{
.........
}
1、没指定继承哪个父类,默认继承Object
2、在Java中Object类是所有类的父类
3、子类继承父类时,不能继承父类的构造方法【这一点不如Python】
4、父类叫做基类,子类叫做派生类
5、满足条件is a
6、一个类只能继承一个直接父类
7、类继承具有传递性。
理解视图举例
代码举例:水果~苹果
父类:水果
package com.zmd.study.exten; public class Fruit { /** * 水果的重量属性 */ private double weight ; public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } }
子类:苹果类
package com.zmd.study.exten; public class Apple extends Fruit{ public String color ; public String getColor() { return color; } public void setColor(String color) { this.color = color; } }
测试类输出:
public class Test { public static void main(String[] args) { Apple apple = new Apple(); apple.setWeight(0.3); System.out.println("苹果重量:" + apple.getWeight()); } } /** 输出: 苹果重量:0.3 */
7-1 重写父类方法
---子类的方法名、参数列表、修饰符一致
---子类的返回类型一致或父类方法返回类型的子类型:
例如:String 是Object的子类型
int 是 Double的子类型
注意事项:
1、super.方法/变量。直接访问父类的资源
2、如果不写,默认为访问本类中资源即隐含了this.
3、如果子类重写父类的方法体中,有调用被重写的方法,则只能使用super
4、访问父类中的实例变量可以是this. 也可以是super. 但是范围子类独有的实例变量/方法 只能用this
5、super(); super([参数列表])完成对父类构造方法赋值
7-2 父类中含有构造方法
在子类中重写
public 类名([参数列表]){
完成对成员变量赋值;
super(参数); //完成对父类构造方法赋值
}
示例代码:
class Persion{
String name;
char sex;
int age;
//无参构造
public Persion(){}
//有参构造
public Persion(String name, char sex, int age){
this.name = name;
this.sex = sex;
this.age = age;
}
public void sayHi(){
System.out.print("Hi 大家好!我的名字:" +this.name+ "\t性别:" + this.sex + "\t年龄:"+ this.age );
}
}
class Student extends Persion{
//子类特有属性
int id;
String grade;
//子类的无参构造方法,执行父类无参构造
public Student(){
super();
}
public Student(String name, char sex, int age, int id, String grade){
//执行父类构造方法
super(name,sex,age);
//对子类特有属性赋值
this.id = id;
this.grade = grade;
}
//重写父类方法
public void sayHi(){
super.sayHi();//调用父类的方法
System.out.println("\t学号:" + this.id + "\t班级:" + this.grade);//合并自己的特有输出
}
}
class StudentTest{
public static void main(String[] args){
Student s = new Student();
s.sayHi();
Student s2 = new Student("唐东",‘男‘,22,1234,"金山班");
s2.sayHi();
}
}
7-3 实例化子类过程中发生了什么?
子类名obj = new 子类();
执行了父类对应构造
如果不执行super(name,sex,age),而子类构造方法中直接执行对父类的成员变量赋值,例如如下:
/*this.name = name; 则默认会执行super()父类无参构造一次
则:需注意,构造方法无参的无用也要写上避免出现错误
7-4 多态特性 (向父类转型)
语法:
父类类名 引用名称 = new 子类类名();
注意,引用名称.只能访问父类的实例属性和实例方法,如果子类重写了父类的方法,则优先访问子类的方法。
效果:多个对象,调用同一个方法,输出不同的结果
Vehicle v = new Car();
System.out.println("小汽车默认租金"+ v.getSumRent(1));
v = new Bus();
System.out.println("大汽车默认租金"+ v.getSumRent(1));
满足条件:
子类必须继承父类
子类必须重写父类方法
满足语法: 子类类名 引用名称 子类类型
典型示例代码:
//宠物类,作为父类,都会吃
class Pet{
public void eat(){
System.out.println("宠物正在吃东西....");
}
}
class Dog extends Pet{
public void eat(){
System.out.println("正在吃狗粮");
}
}
class Cat extends Pet{
public void eat(){
System.out.println("正在吃猫粮");
}
}
//各种宠物吃的不同...省略
class Master{
public void feed(Pet pet){
pet.eat();
}
}
class MasterTest
{
public static void main(String[] args){
Master m = new Master();
Cat c = new Cat();
Dog d = new Dog();
//效果,主人直接用一个喂方法喂不同的宠物。
m.feed(c);
m.feed(d);
}
}
向子类强制转型(父类创建对象,引用子类变量/方法):
语法:子类类型 引用名称 = (子类类型) 父类对象
示例
Pet c = new Cat();
Cat c1 = (Cat)c ;
c1.catching();
原文:https://www.cnblogs.com/zhangmingda/p/14588087.html