多态

Java中的多态

1.引用多态

父类的引用可以指向本类的对象
Animal obj1=new Animal();
父类的引用可以指向子类的对象
Animal obj2=new Dog();
Animal obj3=new Cat();

2.方法多态(方法的重写)

obj1.eat(); //调用父类的
obj2.eat();//子类重写
obj3.eat();//子类重写,依然调用父类的

多态的实现:继承+方法的重写+父类引用指向子类对象

  1. public class Animal {
  2. String name;
  3. int age;
  4. public Animal(String name, int age) {
  5. this.name = name;
  6. this.age = age;
  7. }
  8. public String getName() {
  9. return name;
  10. }
  11. public void eat(){
  12. System.out.println("吃东西 ");
  13. }
  14. }
  1. public class Dog extends Animal{
  2. @Override //
  3. // ,理解为限定符,意思是告诉编译器,下面这个方法是重写的方法
  4. public String getName() {
  5. //return super.getName();//super代表弗雷对象
  6. return "狗";
  7. }
  8. public Dog() {
  9. super("狗", 1);
  10. }
  11. @Override
  12. public void eat() {
  13. System.out.println("吃棒骨");
  14. }
  15. }
  1. public class Cat extends Animal {
  2. public Cat(String name, int age) {
  3. super(name, age);
  4. }
  5. @Override
  6. public void eat() {
  7. System.out.println("吃鱼");
  8. }
  9. }
  1. public class Main {
  2. public static void main(String[] args) {
  3. //创建父类对象
  4. Animal obj1 = new Animal("斑点狗",1);
  5. //父类引用指向子类对象
  6. Animal obj2 = new Dog();
  7. Animal obj3 = new Cat("猫",1);
  8. //调用方法
  9. obj1.eat();
  10. obj2.eat();
  11. obj3.eat();
  12. }
  13. }

Java中的多态中的引用类型转换

1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换
Dog obj1=new Dog();
Animal obj2=obj1;
2.向下类型转换(强制类型转换),是大类型到削类型的转换
Dog obj3=( Dog)obj2;

  1. public class Main {
  2. public static void main(String[] args) {
  3. // //创建父类对象
  4. // Animal obj1 = new Animal("斑点狗",1);
  5. // //父类引用指向子类对象
  6. // Animal obj2 = new Dog();
  7. // Animal obj3 = new Cat("猫",1);
  8. //
  9. // //调用方法
  10. // obj1.eat();
  11. // obj2.eat();
  12. // obj3.eat();
  13. Dog dog = new Dog();
  14. Animal animal = dog;//隐式自动类型转换,父类型可以向子类型转换
  15. Dog dog2 = (Dog)animal;//强制类型转换
  16. }
  17. }

使用instanceof 检测是否可以强制转换

  1. public class Main {
  2. public static void main(String[] args) {
  3. // //创建父类对象
  4. // Animal obj1 = new Animal("斑点狗",1);
  5. // //父类引用指向子类对象
  6. // Animal obj2 = new Dog();
  7. // Animal obj3 = new Cat("猫",1);
  8. //
  9. // //调用方法
  10. // obj1.eat();
  11. // obj2.eat();
  12. // obj3.eat();
  13. Dog dog=new Dog();
  14. Animal animal= dog;
  15. System.out.println(animal.toString());//每个对象都可以toString输出该对象的类型
  16. //instanceof的原理大概是判断该对象的类型
  17. if(animal instanceof Dog){ //左边的要转换成右边的类型
  18. Dog dog2 =(Dog)animal;
  19. System.out.println("类型可以转换");
  20. }else{
  21. System.out.println("无法类型转换");
  22. }
  23. }
  24. }

Java中的抽象类

实际上用的很少,因为java很多类库已经设计好了
1.语法定义
抽象类前使用abstract关键字修饰,则该类为抽象类。
2.作用
限定子类必须实现某些方法,但不关注实现细节
3.使用规则
A.abstract定义抽象类
B.abstract定义抽象方法,只有声明,不需要实现
C.包含抽象方法的类是抽象类
D.抽象类中可以包含普通的方法,也可以没有抽象方法
E.抽象类不能直接创建,可以定义引用变量

Java中的接口

类是一种具体实现体,而接口定义了某一批类所遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。
image.png

使用接口:

一个类可以实现一个或多个接口,实现接口使用implements关键字。
Java中一个类只能继承一个父类,是不够灵活的,通过实现多个接口可以做为补充
如果要继承父类,继承父类必须在实现接口之前
创建接口类:

  1. //接口的存在就是弥补java的单继承
  2. //java单继承主要继承的是父类的数据
  3. //而一个类的行为方法一都是使用接口进行扩展
  4. //一个类可以实现多个接口,扩展无限多的方法
  5. public interface IAction {
  6. void test1();//默认接口中的方法就是公有方法,不需要实现
  7. void test2();//还可以继续写test3、test4...可以没有实现
  8. }

实现接口:

image.png

  1. public class Test implements IAction{
  2. @Override
  3. public void test1() {
  4. System.out.println("啪啪啪");
  5. }
  6. @Override
  7. public void test2() {
  8. System.out.println("嘿嘿嘿");
  9. }
  10. }

接口的特点:

接口默认就是abstract修饰
接口默认也只能是public的
接口可以继承自多个父接口
接口中的属性是常量(public static final…)
接口中的方法都是抽象方法(public abstract)

匿名内部类

在界面设计中用的非常多

  1. public interface IAction2 {
  2. void study();
  3. }
  1. public interface IAction3 {
  2. void playGame();
  3. }
  1. public class Student implements IAction2{
  2. //学生一般都会学习
  3. @Override
  4. public void study() {
  5. System.out.println("学习");
  6. }
  7. //某些学生喜欢做一些动作
  8. public void addAction(IAction3 action3){ //传递一个参数
  9. action3.playGame();
  10. }
  11. }
  1. public class Main {
  2. public static void main(String[] args) {
  3. Student student = new Student(); //创建一个学生
  4. student.study();
  5. //某些学生想要玩游戏
  6. //如果一个方法参数是接口类型,
  7. // 那么需要传递一个对象,对象所在类必须实现了对应的接口
  8. //内部类对象obj
  9. MyObj obj = new MyObj();//在java中创建对象必须new出来,除了字符串赋值可以直接赋一个常量字符串
  10. student.addAction(obj);//开后门,student类只能玩游戏的(接口2),但增加了一个可以实现接口3的函数,相当于同时有接口2、3
  11. //匿名内部类对象
  12. //1.创建了一个匿名类
  13. //2.匿名类实现了一个接口IAction3
  14. //3.创建了一个匿名类对象
  15. student.addAction(new IAction3() {
  16. @Override
  17. public void playGame() {
  18. System.out.println("玩游戏真爽2");
  19. }
  20. });
  21. }
  22. //创建一个静态内部类(匿名内部类)
  23. public static class MyObj implements IAction3{
  24. @Override
  25. public void playGame() {
  26. System.out.println("玩游戏真爽");
  27. }
  28. }
  29. }

image.png