zoukankan      html  css  js  c++  java
  • java-面向对象(三)

    一、面向对象特征之二:继承性(inheritance)

    1.继承性的好处

    减少了代码的冗余,提高了代码的复用性
    便于功能的扩展
    为之后多态性的使用提供了前提

    2.继承性的格式:class A extends B{}

    A:子类、派生类、subclass
    B:父类、超类、基类、superclass

    2.1体现:一旦子类A继承父类B之后,子类A中就获取了父类B中声明的所有属性、方法

    特别的,父类中声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。只有因为封装性的影响,使得子类不能直接调用父类的结构而已。

    2.2子类继承父类以后,还可以声明自己特有的属性或方法,实现功能的拓展。

    extends:延展、扩展

    三、Java中关于继承性的规定

    1.一个类可以被多个子类继承。
    2.Java中类的单继承性:一个类只能有一个父类
    3.子父类是相对的概念。
    4.如果我们没有显式的声明一个类的父类,则此类继承于java.lang.Object类

    所有的java类具有java.lang.Object类声明的功能

    案例:在CylinderTest类中创建Cylinder类的对象,设置圆的底面半径和高,并输出圆柱的体积

    Circle.java 文件
    package Test;
    public class Circle {
    private double radius;//半径
    //创建一个无参的构造器
    public Circle(){
    	radius = 1.0;
    }
    //右键source,选择Generate Getter and Setters...生成get,set方法
    public double getRadius() {
    	return radius;
    }
    public void setRadius(double radius) {
    	this.radius = radius;
    }
    
    }
    
    Cylinder.java文件
    package Test;
    public class Cylinder extends Circle{
    private double length;//高
    public Cylinder(){
    	length = 1.0;
    }
    //获取get,set方法
    public double getLength() {
    	return length;
    }
    public void setLength(double length) {
    	this.length = length;
    }
    //返回圆柱的体积
    public double findVolume(){
    	return Math.PI * getRadius() * getRadius() * getLength();
    	//或者return findArea() * getLength();
    }
    }
    
    CylinderTest 文件
    package Test;
    public class CylinderTest {
    public static void main(String[] args) {
    	Cylinder cy = new Cylinder();
    	cy.setRadius(2.11);
    	cy.setLength(6.66);
    	double volume = cy.findVolume();
    	System.out.println("圆柱的体积为:" + volume);
    	double area = cy.findArea();
    	System.out.println("底面圆面积为:" + area);
    }
    }
    

    四、Debug 操作

    1.常用操作

    2.图示


    五、方法的重写

    1.定义:

    在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。

    2.要求:

    ●子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
    ●子类重 写的方法的返回值类型不能大于父类被重写的方法的返回值类型
    ●子类重写的方法使 用的访问权限不能小于父类被重写的方法的访间权限
    ➢子类不能重写父类中声明为private权限的方法
    ➢父类被重写的方法返回值类型是void,则子类重写的方法返回值类型只能是void
    ➢父类被重写的方法返回值类型是A类,则子类重写的方法返回值类型是A类或A类的子类
    ➢父类被重写的方法返回值类型基本数据类型,则子类重写的方法返回值类型必须是相同的基本数据类型
    ●子类方法抛出的异常不能大于父类被重写方法的异常

    3.注意:

    子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。

    案例

    Person 文件
    package Test2;
    public class Person {
    String name;
    int age;
    public Person(){
    	
    }
    public Person(String name,int age){
    	this.name = name;
    	this.age = age;
    }
    public void eat(){
    	System.out.println("吃饭");
    }
    public void walk(int distance){
    	System.out.println("走路,走的距离是:"+ distance + "公里");
    }
    }
    
    Student 文件
    package Test2;
    public class Student extends Person{
    String major;
    public Student(){
    	
    }
    public Student(String major){
    	this.major = major;
    }
    public void study(){
    	System.out.println("学习,专业是:" + major);
    }
    //对父类中的方法进行重写override
    public void eat(){
    	System.out.println("学生应该吃健康有营养的食物");
    }
    }
    
    PersonTest 文件
    package Test2;
    public class PersonTest {
    public static void main(String[] args) {
    	Student s = new Student("信息与计算科学");
    	s.eat();
    	s.walk(10);
    	
    	s.study();
    }
    }
    

    六、super 关键字

    super 理解为:父类的

    super 可以用来调用:属性、方法、构造器

    1.super 调用属性或构造器。

    ➢我们可以在子类的方法或构造器中。通过使用 "super.属性" 或 "super.方法" 的方式,显示的调用父类中声明的属性或方法。通常情况下,我们习惯省略"super."
    ➢特殊情况:当子类和父类中定义了同名的属性时,我们想要在子类中调用父类中声明的属性,则必须显式的使用"super.属性"的方式,表明调用的是父类中声明的属性。
    ➢特殊情况:当子类重写了父类的方法以后,我们想要在子类的方法中调用父类中被重写的方法时,则必须显式的使用"super.方法"的方式,表明调用的是父类中被重写的方法。

    2.super 调用构造器

    ➢我们可以在子类的构造器中显式的使用"super(形参列表)"的方式,调用父类中声明的指定的构造器
    ➢"super(形参列表)"的使用,必须声明在子类构造器的首行!
    ➢我们在类的构造器中,对于"this(形参列表)"或"super(形参列表)"只能二选一,不能同时出现。
    ➢在构造器的首行,没有显式的声明"this(形参列表)"或"super(形参列表)",则默认调用的是父类中空参的构造器:super()
    ➢在类的多个构造器中,至少有一个类的构造器是用了"super(形参列表)",调用父类中的构造器。

    七、子类对象实例化的过程

    1.从结果上看:

    ●子类继承父类以后,就获取了父类中声明的属性或方法。
    ●创建子类的对象,在堆空间中,就会加载所有父类中声明的属性

    2.从过程上看

    内存中有父类的结果,子类对象才可以考虑进行调用

    明确

    创建子类对象时,调用了父类的构造器,但自始至终只创建过一个对象,即为new的子类对象。

  • 相关阅读:
    超简单实例使用websocket进行server和client实时通信
    antd的table行key自增长
    selenium元素定位Xpath,Contains,CssSelector
    slenium使用鼠标+键盘事件或者双击实现代码
    使用python+pychram进行API测试(接口测试)初级STEP 1
    linux命令小常识
    sql中limit使用方法
    Swagger-API测试工具实战
    写 test-case心得
    测试之路之[前奏]
  • 原文地址:https://www.cnblogs.com/nnadd/p/12418723.html
Copyright © 2011-2022 走看看