Java基础(二):继承+多态+抽象类

本文详细介绍了Java中的继承概念、成员变量隐藏与方法重写、super关键字的应用、final关键字的使用场景,以及对象的上转型对象。接着探讨了继承与多态,包括多态的定义、优点、必要条件和示例。同时讲解了抽象类与抽象方法,强调了抽象类不能被实例化以及抽象方法的特点。文章还提到了面向抽象编程和面向接口编程的重要性,以及面向对象设计的基本原则。最后讨论了接口在Java中的角色,包括接口的定义、实现、回调和多态,展示了接口在软件设计中的灵活性和可扩展性。

文章目录

一、子类与父类:

1、继承的概念:

通过必要的说明能够实现某个类无需重新定义就拥有另一个类的某些属性和方法,把这种关系称为继承,先定义的类成为父类,后定义的类称为子类,并且允许多层的继承关系。
子类创建对象也会默认调用父类的无参构造函数

JAVA中实现继承的语法: 

class 子类名字 extends 父类名字{
   
             }

示例:

class Person {
   
           //Person类称 父类,又称超类,基类

      protected String name;

      protected int age;

      public Person(){
   
         }

      public Person(String name,int age){
   
   

            this.name = name;

            this.age = age;

      }

     public void setAge(int age){
   
   

              this.age = age;

      }

     public void display(){
   
   

    System.out.println("姓名:" + name + " 的年龄是: " + age);

       }

}

class Student extends Person{
   
       //Student类是子类,又称派生类

      private String stuNo;

      public Student(){
   
          }

      public Student(String stuNo){
   
   

               name = "张三";

              age = 18;

              this.stuNo = stuNo;

        }

      public void displayNo(){
   
   

              System.out.println("学号是:" + stuNo);

      }

}

说明:★★★
1)、Java只支持单一继承,即extends后面只能有一个父类名字。
2)、如果要实现多重继承,只有通过接口实现。
3)、所有的类都派生自Object类。即除了类Object外,凡是没有指明扩展关系的类,都认为是省略了“extends Object”,都派生自类Object。
4)、派生具有传递性。如果类A派生了类B,类B又派生了类C,则C不仅继承了B,也继承了A。

2、继承的作用: 提供软件复用功能。就是让子类拥有父类中相关访问权限的成员变量和成员方法。这种做法能减小代码和数据的冗余度,大大增加程序的重用性。

3、继承关系的UML图:

类与类之间的继承关系,又称为泛化关系。泛化关系UML图是采用直线空心三角形连接两个类,Person类和Student类之间的泛化关系图如下:
在这里插入图片描述

二、继承中的成员变量隐藏和方法重写

1、成员变量的隐藏:

对于子类可以从父类继承的成员变量,只要子类中声明的成员变量和父类中的成员变量同名时,子类就隐藏了继承父类的成员变量,子类自己声明定义的方法操作,与父类同名的成员变量,则是子类中重新声明定义的这个成员变量。

注意:子类继承父类其实就是copy了一份,当子类重写隐藏父类成员时,可以用super来调用那些被隐藏的
阅读下面的程序并理解:

Goods.java

public class Goods {
   
   

        public double weight;

         public void oldSetWeight(double w) {
   
   

                weight=w;

                System.out.println("double型的weight="+weight);

    }

     public double oldGetPrice() {
   
   

            double price = weight*10;

             return price;

    }

}

CheapGoods.java

public class CheapGoods extends Goods {
   
   

        public int weight;

        public void newSetWeight(int w) {
   
   

                 weight=w;

                 System.out.println("int型的weight="+weight);

    }

    public double newGetPrice() {
   
   

              double price = weight*10;

              return price;

      }

}

//UseCheapGoods.java

public class UseCheapGoods{
   
   

  public static void main(String args[]) {
   
   

    CheapGoods cheapGoods=new CheapGoods();

    cheapGoods.weight=198.98; //是非法的,因为子类对象的weight已经是int型

   cheapGoods.newSetWeight(198);

    System.out.println("对象cheapGoods的weight的值是:"+cheapGoods.weight);

    System.out.println("cheapGoods用子类新增的优惠方法计算价格:"+

     cheapGoods.newGetPrice());

     cheapGoods.oldSetWeight(198.987); //子类对象调用继承的方法操作隐藏的double型变量weight

    System.out.println("cheapGoods使用继承的方法(无优惠)计算价格:"+ cheapGoods.oldGetPrice());

  }  

}

