Java中继承与多态及封装(第一篇)

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中继承与多态及封装(第一篇)相关的知识,希望对你有一定的参考价值。

Java中继承与多态及封装

/**

  • Java是面向对象的语言。具有面向对象的所有特征,包括继承性,封装性,多态性
  • 继承的思想是从已有的类派生出新类,不同的类型可能会有 共同的特征和行为
  • 可以将共同的特征和行为放到同一个类中,使他们可以被其它的类共享
  • Java语言是单继承,一个类不能直接继承多个类,但是可以间接继承多个类
  • 比如: Class A extends B , Class C extends A
  • 则C直接继承A,间接继承B,C是 A的直接子类,C是B的间接子类
    */
/**
 * Java是面向对象的语言。具有面向对象的所有特征,包括继承性,封装性,多态性
 * 继承的思想是从已有的类派生出新类,不同的类型可能会有 共同的特征和行为
 * 可以将共同的特征和行为放到同一个类中,使他们可以被其它的类共享
 * Java语言是单继承,一个类不能直接继承多个类,但是可以间接继承多个类
 * 比如: Class A extends B , Class C extends A
 * 则C直接继承A,间接继承B,C是 A的直接子类,C是B的间接子类
 */
//定义一个父类Person类
public class Person {
    public String name ; //成员变量
    public int age ;
    public Person(){} //无参数构造方法
    public Person(String name, int age){ //带两个参数的构造方法
        this.name = name ;
        this.age = age ;
    }
    public void sayHello(){ //自定义的输出姓名方法
        System.out.println("我的名字是:" + name) ;
    }
}

  • 有了Person类,定义Employee类就可以基继承Person类
  • 下面定义Person类的子类Employee类
  • 子类继承父类中非private的成员变量和成员方法
  • 定义的类若缺少extends关键字,则所定义的类为object的直接子类
  • Java仅支持单继承,即一个类最多有一个直接父类,Java中可以通过接口实现其它语言中的多重继承
  • 注意:父类中定义的private成员变量和方法不能被子类继承,因此在子类中不能直接使用, 如果子类中定义了公共的访问方法和修改方法,子类可以通过这些方法来访问和修改它们
/**

/**
 * 有了Person类,定义Employee类就可以基继承Person类
 * 下面定义Person类的子类Employee类
 * 子类继承父类中非private的成员变量和成员方法
 * 定义的类若缺少extends关键字,则所定义的类为object的直接子类
 * Java仅支持单继承,即一个类最多有一个直接父类,Java中可以通过接口实现其它语言中的多重继承
 */
public class Employee extends Person{
    public double salary ; //员工薪水
    public Employee(){}
    public Employee(double salary){ //带一个参数的构造方法
        this.salary = salary ;
    }
    public Employee(String name, int age, double salary){
        super(name,age)  ; //等价于this.name = name , this.age = age
        this.salary = salary ;
    }
    public double computerSalary(int hours, double rate){
        //计算工资的方法
        double salary = rate * hours ;
        return this.salary + salary ;
    }
    public static void main(String[] args){
        Employee emp = new Employee("王国栋",24,5000) ;
        System.out.println("姓名:" + emp.name) ;
        System.out.println("年龄:" + emp.age) ;
        emp.sayHello() ;
        System.out.println(emp.computerSalary(10,50.0)) ;
    }
}
  • 方法的覆盖,也叫做方法的重写,在子类中定义与父类中名字,参数列表,返回值类型都相同的方法,仅实现不同
  • 方法的覆盖可以理解为同一个方法的不同实现
  • 方法的重载:在一个类中定义多个名称相同但是参数不同的方法
/**
 * 方法的覆盖,也叫做方法的重写,在子类中定义与父类中名字,参数列表,返回值类型都相同的方法,仅实现不同
 * 方法的覆盖可以理解为同一个方法的不同实现
 * 方法的重载:在一个类中定义多个名称相同但是参数不同的方法
 */
 class Parent { //父类
    public void display(double i){
        System.out.println(i) ;
    }
}
public class Children extends Parent{
    @Override //覆盖方法的关键字
    public void display(double i){//方法的覆盖
        System.out.println(2 * i) ;
    }
    public void display(double i, int j){ //方法的重载
        System.out.println(i +" " + j) ;
    }
    public static void main(String[] args){
        Children children = new Children() ;
        children.display(10) ;
        children.display(10.0) ;
        children.display(10.0,20) ;
    }
}

  • super关键字的使用
  • 在子类中可以使用super关键字,用来引用当前对象的父类对象,它可用于下面三种情况
  • 1.在子类中调用父类被覆盖的方法
  • 2.在子类中调用父类的构造方法
  • 3.在子类中调用父类被隐藏的成员变量
  • this关键字的作用
  • 1.解决局部变量与成员变量同名的问题
  • 2.解决方法参数与成员变量同名的问题
  • 3.用来调用该类的另一个构造方法
/**
 * super关键字的使用
 * 在子类中可以使用super关键字,用来引用当前对象的父类对象,它可用于下面三种情况
 * 1.在子类中调用父类被覆盖的方法
 * 2.在子类中调用父类的构造方法
 * 3.在子类中调用父类被隐藏的成员变量
 * this关键字的作用
 * 1.解决局部变量与成员变量同名的问题
 * 2.解决方法参数与成员变量同名的问题
 * 3.用来调用该类的另一个构造方法
 */
