使用继承
父类
public void class Pet{
//共享的属性和方法
}
子类
public void class Dog extends Pet {
//独有的属性方法
}
public void class Penguin extends Pet {
//独有的属性方法
}
子类访问父类成员 super
使用super 关键字,super代表父类对象
访问父类的构造方法
super() 只能放在第一位
例:super(name);
访问父类的属性
例:super.name
访问父类的方法
例:super.print()
不能被子类继承的父类成员
-private成员 代表独有的不能被继承
-构造方法 调用子类时默认先调用父类
protected
可以修饰属性和方法
本类.同包.子类 可以访问
访问修饰符小结
多重继承关系的初始化顺序
1.父类属性
2.父类构造方法
3.子类属性
4.子类构造方法
例:class Person {
String name="李光";// 姓名
public Person() {
// super();//写不写该语句,效果一样
System.out.println("execute Person()");
}
public Person(String name) {
this.name = name;
System.out.println("execute Person(name)");
}
}
class Student extends Person {
String school="蓝翔";// 学校
public Student() {
// super();//写不写该语句,效果一样
System.out.println("execute Student() ");
}
public Student(String name, String school) {
super(name); // 显示调用了父类有参构造方法,将不执行无参构造方法
this.school = school;
System.out.println("execute Student(name,school)");
}
}
class PostGraduate extends Student {
String guide;// 导师
public PostGraduate() {
// super();//写不写该语句,效果一样
System.out.println("execute PostGraduate()");
}
public PostGraduate(String name, String school, String guide) {
super(name, school);
this.guide = guide;
System.out.println("execute PostGraduate(name, school, guide)");
}
}
class TestInherit {
public static void main(String[] args) {
PostGraduate pgdt=null;
pgdt = new PostGraduate();
System.out.println();
pgdt=new PostGraduate("刘小光","北京大学","王老师");
}
}
继承条件构造方法的调用规则
1.子类没有调用父类的有参构造方法,也没有调用自身构造方法,则默认先调用父类无参构造方法,然后再调用自身无参方法,不用写super() 语句
2.如果子类使用super调用父类的有参构造方法,那将执行父类有参构造方法,不执行父类无参构造方法
3.如果子类使用this调用自身的其他构造方法,则按上面两条使用
4.如果多级继承,在创建子类时,会多次向更高级父类应用,一直到执行顶级父类Obhect类的无参方法为止;
例:class Car {
private int site = 4; //座位数
Car(){
System.out.println ("载客量是"+site+"人);
}
public void setSite(int site){
this.site = site;
}
void print(){
System.out.print("载客量是"+site+"人");
}
}
class Bus extends Car {
Bus(int site){
setSite(site);
}
}
public static void main(String[] args) {
Bus bus = new Bus(20);
bus.print();
}
结果:载客量4人
载客量20人
方法重写
使用继承后,有些属性不是共有的,因此使用方法重写
方法重写 @Override
方法重写需注意的问题
1.构造方法不能被继承,所以不能被重写
规则:
-方法名相同
-参数列表相同
-返回值类型相同或其子类相同
-访问权限不能严于父类 (访问修饰符)
合并
例:package com.dog;
/**
* Created by ttc on 2018/5/28.
*/
public class Pet {
String name;
int health;//健康
int love;//亲密度
int type;//类型
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHealth() {
return health;
}
public void setHealth(int health) {
this.health = health;
}
public int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String toString() {
return "Pet{" +
"name='" + name + '\'' +
", health=" + health +
", love=" + love +
", type=" + type +
'}';
}
}
Penguin
例:package com.dog;
/**
* Created by ttc on 2018/5/25.
*/
public class Penguin extends Pet {
int sex;//品种
public int getSex() {
return sex;
}
public void setSex(int sex) {
this.sex = sex;
}
public void pen(){
String a="";
if (sex == 1)
{
a="Q仔";
}
else if (sex==2)
{
a="Q妹";
}
System.out.println("宠物的自白,我的名字叫"
+name+"健康值是"+health+"和主人的亲密度是"+love+"我是一只"+a);
}
}
Dog
例:package com.dog;
/**
* Created by ttc on 2018/5/25.
*/
public class Dog extends Pet {
int breed;//品种
public int getBreed() {
return breed;
}
public void setBreed(int breed) {
this.breed = breed;
}
public void Pet() {
String b="";
if (breed == 1)
{
b="拉布拉多";
}
else if (breed==2)
{
b="雪纳瑞";
}
System.out.println("宠物的自白,我的名字叫"
+name+"健康值是"+health+"和主人的亲密度是"+love+"我是一只"+b);
}
}
Main方法
例:package com.dog;
import java.util.Scanner;
/**
* Created by ttc on 2018/5/25.
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入宠物的名字");
Dog dog = new Dog();
Penguin penguin = new Penguin();
String name = scanner.nextLine();
System.out.println("请输入宠物类型:1.狗,2.企鹅");
int type = scanner.nextInt();
if (type == 1) {
System.out.println("请输入狗的品种,1聪明的拉布拉多,2酷酷的雪纳瑞");
int breed = scanner.nextInt();
dog.setBreed(breed);
dog.setName(name);
dog.setType(type);
dog.setHealth(100);
dog.setLove(0);
dog.Pet();
}
else{
System.out.println("请输入企鹅的品种,1.Q仔,2.Q妹");
int sex = scanner.nextInt();
penguin.setSex(sex);
penguin.setName(name);
penguin.setType(type);
penguin.setHealth(100);
penguin.setLove(0);
penguin.pen();
}
}
}
抽象类
关键字abstract
抽象的不能被实例化,没有实际意义
例:public abstract class Pet{
}
特点:
-抽象方法没有方法体
-抽象方法必须写在抽象类中
-抽象方法必须在子类中实现,除非子类是抽象类
final用法
类不希望被继承
例:public final class penguin extengs Pet{
}
方法不希望被继承
例:public final void print () {
}
属性不希望被继承
例:public class Penguin {
final String home ="南极";// 居住地
}
加上final的变量后必须赋值,变成常量,不可更改