2、子类对继承父类方法的重写:

子类通过重写可以隐藏已继承的实例方法。

1、重写的语法规则

如果子类可以继承父类的某个实例方法,那么子类就可以对该方法进行重写。

方法重写是指:子类中定义一个方法,这个方法的返回值类型、方法名、参数列表与父类的方法完全相同。

2、重写的目的:

子类通过方法重写可以隐藏继承下来的方法,子类通过方法重写可以把父类的状态和行为改变为自身的状态和行为。

阅读并理解 下面的程序:

//Goods.java

public class Goods {
   
   

        public double weight;

         public void setWeight(double w) {
   
   

                weight=w;

                System.out.println("double型的weight="+weight);

    }

     public double getPrice() {
   
   

            double price = weight*10;

             return price;

    }

}

//CheapGoods.java

public class CheapGoods extends Goods {
   
   

        public int weight;

        public void setWeight(int w) {
   
    //由于参数类型与父类不同,故不是重写

                 weight=w;

                 System.out.println("int型的weight="+weight);

    }

    public double getPrice() {
   
        //重写了父类中的getPrice()方法

              double price = weight*5;

              System.out.println("我重写了父类的getPrice方法");

              return price;

      }

}

//UseCheapGoods.java

public class UseCheapGoods{
   
   

       public static void main(String args[]) {
   
   

              CheapGoods cheapGoods=new CheapGoods();

                  cheapGoods.setWeight(198);

                  System.out.println("对象cheapGoods的weight的值是:"+cheapGoods.weight);

                  System.out.println("cheapGoods用子类新增的优惠方法计算价格:"+  cheapGoods.getPrice());

     cheapGoods.setWeight(198.987);

    System.out.println("cheapGoods使用继承的方法(无优惠)计算价格:"+ cheapGoods.getPrice());

  }  

}

★★★
特别注意:当子类重写了父类的方法时,要注意以下两点:
1、子类的方法不能比父类方法抛出更多的异常。
2、子类的方法不能缩小父类方法的访问权限。

3、重载

重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。

每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表

最常用的地方就是构造器的重载。

重载规则:

  • 被重载的方法必须改变参数列表(参数个数或类型不一样);
  • 被重载的方法可以改变返回类型;(不必要相同的意思)
  • 被重载的方法可以改变访问修饰符;(不必要相同)
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。
  • 无法以返回值类型作为重载函数的区分标准。

三、super关键字

super的作用:用来连接(使用)当前子类对象中的父类的方法或成员变量。

★1、调用父类的构造方法。super必须在第一行。

调用方法:super([参数]);

class Base{
   
   
	Base(){
   
   

		System.out.println("Base");
}
}
public class Test1 extends Base{
   
   
	Test1(){
   
   
		super();//这才是对的;如果不加他也会默认调用父类无参构造器
		System.out.println("Checket");



}

public static void main(String[] arg){
   
   

Test1 c = new Test1();

}

}

2、使用super访问被子类成员隐藏的父类成员或者方法。

调用方法:
super.父类的成员变量;
super.父类的方法名();

理解下面的程序:

class Animal{
   
   	   //定义一个动物类

	      int age=3;//如果我把父类的成员变量 权限改为 private 则 子类不可以访问

         int weight=5;

         Animal(int age,int weight){
   
       //构造方法
                  this.age = age;
                   this.weight = weight;
         }
	  public void meow(){
   
         //叫声
		    System.out.println("Meow......");
	  }
}

class Cat extends Animal{
   
         
        int age;   //定义年龄
        int high;  //定义高度
        Cat(int a,int w,int h){
   
   
              super(a,w);     //调用父类构造方法
               high = h;
         }

	public void meow(){
   
      
		System.out.println("喵喵......");
	}

	public void display(){
   
   
		System.out.println("父类的age:"+super.age);
		System.out.println("父类的weight:"+super.weight);
                 System.out.println("子类的age:" + age);
		super.meow();    //父类中的meow()方法
                 meow();     //子类中的meow()方法
	}
	public static void main(String[] arg){
   
   		
		Cat cat = new Cat(3,4,2);
                cat.display();
	}
}

