A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2019-5-9 18:29 编辑

个人笔记一、多态什么是多态
同一个对象,在不同时刻表现出来的不同形态
多态的前提条件有哪些
要有继承/实现关系(extends/implements)      
要有方法重写      
要有父类引用指向子类对象
二、多态中成员访问特点多态中成员变量的访问特点是什么
编译看左边(父类)、运行看左边(父类)
多态中成员方法的访问特点是什么
编译看左边(父类)、运行看右边(子类)
三、多态的好处和弊端多态的好处
提高了代码的扩展性。      
定义方法时,如果将父类型作为参数,在使用方法时,可以传递任意子类对象
多态的弊端
不能使用子类特有的成员
四、多态中的转型多态中的向上转型
父类引用指向子类对象其实就是向上转型。例如:      
Animal a = new Dog();
多态中的向下转型
将父类型的引用转换成具体的子类对象。转换格式:      
子类 对象名 = (子类)父类引用;
五、多态转型内存图
六、猫和狗(多态版)  
[Java] 纯文本查看 复制代码
/*
  定义Animal类,提供name和age变量,eat方法
  定义Cat类,继承Animal,重写eat方法
  定义Dog类,继承Animal,重写eat方法
  使用多态创建对象,为属性赋值,并调用方法
  */
  //动物类
  package com.itheima03;
  ​
  public 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 void eat(){
          System.out.println("动物吃东西");
      }
  }
  //猫类
  package com.itheima03;
  ​
  public class Cat extends Animal {
      public Cat() {
      }
  ​
      public Cat(String name, int age) {
          super(name, age);
      }
  ​
      @Override
      public void eat() {
          System.out.println("猫吃鱼");
      }
      public void palyGame(){
          System.out.println("猫捉迷藏");
      }
  }
  //狗类
  package com.itheima03;
  ​
  public class Dog extends Animal {
      public Dog() {
      }
  ​
      public Dog(String name, int age) {
          super(name, age);
      }
  ​
      @Override
      public void eat() {
          System.out.println("狗吃骨头");
      }
      public void lookHome(){
          System.out.println("狗看家");
      }
  }
  //测试类
  package com.itheima03;
  ​
  public class AnimalTest {
      public static void main(String[] args) {
          Animal a = new Cat();
          a.setName("白猫");
          a.setAge(2);
          System.out.println(a.getName() +", "+a.getAge());
          a.eat();
  ​
          a = new Cat("黑猫",3);
          System.out.println(a.getName() +", "+a.getAge());
          a.eat();
          System.out.println("--------");
  ​
          a = new Dog();
          a.setName("白狗");
          a.setAge(3);
          System.out.println(a.getName() +", "+a.getAge());
          a.eat();
  ​
          a = new Dog("黑狗",4);
          System.out.println(a.getName() +", "+a.getAge());
          a.eat();
  ​
      }
  }

  ​七、抽象类什么是抽象类
