Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类

简介: Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类

本文详细介绍了Java中的面向对象特性,包括封装的概念与案例、单例模式、继承原理及其用法、方法重写规则、super关键字的作用以及抽象类和抽象方法的运用。


前言:本篇文章会介绍Java语言面向对象的三大特征中的封装与继承(多态会在(四)中介绍)

封装

概念:

将类中的某些信息,使用不同的访问权限修饰符隐藏起来,不让外界直接访问操作,而是通过类         中向外提供的特定方法访问,方便加入控制语句,主动权在类手中

案例:

封装案例1:将类中成员变量私有化
public class Student {
    private String name;
    private int age ;
}

此时在其他类中不能任意访问成员变量,只能通过类中提供的特殊的方法进行访问

 public String getName() {
        return name;
    }
 
    public void setName(String name) {
        //加入控制语句
        if(name.length()>1&&name.length()<5);{
            this.name = name;
        }
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        //加入控制语句
        if(age<100&&age>0){
            this.age = age;
        }
    }

让我们来测试下吧:

public static void main(String[] args) {
        Student s1 = new Student();
        s1.setName("小王"); //符合setName方法中的条件
        s1.setAge(-1);     //不符合setAge方法中的条件
        System.out.println(s1.getName());
        System.out.println(s1.getAge());
    }

在IDEA中可以通过右键方法变量,选择Generate,点击setter或者getter,直接创建一个外部可用的方法,这样就可以减少我们手写方法的时间了.


    (按住Ctrl键可多选)

(这样就可以快速生成向外提供的特殊方了)

封装案例2:将类中的方法私有化

单例模式让一个类在一个程序中只能创建一个对象,将类的构造方法私有化,外界不能随便用.

public class Window {
    //在类加载时,只创建了一个唯一对象
    static Window window = new Window();
 
    //将构造方法私有化,在外界不能随意调用
    private Window(){
 
    }
    //向外界提供可获得此对象的方法
    public  static  Window getWindow(){
        return window;
    }
 
    public static void main(String[] args) {
        System.out.println(Window.getWindow());
        System.out.println(Window.getWindow());
        System.out.println(Window.getWindow());
    }
 
}

可以看到,此例中创建的每个window的哈希值都相同于Window类中第一次创建的window

作用:可以有效的避免创建多个对象,达到在一个程序中只创建一个对象的作用

继承

概念:将同一类事物中共性的属性和行为进行抽取,定义为一个类中(基类),其他类可以继承               基类,就可以拥有基类中的功能,但不能使用基类中私有的内容.

作用:实现代码的复用性,以及可以在子类扩展自己特有的功能,而不影响其他类.(优点)

使用条件:  只要符合is-a关系(什么是什么关系,比如苹果是水果),就可以使用继承,一个类只能直接继承一个类而间接的可以继承多个类,称为继承的传递性,例如b继承a,然后c继承b,则c也继承了a.


注意:当一个类没有显示继承其他类的时候默认继承object类Object类是java类体系中最大的类,Object类之上再也没有别的类

继承的基本语法:

在创建类的时候在类名后使用extends关键字继承别的类,子类继承父类后,拥有了父类的成员变量和成员方法,但不能访问私有成员。

public class Cat extends Animal{
   //Cat继承Animal的成员变量和成员方法,但不能访问私有成员
}

方法的重写

概念:

当父类中方法的实现不能满足子类需求时,可以在子类中对父类的方法进行重写(覆盖),这样调用时,就会调用子类中重写的方法。

重写时需要注意:

  1.子类重写的方法结构与父类方法的结果必须一致(方法名,参数列表,返回值类型必须一致)


  2.子类重写的方法使用的访问权限不能小于父类被重写方法的访问权。


  3.构造方法,静态方法不能重写,成员变量不存在重写


  4.使用 @Override 注解标签


关于@Override注解标签:

