本帖最后由 小石姐姐 于 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();
}
}
|