一个类中如果有抽象方法,那么这个类就必须是一个抽象类
什么是抽象方法
抽象方法指的是没有具体的方法实现(就是没有方法体{})
如何定义抽象类和抽象方法
使用abstract关键字来修饰类和方法
八、抽象类特点1.抽象类和抽象方法必须使用abstract关键字修饰
​        public abstract class 类名{}            
​        public abstract 返回值类型 方法名();     
2.抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类3.抽象类不能实例化,但是可以通过多态的方式创建子类对象4.抽象类的子类
​        要么重写抽象父类中所有的抽象方法           
​        要么子类本身也是一个抽象类
九、抽象类的成员特点1.成员变量
既可以是变量、也可以是常量     
2.构造方法
有构造方法,目的是给父类中成员初始化     
3.成员方法
既可以是抽象方法、也可以是普通方法
十、猫和狗(抽象类版)
  
  
[Java] 纯文本查看 复制代码
//动物抽象类
  package com.itheima05;
  //抽象类
  public abstract class Animal {
      private String name;
      private int age;
  ​
      public Animal() {
      }
  ​
      public Animal(String name, int age) {
          this.name = name;
          this.age = age;
      }
  ​
      public String getName() {
          return name;
      }
  ​
      public void setName(String name) {
          this.name = name;
      }
  ​
      public int getAge() {
          return age;
      }
  ​
      public void setAge(int age) {
          this.age = age;
      }
      public abstract void eat();
      public static void sleep(){
          System.out.println("睡觉");
      }
  }
  //猫类
  package com.itheima05;
  ​
  public class Cat extends Animal {
      public Cat() {
      }
  ​
      public Cat(String name, int age) {
          super(name, age);
      }
  ​
      @Override
      public void eat() {
          System.out.println("猫吃鱼");
      }
  }
  //狗类
  package com.itheima05;
  ​
  public class Dog extends Animal {
      public Dog() {
      }
  ​
      public Dog(String name, int age) {
          super(name, age);
      }
  ​
      @Override
      public void eat() {
          System.out.println("狗吃骨头");
      }
  }
  //测试类
  package com.itheima05;
  ​
  //测试类
  public class AnimalTest {
      public static void main(String[] args) {
          Animal a = new Cat();
          a.setName("白猫");
          a.setAge(2);
          System.out.println(a.getName() + ", " + a.getAge());
          a.eat();
          Animal.sleep();
  ​
          System.out.println("--------");
  ​
          a = new Cat("黑猫", 4);
          System.out.println(a.getName() + ", " + a.getAge());
          a.eat();
          Animal.sleep();
  ​
          System.out.println("--------");
  ​
          a = new Dog();
          a.setName("白狗");
          a.setAge(3);
          System.out.println(a.getName() + ", " + a.getAge());
          a.eat();
          Animal.sleep();
  ​
          System.out.println("--------");
  ​
          a = new Dog("黑狗", 4);
          System.out.println(a.getName() + ", " + a.getAge());
          a.eat();
          Animal.sleep();
      }
  }

  ​十一、接口什么是接口
接口就是一种公共的规范标准,只要符合规范标准,都可以使用      
java中的接口更多的体现在对行为的抽象
十二、接口特点1.如何定义接口
public interface 接口名{}      
2.如何实现接口
public class 类名 implements 接口名{}      
3.接口不能被实例化,可以通过多态形式创建实现类对象4.接口的实现类
要么重写接口中所有的抽象方法           
要么实现类定义为抽象类
十三、接口的成员特点1.成员变量
只能是常量,默认修饰符为:public static final      
2.构造方法
接口中没有构造方法      
3.成员方法
接口中可以有抽象方法,默认修饰符为:public abstract           
JDK8以后可以有静态方法(后面学)           
JDK9以后可以有默认方法(后面学)
十四、猫和狗(接口版)  
[Java] 纯文本查看 复制代码
 //动物类
  package com.itheima09;
  ​
  public abstract class Animal {
      private String name;
      private int age;
  ​
      public Animal() {
      }
  ​
      public Animal(String name, int age) {
          this.name = name;
          this.age = age;
      }
  ​
      public String getName() {
          return name;
      }
  ​
      public void setName(String name) {
          this.name = name;
      }
  ​
      public int getAge() {
          return age;
      }
  ​
      public void setAge(int age) {
          this.age = age;
      }
      public abstract void eat();
  }
  //跳接口
  package com.itheima09;
  ​
  public interface Jumpping {
      public abstract void jump();
  }
  //猫类
  package com.itheima09;
  ​
  public class Cat extends Animal implements Jumpping {
      public Cat() {
      }
  ​
      public Cat(String name, int age) {
          super(name, age);
      }
  ​
      @Override
      public void eat() {
          System.out.println("猫吃鱼");
      }
  ​
      @Override
      public void jump() {
          System.out.println("猫可以跳高了");
      }
  }
  //狗类
  package com.itheima09;
  ​
  public class Dog extends Animal implements Jumpping {
      public Dog() {
      }
  ​
      public Dog(String name, int age) {
          super(name, age);
      }
  ​
      @Override
      public void eat() {
          System.out.println("狗吃骨头");
      }
  ​
      @Override
      public void jump() {
          System.out.println("狗可以跳远了");
      }
  }
  ​
  //测试类
  package com.itheima09;
  ​
  public class AnimalTest {
      public static void main(String[] args) {
          Cat c =new Cat();
          c.setName("白猫");
          c.setAge(2);
          System.out.println(c.getName()+","+c.getAge());
          c.eat();
          c.jump();
          System.out.println("--------");
          c = new Cat("黑猫",3);
          System.out.println(c.getName()+","+c.getAge());
          c.eat();
          c.jump();
          System.out.println("--------");
          Dog d = new Dog();
          d.setName("白狗");
          d.setAge(2);
          System.out.println(d.getName()+","+d.getAge());
          d.eat();
          d.jump();
          System.out.println("--------");
          d = new Dog("黑狗",3);
          System.out.println(d.getName()+","+d.getAge());
          d.eat();
          d.jump();
      }
  }

  ​十五、类和接口的关系类和类之间的关系
