1.多态(polymorphic)概述
#事物存在的多种形态
2.多态前提
#a.要有继承关系
#b.要有方法重写
#c.要有父类引用指向子类对象
3.案例演示
代码体现多态
class Animal{
public void set(){
System.out.println("动物吃饭");
}
}
class Cat extends Animal {
public void eat(){
System.out.println("猫吃鱼")
}
public static void main(String[] args){
Cat c = new Cat();
c.eat();
Animal a = new Cat();//多态:父类引用指向子类对象
a.eat();
}
}
多态的中的成员访问特点之成员变量
class Father{
int num = 10;
}
class Son extends Father{
int num = 20;
public static void main(String[] args){
Father f = new Son();
System.out.println(f.num);
}
}
输出10;编译看左边,运行看左边
多态中的成员访问特点之成员方法
成员方法,编译看左边,运行看右边
class Father{
int num = 10;
public void print(){
System.out.println("father");
}
public static void main(String[] args){
Father n = new Son();
n.print();
}
}
class Son extends Father{
int num = 20;
public void print(){
System.out.println("son");
}
}
多态中的成员访问特点之静态成员方法
静态方法
编译看左边,运行看左边(静态和类相关,算不上重写,所有,访问还是左边的)
只有非静态的成员方法,编译看左边,运行看右边
class Father{
int num = 10;
public void print(){
System.out.println("father");
}
public static void method(){
System.out.println("static in father");
}
public static void main(String[] args){
Father n = new Son();
n.method();
}
}
class Son extends Father{
int num = 20;
public void print(){
System.out.println("son");
}
public static void method(){
System.out.println("static in son");
}
}
超人故事
class SuperMan{
public static main(String[] args){
Person p = new SuperMans();//父类引用指向子类对象
System.out.println(p.name);
p.tan();
//p.fly();//报错
//向上转型和向下转型,后面讲
}
}
class Person{
String name = "John";
public void tan(){
System.out.println("谈生意");
}
}
class SuperMans extends Person{
String name = "superMan";
public void tan(){
System.out.println("谈几个亿的大单子");
}
public void fly(){
System.out.println("飞出去救人");
}
}
多态中向上转型和向下转型
案例演示,修改上面的代码
Person p = new SuperMans();//向上转型
SuperMans sm = (SuperMans) p;//向下转型
大家可以试着修改一下上面的代码
*多态的好处与弊端
A.多态的好处
提高了代码的维护性(继承保证)
提高了代码的扩展性(由多态保证)
B:案例演示
多态的好处
可以当作形式参数,可以接受任意子类对象
多态的弊端
不能使用子类的特有属性和行为
class Animal{
public void eat(){
System.out.println("动物吃饭");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void catchMouse(){
System.out.println("猫抓老鼠");
}
public static void main(String[] args){
methed(new Cat());
methed(new Dog());
}
public static void method(Animal c){//开发中好处的体现,当参数的时候好处多
// c.eat();
//关键字instanceof 判断前边的引用是否是后边的数据类型
if( a instanceof Cat){
Cat c = (Cat) a;
c.eat();
c.catcjMouse();
}else if(a instanceof Dog){
Dog d = (Dog) a;
d.eat();
d.lookHome();
}else{
a.eat();
}
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃肉");
}
public void lookHome(){
System.out.println("狗看家");
}
抽象类的概述及其特点
A:抽象类概述
抽象就是看不懂的
B:抽象类特点
抽象类和抽象方法必须用abstract关键字修饰
abstract class 类名 {}
public abstract void eat();
抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
抽象类不能实例化那么,抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化,其实这也是多态的一种,抽象类多态。
抽象类的子类
要么是抽象类
要么重写抽象类中的所有抽象方法
案例演示
abstract class Animal{
//抽象类
public abstract void eat();
//抽象方法
}
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");//继承抽象类必须重写
}
}
class Abstract{
public static void main(String[] args){
Animal a = new Cat();
a.eat();
}
}
抽象类特点
抽象类的成员特点
A.抽象类的成员特点
a.成员变量:既可以是变量,也可以是常量。abstract是否可以修饰成员变量?不能修饰成员变量
b:构造方法:有。
用于子类访问父类数据的初始化。
c:成员方法:既可以是抽象的,也可以是非抽象的。
案例演示
abstract class Demo{//成员变量不可以抽象
int num1 = 10;
final int num2 = 20;
public Demo (){//构造器
System.out.println("父类空参构造");
}
public void print(){
System.out.println("爱你哟");
}
public abstract void method();
}
class Test extends Demo{
public void method (){
System.out.println("啦啦啦,啦啦啦,我是卖报的小行家");
}
}
葵花宝典
案例演示:抽象类的作用
class kuihuabaodian{
public static void main(String[] args){
岳不群 a = new 岳不群();
a.自宫();
}
}
abstract class kuihua{
public abstract void 自宫();
}
class 岳不群 extends kuihua{
public void 自宫(){
System.out.println("用牙签");
}
}
class 林平之 extends kuihua{
public void 自宫(){
System.out.println("用指甲刀");
}
}
class 东方不败 extends kuihua{
public void 自宫{
System.out.println("用锤子,惨不忍睹");
}
}
抽象类练习猫狗案例
a.案例演示
具体事物:猫、狗
共性:姓名、年龄、吃饭
猫的特性:抓老鼠
狗的特性:看家
class Test_Animal{
public static void main(String[] args){
Cat c = new Cat("加菲",8);
System.out.pritnln(c.getName() + "..." + c.getAge());
c.eat();
c.catchMouse();
Dog c = new Dog("巴特",2);
System.out.pritnln(c.getName() + "..." + c.getAge());
c.eat();
c.look();
}
}
abstract class Animal {
private String name;
private int age;
public Animal(){}//空参
public Animal(String name,int age){
this.name=name;
this.age =age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age
}
public int getAge()
{
return age;
}
public abstract void eat();//吃饭
}
class Cat extends Animal{
public Cat(){}//空参
public Cat(String name,int age){
super(name,age);
}
public void eat(){
System.out.println("猫吃鱼");
}
public void catchMouse(){
System.out.println("抓老鼠");
}
}
class Dog extends Animal{
public Dog(){}//空参
public Dog(String name,int age){
super(name,age);
}
public void eat(){
System.out.println("狗吃肉");
}
public void look(){
System.out.println("狗看家");
}
}
抽象类练习老师案例
案例演示
具体事物:高中老师,大学老师
共性:姓名、年龄、讲课
具体事务:高中生,大学生
共性:姓名、年龄、学习
class Test_Animal{
public static void main(String[] args){
BaseTeacher bt = new BaseTeacher("加菲",18);
bt.teach();
CollegeTeacher c = new CollegeTeacher("巴特",22);
System.out.pritnln(c.getName() + "..." + c.getAge());
c.teach();
}
}
abstract class Teacher {
private String name;
private int age;
public Teacher(){}//空参
public Teacher(String name,int age){
this.name=name;
this.age =age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age
}
public int getAge()
{
return age;
}
public abstract void teach();//讲课
}
class BaseTeacher extends Teacher{
public BaseTeacher(){}//空参
public BaseTeacher(String name,int age){
super(name,age);
}
public void teach(){
System.out.println("我的姓名是:"+this.getName+"我的年龄是:"+this.getAge+"讲的内容是"+"高中课程");
}
}
class BaseTeacher extends Teacher{
public BaseTeacher(){}//空参
public BaseTeacher(String name,int age){
super(name,age);
}
public void teach(){
System.out.println("我的姓名是:"+this.getName+"我的年龄是:"+this.getAge+"讲的内容是"+"大学课程");
}
}
抽象类练习员工案例
A.案例演示
假如我们在开发一个系统时需要队程序员类进行设计,程序员包含3个属性:姓名、工号以及工资。
经理,除了含有程序员的属性外,另外还有一个奖金属性。
请使用继承的思想程序设计处程序员类和经理类。要求类中提供必要的方法进行属性访问。
class Test_employee
{
public static void main(String[] args){
Coder c = new Coder("德玛西亚","007",8000);
c.work();
Manager m = new Manager("苍老师","9527",3000,20000);
m.work();
}
}
abstract class Employee{
private String name;
private String id;
private double salary;//工资
public Employee(){}//空参构造
public Employee(String name,String id ,double salary){
this.name=name;
this.id=id;
this.salary=salary;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setId(String id){
this.id=id;
}
public String getId(){
return id;
}
public void setSalary(double salary){
this.salary=salary;
}
public double getSalary(){
return salary;
}
public abstract void work();
}
class Coder extends Employee{
public Coder(){}
public Coder(String name,String id,double salary){
super(name,id,salary);
}
public void work(){
System.out.println("我的姓名是:"+this.getName()+",我的工号是:"+this.getId()+"我的工资是:"+this.getSalary+"我的工作内容是敲代码");
}
}
class Manager extends Employee{
private int bonus;//奖金
public Manager(){}
public Manager(String name,String id,double salary,int bonus){
super(name,id,salary);
this.bonus=bonus
}
public void work(){
System.out.println("我的姓名是:"+this.getName()+",我的工号是:"+this.getId()+"我的工资是:"+this.getSalary+"我的工作是管理程序员"+",我的奖金是"+bonus);
}
}
抽象类中的面试题
a:一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
答:可以,这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成
b:abstract不能和哪些关键字共存
static:被abstract修饰方法没有方法体,被static修饰的可以用类名.调用,但是类型.调用抽象方法是没有意义的
final:被abstract修饰的方法强制子类重写,被final修饰的不让子类重写,所以他俩是矛盾
private:被abstract修饰的是为了让子类看到并强制重写,被private修饰不让子类访问,所以他俩是矛盾的
接口的概述及其特点
a:接口概述
从狭义的角度讲就是之java中的interface
从广义的角度讲对外提供规则的都是接口
B:接口的特点
接口用关键字interface表示
interface 接口名 {}
类实现接口用implements表示
class 类名 implements 接口名{}
接口不能实例化
那么接口如何实例化呢?
按照多态的方法来实例化
接口的子类
可以是抽象类,但是意义不大
可以是具体类,要重写接口中的所有抽象方法
案例演示
接口特点
interface Inter{
public abstract void print();
}
class Demo implements Inter{
public void print(){
System.out.println("print");
}
}
class Test{
public static void main(String[] args){
Inter i = new Demo();
i.print();
}
}
接口的成员特点
成员变量:只能是常量,并且是静态的并公共的
默认修饰符:public static final
建议:自己手动给出
构造方法:接口没有构造方法
成员方法:只能是抽象方法
默认修饰符:public abstract
建议:自己手动给出
案例演示
接口成员特点
class Test{
public static void main(String[] args){
Demo d = new Demo();
d.print();
System.out.println(Inter.num);
}
}
interface Inter{
public static final int num = 10;//默认加前三个关键字,可以互相交换位置
//public Inter(){} 接口中没有构造方法
// public void print(){}//接口中不能定义非抽象方法
abstract void print();
}
class Demo extends Object implements Inter{//一个类不写继承任何类,默认继承Object类
public void print(){
// num = 20 ;//报错,无法为最终变量分配值
System.out.println(num);
}
}
类与类,类与接口,接口与接口的关系
类与类:继承关系,只能但几次,可以多层继承
类与接口:实现关系,可以单实现,也可以多实现。并且还可以在继承一个类的同时实现多个接口
接口与接口:继承关系,可以单继承,也可以多继承
案例演示:类鱼类,类与接口,接口与接口的关系
class Test{
public static void main(String[] args){
}
}
Interface InterA{
public abstract void printA();
}
Interface InterB{
public abstract void printB();
}
//interface InterC implements InterB{
//}一个接口不能实现一个接口
interface InterC extends InterB,InterA{}
//一个接口可以继承多个接口
class Demo implements InterA,InterB{
public void printA(){
System.out.println("printA");
}
public void printB(){
System.out.println("printB");
}
}
抽象类和接口的区别
A成员区别
抽象类
成员变量:可以变量,也可以常量
构造方法:有
成员方法:可以抽象,也可以非抽象
接口
成员变量:只可以常量
成员方法:只可以抽象
B:关系区别
类与类
继承、单继承
类与接口
实现,单实现,多实现
接口与接口
继承,单继承,多继承
设计理念区别
抽象类:被继承体现的是:“is a”的关系,抽象类中定义的是该继承体系的共性功能
接口:被实现体现的是:"like a"的关系,接口中定义的是该继承体系的扩展功能。
猫狗案例加入跳高功能分析及其代码实现
class Test{
public static void main(String[] args){
Cat c = new Cat("加菲".8);
c.eat();
c.sleep();
JumpCat jc = new JumpCat("跳高猫",3);
jc.eat();
jc.sleep();
jc.jump();
}
}
abstract class Animal{
private String name;//姓名
private int age;//年龄
public Animal(){}//空参构造
public Animal(String name,int age){
this.name=name;
this.age = age;
}
public void setName(String name){//设置姓名
this.name = name;
}
public String getName(){//获取名字
return name;
}
public void setAge(int age){//设置年龄
this.age = age;
}
public int getAge(){//获取年龄
return age;
}
public abstract void eat();
public abstract void sleep();
}
interface Jumping{//跳高的接口
public void jump();
}
class Cat extends Animal{
public Cat(){}
public Cat(String name,int age){
super(name,age);
}
public void eat(){
System.out.println("猫吃鱼");
}
public void sleep(){
System.out.println("侧着睡");
}
}
class JumpCat extends Cat implements Jumping{
public JumpCat(){}
public JumpCat(String name,int age){
super(name,age);
}
public void jump(){
System.out.println("猫调高");
}
}
}