结果:
在这里插入图片描述
★★★
特别注意:子类一定要调用父类中的构 式有两种:
1、当子类的构造方法中没有super()调用父类构造方法时,则子类构造方法默认调用父类的缺省构造方法。
2、当子类的构造方法中有super()调用父类构造方法时,则子类调用父类中参数匹配的父类构造方法。


四、final关键字

final 指的是“不可变的”,"最终的"意思。

final关键字可以用来修饰类、成员方法、成员变量 和方法中的局部变量。

final关键字有四种用法:

1、修饰类:表示该类不能被继承

示例:

JDK系统中的String类定义成final的,String类是不能被继承的:
public final class String extends Object implements Serializable, Comparable, harSequence

fianl class People {
   
    

       private String name;

       public People(String str){
   
   

               name = str;

        }

}

class  Student extends People{
   
        }    //错误 

第四章 面向对象的概念和 Java 实现-2 回顾 是具有相同属性和行为的一组对象的 集合 , 对象是的实例 封装是隐藏对象实现细节的过程,以便不让用户看到实现的细节 可用Class 来定义的变量和方法可被该类的实例访问, 圆点符号用于访问对象的成员,构造函数在创建对象时初始化对象 包可用package 来申明 ,可用import 来导入包 目标 理解继承及其特点 运用JAVA程序实现继承 理解多态及其特点设计 运用JAVA程序实现多态 掌握访问修饰符和方法修饰符 继承 继承的特点 继承的优点 继承JAVA实现 子构造方法 2-1 子构造方法 2-2 调用父构造方法的语法为: super() 或 super(参数列表) ; super () 方法始终指向调用的父 调用父构造方法 演示:示例 3 多态性 2-1 多态性是指¡°多种形式¡± 它使用不同的实例而执行不同操作 多态包括方法重写和方法重载 多态性 2-2 方法重载 2-1 方法重载 2-2 演示:示例 4 方法重写 2-1 方法重写 2-2 访问修饰符 3-1 信息隐藏是 OOP 最重要的功能之一,也是使用访问修饰符的原因 信息隐藏的原因包括: 对任何实现细节所作的更改不会影响使用该类的代码 防止用户意外删除数据 此易于使用 访问修饰符 3-2 访问修饰符 3-3 访问修饰符可访问性 方法修饰符 static 修饰符 3-1 static修饰符修饰的方法叫静态方法 目的 使该方法独立于的实例,使用去访问,而不是实例,所以也叫方法 static 修饰符 3-2 调用静态方法的语法为: classname.methodname( ); static 修饰符 3-3 演示:示例 6 final 修饰符 abstract 修饰符 3-1 由abstract修饰的方法叫抽象方法;由abstract修饰的抽象类 抽象方法必须声明在抽象类中 抽象方法语法: abstract type method_name(parameter_list); 声明抽象类语法: abstract class{…… } 使用:父中的某些抽象不包含任何逻辑,需要在子中重写,子提供这种抽象方 法的实现细节 abstract 修饰符 3-2 抽象类可以具有指向子对象的对象引用 abstract 修饰符 3-3 演示:示例 7 接口 接口就是某个事物对外提供的一些功能的申明 可以利用接口实现多态,同时接口也弥补了Java单一继承的弱点 使用interface关键字定义接口 一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现 创建接口的步骤 2-1 // 定义方法的接口 public interface myinterface { public void add(int x, int y); public void volume(int x,int y, int z); } // 定义程序使用的常量的接口 public interface myconstants { public static final double price = 1450.00; public static final int counter = 5; } 创建接口的步骤 2-2 接口使用示例 总结 封装、继承多态是面向对象的主要特征 继承可提高代码的重用性,使用extends关键字来实现。除了构造方法之外,父的所有 方法和属性都被子的对象继承 多态性是不同的实例对象以不同的方式对相同的信息作出不同的表现 访问修饰符用于确定访问成员的方式 Java 常用修饰符有 static、final、abstract 接口是Java编程一项重要的技术,同过它可以实现多态,同时它也弥补了Java单一继承 的不足 . . ----------------------- 《java面向对象程序设计-继承多态》教案全文共5页,当前为第1页。 《java面向对象程序设计-继承多态》教案全文共5页,当前为第2页。 《java面向对象程序设计-继承多态》教案全文共5页,当前为第3页。 《java面向对象程序设计-继承多态》教案全文共5页,当前为第4页。 《java面向对象程序设计-继承多态》教案全文共5页,当前为第5页。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值