继承关系,可以单继承,不能多继承,但是可以多层继承
类和接口之间的关系
实现关系,可以单实现,也可以多实现     
还可以继承一个类的同时,再实现多个接口
接口和接口之间的关系
继承关系,可以单继承、也可以多继承
十六、抽象类和接口的区别1.成员区别
抽象类:变量、常量、构造方法、普通方法、抽象方法         
接口:常量、抽象方法     
2.关系区别
类和类:继承关系,单继承         
类和接口:实现关系,单实现、多实现         
接口和接口:继承关系,单继承、多继承      
3.设计理念区别
抽象类:完成的是一些共性功能和共性属性的抽取(例如:姓名,吃饭)         
接口:完成的是一些特性功能的抽取(例如:跳,跑)
十七、运动员和教练案例分析
1.定义说英语接口        成员方法:说英语();
2.定义抽象人类        成员变量:姓名,年龄;构造方法:无参,带参;成员方法:get/set方法,吃饭();
3.定义抽象教练类,继承人类        构造方法:无参,带参;成员方法:教();
4.定义抽象运动员类,继承人类        构造方法:无参,带参;成员方法:学习();
5.定义具体篮球教练类,继承教练类        构造方法:无参,带参;成员方法:重写吃饭(){…},重写教(){…}
6.定义具体乒乓球教练类,继承教练类,实现说英语接口构造方法:无参,带参;成员方法:重写吃饭(){…},重写教(){…},重写说英语(){…}
7.定义具体篮球运动员类,继承运动员类        构造方法:无参,带参;成员方法:重写吃饭(){…},重写学习(){…}
8.定义具体乒乓球运动员类,继承运动员类,实现说英语接口构造方法:无参,带参;成员方法:重写吃饭(){…},重写学习(){…},重写说英语(){…}
9.定义测试类,写代码测试
十八、远动员和教练案例代码实现  
  