class Super{
    int x, y ;
    public Super(){
        System.out.println("创建父类对象") ;
        setXY(5,5) ;
    }
    public void setXY(int x, int y) { //修改x,y值的方法
        this.x = x ;
        this.y = y ;
    }
    public void display(){
        System.out.println("x = " + x  + " " + "y = " + y);
    }
}
class Sub extends Super{
    int x, z ;
    public Sub(){
        this(10,10) ; //调用本类中带两个参数的构造方法
        System.out.println("创建子类对象") ;
    }
    public Sub(int x, int z){
        super() ; //2.在子类中调用父类无参数的构造方法
        this.x = x ;
        this.z = z ;
    }
    @Override
    public void display(){ //覆盖了父类Super的display()方法
        super.display() ; //1.访问父类的display()方法
        System.out.println("x = " + x + " " + "y = " + y) ;
        System.out.println("super.x = " + super.x + ",super.y = " + super.y) ;//3.访问父类被覆盖的成员变量
    }
}
public class SuperTest {
    public static void main(String[] args){
        Sub sub = new Sub() ;
        sub.display() ;
    }
}

  • 子类不能继承父类的构造方法,要创建子类对象需要使用默认构造方法或为子类定义构造方法
  • Java语言规定,在创建子类对象时,必须先创建该类的所有父类对象,因此,在编写子类的构造方法时,
  • 必须保证它能够调用父类的构造方法
  • 1.使用super关键字调用父类的构造方法:不能使用super关键字调用间接父类的构造方法,super.super()是不合法
  • 2.调用父类的默认构造方法
  • 注意:在子类的构造方法中,若没有使用super关键字调用父类的构造方法,
  • 则编译器将在子类的构造方法第一句加上super(),即调用父类无参数的构造方法
  • 在子类构造方法中也可以使用this调用本类的其它构造方法
  • this和super必须是构造方法的第一句,且仅能有其一
  • 创建一个类的实例时,将会沿着继承链调用所有父类的构造方法,这叫做构造方法链
/**
 * 子类不能继承父类的构造方法,要创建子类对象需要使用默认构造方法或为子类定义构造方法
 * Java语言规定,在创建子类对象时,必须先创建该类的所有父类对象,因此,在编写子类的构造方法时,
 * 必须保证它能够调用父类的构造方法
 * 1.使用super关键字调用父类的构造方法:不能使用super关键字调用间接父类的构造方法,super.super()是不合法
 * 2.调用父类的默认构造方法
 * 注意:在子类的构造方法中,若没有使用super关键字调用父类的构造方法,
 * 则编译器将在子类的构造方法第一句加上super(),即调用父类无参数的构造方法
 * 在子类构造方法中也可以使用this调用本类的其它构造方法
 * this和super必须是构造方法的第一句,且仅能有其一
 * 创建一个类的实例时,将会沿着继承链调用所有父类的构造方法,这叫做构造方法链
 */
//定义交通工具类
class Vehicle{
    public Vehicle(){
        System.out.println("创建Vehicle对象") ;
    }
}
class Bicycle extends Vehicle{ //继承了Vehicle类
    private String brand ;
    public Bicycle(){
        this("保时捷911") ; //调用本类中带参数的构造方法
        System.out.println("创建Bicycle对象") ;
    }
    public Bicycle(String brand){
        this.brand = brand ;
    }

    public String getBrand(){
        return brand ;
    }
}
public class ElectricBicycle extends Bicycle{ //继承Bicycle类
    String factory ;
    public ElectricBicycle(){
        System.out.println("创建ElectricBicycle对象") ;
    }
    public static void main(String[] args){
      ElectricBicycle myBicycle = new ElectricBicycle() ;
      System.out.println(myBicycle.getBrand()) ;
    }
}
  • 封装性与访问修饰符
  • 封装性是面向对象的一个重要特征,在Java语言中,对象就是一组变量和方法的封装体
  • 通过对象的封装,用户不必了解对象是如何实现的
  • 只需要 通过对象提供的接口与对象进行交互就可以了
  • 封装性实现了模块化和信息隐藏,有利于程序的移植性和对象的管理
  • 对象的封装是通过下面两种方式实现的
  • 1.通过包实现封装,在定义时,使用package语句指定类属于 哪一个包,包是Java语言封装的最大单位,定义了程序对类的访问权限
  • 2.通过类或者类的成员访问权限实现封装性
  • 类成员的访问权限
  • 1.private访问修饰符:私有成员,只能被这个类本身访问
  • 2.缺省访问修饰符:可被类本身和同一个包中的类所访问
  • 3.protected访问修饰符:可以被不同包的子类访问
  • 4.public访问修饰符:可以被任何类访问

以上是关于Java中继承与多态及封装(第一篇)的主要内容,如果未能解决你的问题,请参考以下文章

C++中继承与多态

Java基本功一文了解Java中继承封装多态的细节

java中继承与实现接口的区别与联系是啥啊?知道的说一下,我这里谢谢了。

第一篇

封装继承和多态

快速学会Java面向对象三大特征