@Override是Java中的一个注解标签,定义在重写的方法上面,表示此方法是从父类重写而来,也可以不用添加,不过建议保留,因为编译器可以进行语法验证 ,并且阅读代码时可以明确的知道此方法是重写的。

快速生成重写方法:

在IDEA中可以通过在子类括号内部的空白中右键空白处选择Generate,点击Override Mathod

super关键字

作用:在子类中用来调用父类中的成员,super可用于访问父类中定义的属性,可调用父类中定义的成员方法,还可以在子类构造器中调用父类的构造器;当子父类出现同名成员时,可以用super表明调用的是父类中的成员。

super和this区别:

this代表本类对象的引用,表示当前对象.

super代表父类的内存空间的标识,调用的是父类中成员,不是父类对象.

继承中的构造方法

概念:子类继承父类时,不会继承父类的构造方法,只能通过“super(形参列表)”,的方式调用父类指定的构造方法。

用法:

1.  规定super(形参列表),必须声明在构造器的首行。

2 . 如果在子类构造器的首行没有显示调用super(形参列表),则子类此构造器默认调用super(),即       调用父类中空参的构造器。

(这么做是为了保证先对父类成员进行初始化)

抽象类

抽象方法

概念:是一种特殊的方法,只有声明,没有具体的实现,必须用abstract关键字修饰,没有方法体.

为什么要有抽象的方法在一些体系结构的顶端,只需要某些定义功能而没有必要实现,因为不同子类中的实现都不同,这个时候就可以将这个方法声明为抽象方法。

例如定义一个eat的抽象方法:

    //抽象类也需要用abstract来修饰
public abstract  class Animal {
    //抽象方法,没有方法体
    public abstract void eat();
  
}

注意:一个类如果包含抽象方法,这个类为抽象类;一个类为抽象类,不一定有抽象方法。

          抽象类也需要用abstract关键字修饰。

抽象类的特点:

1. 抽象类不能用来创建对象,其他功能与正常类相同,可以有成员变量,成员方法,构造方法

2. 主要在上层定义功能,让子类继承实现

相关文章
|
17天前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
12 2
|
22天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
16 3
|
22天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
29 2
|
22天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
28 2
|
22天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
28 1
|
30天前
|
Java 测试技术 编译器
Java零基础-继承详解!
【10月更文挑战第6天】Java零基础教学篇,手把手实践教学!
22 0
|
6月前
|
搜索推荐 Java
Java的面向对象特性主要包括封装、继承和多态
【4月更文挑战第5天】Java的面向对象特性主要包括封装、继承和多态
48 3
|
6月前
|
Java 程序员 编译器
【详识JAVA语言】面向对象程序三大特性之二:继承
【详识JAVA语言】面向对象程序三大特性之二:继承
67 2
|
5月前
|
Java 开发者
Java 面向对象新视界:揭秘子类如何“继承”父类精华,再添“创新”之笔
【6月更文挑战第16天】在Java的面向对象世界,子类继承父类的特性,如`Circle`继承`Shape`,展示“is-a”关系。子类不仅保留父类的`color`和`display`方法,还添加了`radius`属性及定制的显示逻辑。这种继承与创新允许代码复用,增强灵活性和可扩展性,使得构建复杂系统变得更加高效和模块化。通过持续的继承与定制,开发者能构建出一系列独具特色的类,充分展现面向对象编程的力量。
152 57
|
5月前
|
Java 数据安全/隐私保护 开发者
Java是一种完全支持面向对象编程的语言,其面向对象特性包括封装、继承、多态和抽象等
【6月更文挑战第18天】**面向对象编程(OOP)通过对象封装状态和行为,实现问题域的抽象。Java全面支持OOP,核心特性包括**: - **封装**:保护数据安全,隐藏内部细节。 - **继承**:子类继承父类属性和行为,促进代码重用。 - **多态**:一个接口多种实现,增强灵活性和扩展性。 - **抽象**:通过接口和抽象类抽离共性,简化复杂性。 **Java的OOP便于理解和解决复杂系统问题。**
56 3