目录
本章将开始继承的学习,Java的三大特性(继承,多态,封装)之一
1.继承
1.1 为什么使用继承
多类之间拥有多个相同的属性或是方法,解决方式是将相同的属性和方法抽取出来,封装到一个新的类中,并继承新的类
1.2 继承语法
A extends B
核心要点1:如果A extends B==》得出结论:A是B的子类,B是A的父类
核心要点2:Java中一个类只能继承一个父类(单继承关系)
核心要点3:继承的关键字是extends
1.3 super
(1)定义:super关键字来访问(调用)父类的成员
(2)规范:super只能出现在子类的方法和构造方法中
super调用构造方法时,只能是第一句
super不能访问父类的private成员
(3)super使用方法
public class Pet {
String name;
int health;
private int honey;
public Pet(){}
public Pet(int a){}
public void show(){}
}
public class Dog extends Pet{
String name;
int height;
public void show(){
//调用父类属性值
int health = super.health;
name = super.name;
//调用父类方法
super.show();
}
public Dog(){
//调用父类无参构造器
//特点:必须在第一行,并且在构造器中
super();
}
public Dog(int a){
//调用父类有参构造器
//特点:必须在第一行,并且在构造器中
super(a);
}
}
1.4 访问修饰符
核心要点1:
- private,默认,protected,public都可以在本类中被使用
- 在同包不同类中,private修饰的属性不可以被访问,其它三者可以被访问
- 在不同包,但属于父子类关系,private,默认修饰的属性不可被访问,其余两者可以被访
- 在不同包,也不属于父子类关系,只有public修饰的属性可被访问,其余均不可以被访问
1.5 继承初始化顺序
执行顺序:
1.父类属性初始化-》2.父类构造器初始化-》3.子类属性初始化-》4.子类构造器初始化
2.重写
2.1 重写
核心要点:如下方法构成了重写,子类重写了父类的show()方法
public class Father{
public void show(){
System.out.println("父亲的show方法。。。");
}
}
public class Son extends Father{
public void show(){
System.out.println("儿子的show方法。。。");
}
}
2.2 重写规范规则
1.方法名相同
2.参数列表相同
3.返回值类型相同或者是其子类
4.访问权限不能严于父类
拓展1:方法重载和重写的区别:
拓展2:构造方法不能重写
3.抽象
3.1 抽象类
核心要点:
- 抽象类的关键字是abstract
- 抽象类的特点是不能实例化(例如new Pet()会报错)
- 抽象的方法没有方法体
- 抽象类中可以有非抽象方法【特例】
public abstract class Pet{
String name;
public abstract void eat();
public void play(){
System.out.println("飞盘游戏");
}
}
public class Dog extends Pet{
public void eat(){
System.out.println("吃狗粮");
}
}
public class Test{
public static void main(String[]args){
Dog dog = new Dog();
System.out.println(dog.name);
dog.eat();
dog.play();
}
}
3.2 抽象方法
1.抽象方法没有方法体
public abstract void eat();
2.抽象方法必须在抽象类里
//Pet类中有抽象方法则Pet类必须是抽象类(或接口)否则报错
public abstract class Pet{
String name;
public abstract void eat();
}
3.抽象方法必须在子类中被实现,除非子类是抽象类
//子类必须实现父类抽象方法,除非子类是抽象类
public abstract class Dog extends Pet{
}
public class Dog extends Pet{
public void eat(){
System.out.println("吃狗粮");
}
}
3.3 抽象实战
public abstract class Pet {
String name;
int health = 100;
int honey = 20;
public abstract void print();
public void show(){
}
}
public class Dog extends Pet{
String pingZhong;
@Override
public void print(){
System.out.println("我是"+name);
System.out.println("我的健康值:"+health);
System.out.println("我的亲密度:"+honey);
System.out.println("我的种类;"+pingZhong);
}
}
package mykb.day09.demo04;
public class Penguin extends Pet{
String sex;
@Override
public void print(){
System.out.println("我是"+name);
System.out.println("我的健康值:"+health);
System.out.println("我的亲密度:"+honey);
System.out.println("我的性别;"+sex);
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("欢迎来到宠物店");
System.out.printf("请输入要领养的宠物名字");
String name = scanner.next();
System.out.printf("选择要领养的宠物种类:(1、狗狗 2、企鹅)");
int n = scanner.nextInt();
switch (n){
case 1:
System.out.println("输入狗狗的种类:(1、聪明的拉布拉多犬 2、酷酷的雪纳瑞");
int zhongLei = scanner.nextInt();
Dog dog = new Dog();
dog.name = name;
if (zhongLei == 1){
dog.pingZhong = "聪明的拉布拉多犬";
}else if (zhongLei == 2){
dog.pingZhong = "酷酷的雪纳瑞";
}else {
System.exit(0);
}
dog.print();
break;
case 2:
System.out.println("请选择企鹅的性别:(1、Q仔 2、Q妹");
int sex = scanner.nextInt();
Penguin penguin = new Penguin();
penguin.name = name;
if (sex == 1){
penguin.sex = "Q仔";
}else if (sex == 2){
penguin.sex = "Q妹";
}else {
System.exit(0);
}
penguin.print();
break;
default:
System.out.println("输入准确种类");
}
}
}
4.final
- final修饰类 特点:不能被继承
- final修饰方法 特点:不能被重写
- final修饰属性 特点:不被二次赋值