[Java] 纯文本查看 复制代码
//说英语接口
  package com.itheima08;
  ​
  public interface SpeakEnglish {
      public abstract void speak();
  }
  //人抽象类
  package com.itheima08;
  ​
  public abstract class Person {
      private String name;
      private int age;
  ​
      public Person() {
      }
  ​
      public Person(String name, int age) {
          this.name = name;
          this.age = age;
      }
  ​
      public String getName() {
          return name;
      }
  ​
      public void setName(String name) {
          this.name = name;
      }
  ​
      public int getAge() {
          return age;
      }
  ​
      public void setAge(int age) {
          this.age = age;
      }
      public abstract void eat();
  }
  //教练抽象类
  package com.itheima08;
  ​
  public abstract class Coach extends Person {
      public Coach() {
      }
  ​
      public Coach(String name, int age) {
          super(name, age);
      }
  ​
      public abstract void teach();
  }
  //运动员抽象类
  package com.itheima08;
  ​
  public abstract class Player extends Person {
      public Player() {
      }
  ​
      public Player(String name, int age) {
          super(name, age);
      }
  ​
      public abstract void study();
  }
  //篮球教练具体类
  package com.itheima08;
  ​
  public class BasketballCoach extends Coach {
      public BasketballCoach() {
      }
  ​
      public BasketballCoach(String name, int age) {
          super(name, age);
      }
  ​
      @Override
      public void teach() {
          System.out.println("篮球教练教如何运球和投篮");
      }
  ​
      @Override
      public void eat() {
          System.out.println("篮球教练吃羊肉,喝羊奶");
      }
  }
  //乒乓球教练具体类
  package com.itheima08;
  ​
  public class PingPangCoach extends Coach implements SpeakEnglish {
      public PingPangCoach() {
      }
  ​
      public PingPangCoach(String name, int age) {
          super(name, age);
      }
  ​
      @Override
      public void teach() {
          System.out.println("乒乓球教练教如何发球和接球");
      }
  ​
      @Override
      public void eat() {
          System.out.println("乒乓球教练吃大白菜,喝小米粥");
      }
  ​
      @Override
      public void speak() {
          System.out.println("乒乓球教练说英语");
      }
  }
  ​
  //篮球运动员具体类
  package com.itheima08;
  ​
  public class BasketballPlayer extends Player {
      public BasketballPlayer() {
      }
  ​
      public BasketballPlayer(String name, int age) {
          super(name, age);
      }
  ​
      @Override
      public void study() {
          System.out.println("篮球运动员学习如何运球和投篮");
      }
  ​
      @Override
      public void eat() {
          System.out.println("篮球运动员吃牛肉,喝牛奶");
      }
  }
  //乒乓球运动员具体类
  package com.itheima08;
  ​
  public class PingPangPlayer extends Player implements SpeakEnglish {
      public PingPangPlayer() {
      }
  ​
      public PingPangPlayer(String name, int age) {
          super(name, age);
      }
  ​
      @Override
      public void study() {
          System.out.println("乒乓球运动员学习如何发球和接球");
      }
  ​
      @Override
      public void eat() {
          System.out.println("乒乓球运动员吃小白菜,喝大米粥");
      }
  ​
      @Override
      public void speak() {
          System.out.println("乒乓球运动员说英语");
      }
  }
  //测试类
  package com.itheima08;
  ​
  public class PersonTest {
      public static void main(String[] args) {
          System.out.println("----篮球运动员无参构造----");
          BasketballPlayer bp = new BasketballPlayer();
          bp.setName("张三");
          bp.setAge(20);
          System.out.println(bp.getName() + "," + bp.getAge());
          bp.study();
          bp.eat();
          System.out.println("----篮球运动员有参构造----");
          bp = new BasketballPlayer("王五", 22);
          System.out.println(bp.getName() + "," + bp.getAge());
          bp.study();
          bp.eat();
          System.out.println("----乒乓球运动员无参构造----");
          PingPangPlayer ppp = new PingPangPlayer();
          ppp.setName("李四");
          ppp.setAge(21);
          System.out.println(ppp.getName() + "," + ppp.getAge());
          ppp.study();
          ppp.eat();
          System.out.println("----乒乓球运动员有参构造----");
          ppp = new PingPangPlayer("赵六", 23);
          System.out.println(ppp.getName() + "," + ppp.getAge());
          ppp.study();
          ppp.eat();
          System.out.println("----篮球教练无参构造----");
          BasketballCoach bc = new BasketballCoach();
          bc.setName("田七");
          bc.setAge(35);
          System.out.println(bc.getName() + "," + bc.getAge());
          bc.teach();
          bc.eat();
          System.out.println("----篮球教练有参构造----");
          bc = new BasketballCoach("王浩", 36);
          System.out.println(bc.getName() + "," + bc.getAge());
          bc.teach();
          bc.eat();
          System.out.println("----乒乓球教练无参构造----");
          PingPangCoach ppc = new PingPangCoach();
          ppc.setName("苟八");
          ppc.setAge(37);
          System.out.println(ppc.getName() + "," + ppc.getAge());
          ppc.teach();
          ppc.eat();
          System.out.println("----乒乓球教练有参构造----");
          ppc = new PingPangCoach("段十", 38);
          System.out.println(ppc.getName() + "," + ppc.getAge());
          ppc.teach();
          ppc.eat();
      }
  }



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马