欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

类三大特性 封装、继承、多态

程序员文章站 2022-12-20 21:37:08
类三大特性封装封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问。从而更好地实现“高内聚、低耦合”思想。特点Java可以通过private、default、protected、public来修饰成员变量,从而实现外部程序访问成员变量权限private 修饰的成员变量不能被外部成员直接访问,通常需要调用get/set实现访问成员变量的效果public String getName(){ return this.nam...

类三大特性

封装

封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问。从而更好地实现“高内聚、低耦合”思想。

特点

  • Java可以通过private、default、protected、public来修饰成员变量,从而实现外部程序访问成员变量权限
  • private 修饰的成员变量不能被外部成员直接访问,通常需要调用get/set实现访问成员变量的效果
public String getName(){   
        return this.name;
    }
    
    public void setName(String name){
        this.name = name;
    }
}

封装的意义

  1. 提高程序的安全性
  2. 隐藏代码实现细节
  3. 统一接口
  4. 方便系统维护

继承

继承是类与类之间关系之一,通过extends关键字实现子类(派生类)继承父类(基类)效果。在Java语言中,所有的类默认直接或间接继承Object类

super关键字

super关键字在继承关系类中常常使用到,是子类访问父类重要工具

父类

public class Person {
    public String name = "这是父类";
}

子类

public class Student extends Person{
    private String name = "这是子类";

    public void print(String name){
        System.out.println(name);
        System.out.println(this.name);
        System.out.println(super.name);
    }
}

测试类

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.print("这是测试类");
    }
}

结果
类三大特性  封装、继承、多态

  • 可以清楚的看到,this指向的当前类成员变量,super指向的是父类成员变量,而未加this和super的name指向测试类传递的变量

父类

public class Person {
    public String name ;

    public Person(){
        this.name = "这是父类";
    }
}

子类

public class Student extends Person{
    private String name ;

    public Student(){
        super();
        this.name = "这是子类";
    }

    public void print(){
        System.out.println(this.name);
        System.out.println(super.name);
    }
}

测试类

public class Application {
    public static void main(String[] args) {
        Student student = new Student();
        student.print();
    }
}

结果
类三大特性  封装、继承、多态

  • 可以清楚的看到,我们通过测试类调用子类的构造器时,会先通过**super()**调用父类无参构造,注意super()必须放在构造函数首行,否则编译不能通过,且super()和this()不能同时出现在构造器中,原因两者都必须放在构造函数首行,否则编译不会通过,如下图
    类三大特性  封装、继承、多态

方法的重写

  • 重写指的是方法的重写,与属性无关。方法的重写是子类对父类方法的重写,因为父类功能有时子类不一定需要或不一定满足子类

特点

  1. 方法的重写都是非静态方法,静态方法不存在重写。如:

父类

public class Person {
    public static void print(){   //静态方法
        System.out.println("这是父类");
    }
}

子类

public class Student extends Person{
    public static void print(){    //静态方法
        System.out.println("这是子类");
    }
}

测试类

public class Application {
    public static void main(String[] args) {
        Person student = new Student();
        Student student1 = new Student();
        student.print();
        student1.print();
    }
}

结果
类三大特性  封装、继承、多态

  • 可以看到两次调用print方法结果不同,取决于左边类变量类型,没有实现方法的重写,因此静态方法不存在重写

当我们将方法父子类方法都改为非静态方法后,结果是:
类三大特性  封装、继承、多态

  • 可以看到,子类已经方法已经重写重写父类方法,遵循向下转型
    另外需要注意的是,子类重写方法修饰符和异常抛出范围可以缩小,但不能扩大

多态

  • 特点:动态编译,可扩展性
public class Application {
    public static void main(String[] args) {
        Person s1 = new Student();
        Person s2 = new Teacher();
        Person s3 = new Person();
        s1.print();
        s2.print();
        s3.print();
    }
}

结果
类三大特性  封装、继承、多态

  • 可以看到对象左边实际类型都是确定的,即为父类Person类,但是指向的引用类型可以不同,可以随着程序的进行而进行确定,这就体现了多态的动态编译性。

  • 父类可以指向子类,但是不能调用子类独有方法,而子类可以调用自己和继承类方法

子类

public class Student extends Person{

    public void print() {
        System.out.println("这是student");
    }

    public void say(){
        System.out.println("学生说话了");
    }
}

父类

public class Person {
    public  void print(){
        System.out.println("这是父类");
    }
}

测试类

public class Application {
    public static void main(String[] args) {
        Person s1 = new Student();
        s1.print();
        ((Student) s1).say();
    }
}

结果
类三大特性  封装、继承、多态

  • 可以看到当父类和子类用公共类时,同时引用类型指向子类方法,可以通过方法重写,调用子类方法,但是当方法为子类独有时,必须使用向下强转类将父类强转为子类,再调用子类独有方法。

本文地址:https://blog.csdn.net/weixin_45672377/article/details/109569732