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. 主要在上层定义功能,让子类继承实现

相关文章
|
4月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
262 0
|
5月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
184 1
|
5月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
234 0
|
6月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
7月前
|
存储 Java 测试技术
Java基础 - 面向对象
面向对象编程是Java的核心,包含封装、继承、多态三大特性。封装隐藏实现细节,提升代码可维护性与安全性;继承实现类间IS-A关系,支持代码复用;多态通过继承、重写与向上转型,实现运行时方法动态绑定,提升系统扩展性与灵活性。
128 0
|
8月前
|
安全 Java API
Java 抽象类与接口在 Java17 + 开发中的现代应用实践解析
《Java抽象类与接口核心技术解析》 摘要:本文全面剖析Java抽象类与接口的核心概念与技术差异。抽象类通过模板设计实现代码复用,支持具体方法与状态管理;接口则定义行为规范,实现多态支持。文章详细对比了两者在实例化、方法实现、继承机制等方面的区别,并提供了模板方法模式(抽象类)和策略模式(接口)的典型应用示例。特别指出Java8+新特性为接口带来的灵活性提升,包括默认方法和静态方法。最后给出最佳实践建议:优先使用接口定义行为规范,通过抽象类实现代码复用,合理组合两者构建灵活架构。
245 2
|
Java
Java——抽象类和接口
抽象类是一种不能被实例化的类,至少包含一个抽象方法(无实现体的方法),常用于定义一组相关类的共同特征,并强制子类实现特定方法。抽象方法不能被 `static` 或 `final` 修饰,且必须被重写。 接口则是一个完全抽象的类,用于规范类的行为。接口使用 `interface` 关键字定义,不能实例化,并且类与接口之间是实现关系。 内部类是在一个类内定义的类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可被修饰符修饰,静态内部类只能访问外部类的静态成员,局部内部类定义在方法内,匿名内部类则隐藏了名字,直接通过 `new` 关键字定义并实现接口或继承类。
134 5
Java——抽象类和接口