详细理解JAVA面向对象的封装,继承,多态,抽象

JAVA面向对象的基本概念

Java中,“一切皆对象”,Java程序就是通过面向对象的编程思想来实现的。面向对象的编程思想的核心概念主要包括封装、继承、多态和抽象。这些概念描述了Java对象与类之间的关系和相互作用。

封装

封装是指将数据和行为包装在一起,形成一个类。封装的主要目的是隐藏类的实现细节,只对外部暴露必要的接口,从而达到数据的安全性。

在Java中,我们通过访问控制修饰符(private、public、protected)来实现封装。将方法或变量定义为private时,就只能在本类中访问,而其他类则无法直接访问。继承后也不能访问,只能访问继承自基类的public和protected变量和方法。

示例1:一个简单的封装实例

public class Person {
    private String name;
    private int age;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }
}

public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("张三");
        person.setAge(18);
        System.out.println(person.getName() + "," + person.getAge());
    }
}

示例2:封装的一个好处就是细节的隐藏不会对其他模块造成影响

public class Timer {
    private final int interval;
    private long lastTick;

    public Timer(int interval) {
        this.interval = interval;
        this.lastTick = System.currentTimeMillis();
    }

    public boolean isTick() {
        long current = System.currentTimeMillis();
        if(current - lastTick>= interval) {
            lastTick = current;
            return true;
        }
        return false;
    }
}

public class Test {
    public static void main(String[] args) {
        Timer t = new Timer(1_000);
        for(int i=0; i<10; i++) {
            System.out.println(t.isTick());
            try { Thread.sleep(500);} catch (InterruptedException e) {}
        }
    }
}

继承

继承是指一个类可以集成另一个类的属性和方法。父类也称为基类或超类,子类称为派生类。继承的主要目的是提高代码的重用性,减少代码量。

在Java中,我们通过关键词extends来实现继承。子类可以重写父类中的方法,同时也可以访问父类中的public和protected函数和变量。

示例1:继承的基本实例

class Animal {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void move() {
        System.out.println(name + " can move");
    }
}

class Bird extends Animal {
    public void fly() {
        System.out.println(getName() + " can fly");
    }
}

public class Test {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.setName("鹦鹉");
        bird.move();
        bird.fly();
    }
}

示例2:继承的一个好处就是可以避免代码的重复

class Animal {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void move() {
        System.out.println(name + " can move");
    }
}

class Dog extends Animal {
    public void bark() {
        System.out.println(getName() + " barks");
    }
}

class Cat extends Animal {
    public void meow() {
        System.out.println(getName() + " meows");
    }
}

public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("旺财");
        dog.move();
        dog.bark();

        Cat cat = new Cat();
        cat.setName("小花");
        cat.move();
        cat.meow();
    }
}

多态

多态是指同一个方法可以根据对象的不同,表现出不同的行为。多态有两种体现方式:方法重载和方法覆盖。

方法重载是指同一个类中可以定义多个方法名相同,但参数类型、个数或顺序不同的方法,也称为编译时多态。

方法覆盖是指子类重写父类中定义的方法,使得同名方法可以根据对象类型的不同,表现出不同的行为,也称为运行时多态。

示例1:多态的基本实现

abstract class Animal {
    public abstract void sound();
}

class Cat extends Animal {
    public void sound() {
        System.out.println("喵喵");
    }
}

class Dog extends Animal {
    public void sound() {
        System.out.println("汪汪");
    }
}

public class Test {
    public static void main(String[] args) {
        Animal animal = new Cat();
        animal.sound();
        animal = new Dog();
        animal.sound();
    }
}

示例2:多态的一个好处就是可以将对象看作它所实现的接口或父类来使用

interface Runnable {
    public void run();
}

class Car implements Runnable {
    public void run() {
        System.out.println("Car is running");
    }
}

class Person implements Runnable {
    public void run() {
        System.out.println("Person is running");
    }
}

public class Test {
    public static void main(String[] args) {
        Runnable[] list = new Runnable[2];
        list[0] = new Car();
        list[1] = new Person();

        for(Runnable r : list) {
            r.run();
        }
    }
}

抽象

抽象是指将具体的实现细节抽象为通用的抽象类或接口。Java中可以使用abstract关键字来定义抽象类和抽象方法。

抽象类是指含有抽象方法的类。抽象方法是指只声明,而没有具体实现的方法。抽象类不能被实例化,只能被继承。继承的子类必须实现抽象类中的所有抽象方法,否则也必须被定义为抽象类。

接口是指具有方法签名,但没有实现的类。接口定义了一组规范,其实现类必须实现接口中的所有方法。接口中的方法默认为public,同时没有构造器和数据成员。

示例1:抽象类的基本实现

abstract class Shape {
    public abstract double area();
}

class Rectangle extends Shape {
    private double height;
    private double width;

    public Rectangle(double height, double width) {
        this.height = height;
        this.width = width;
    }

    public double area() {
        return height * width;
    }
}

public class Test {
    public static void main(String[] args) {
        Shape shape = new Rectangle(2, 3);
        System.out.println("The area of rectangle is " + shape.area());
    }
}

示例2:接口的基本实现

interface Runnable {
    public void run();
}

class Car implements Runnable {
    public void run() {
        System.out.println("Car is running");
    }
}

public class Test {
    public static void main(String[] args) {
        Runnable run = new Car();
        run.run();
    }
}

以上就是JAVA面向对象的封装、继承、多态和抽象的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详细理解JAVA面向对象的封装,继承,多态,抽象 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 从实战角度详解Disruptor高性能队列

    关于”从实战角度详解Disruptor高性能队列”的完整攻略,我将从以下几个方面给出一些详细的讲解: 什么是Disruptor高性能队列? Disruptor高性能队列的优缺点 Disruptor高性能队列的基本原理 实战演示一:使用Disruptor实现高性能的消费者-生产者模型 实战演示二:使用Disruptor实现多消费者的高性能队列 什么是Disru…

    Java 2023年5月20日
    00
  • JAVA 多线程编程之CountDownLatch使用详解

    JAVA 多线程编程之CountDownLatch使用详解 什么是CountDownLatch CountDownLatch是Java中一个同步工具类,可以用于控制线程的等待,它可以让某一个线程等待直到倒计时结束,再开始执行。 CountDownLatch的构造方法 public CountDownLatch(int count) { } count表示倒计…

    Java 2023年5月26日
    00
  • java实现事件委托模式的实例详解

    Java实现事件委托模式的实例详解 事件委托模式(Event Delegation Pattern)是软件开发中常用的一种设计模式,它利用事件的传递机制,使一个对象能够处理不同来源的事件。在 Java 编程中,实现事件委托模式可以通过编写接口、事件源(Event Source)和事件监听器(Event Listener)三个部分来完成。 编写接口 在实现事件…

    Java 2023年5月19日
    00
  • 如何使用JDBC实现工具类抽取

    使用JDBC实现工具类抽取需要遵循以下一般步骤: 加载JDBC驱动 创建数据库连接 创建Statement/PreparedStatment对象 执行SQL语句 处理结果集 释放资源 下面通过两个示例说明具体操作。 示例1:查询数据库 public class JdbcUtil { private static String url = "jdbc…

    Java 2023年5月26日
    00
  • java的Hibernate框架报错“ObjectModifiedException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“ObjectModifiedException”错误。这个错误通常是由于以下原因之一引起的: 对已修改的实体进行操作:如果您试对已修改的实体进行操作,则可能会出现此错误。在这种情况下,需要检查实体是否已被修改,并避免对已修改的实体进行操作。 并发访问问题:如果多个线程同时访问同一个实体,则可能会出现此错误…

    Java 2023年5月4日
    00
  • 浅谈java随机数的陷阱

    浅谈Java随机数的陷阱 在Java中,我们常常需要使用随机数来模拟一些随机的行为,比如生成验证码、抽奖等。然而,在使用Java随机数的过程中,我们可能会遇到一些难以预料的陷阱。本文将从以下几个方面详细讲解Java随机数的使用注意事项: 随机种子的问题 伪随机数生成器的局限性 安全随机数生成器的使用方法 随机种子的问题 在Java中,我们可以使用java.u…

    Java 2023年5月19日
    00
  • SSM项目频繁打成war包部署,使用tomcat和maven实现热部署配置

    下面是SSM项目频繁打成war包部署并使用tomcat和maven实现热部署配置的完整攻略。 1. 前置条件 在开始之前,确保以下条件已满足: 项目使用maven进行构建 tomcat服务器已正确安装并运行 项目使用spring、spring mvc、mybatis等框架 2. 配置pom.xml文件 在项目的pom.xml文件中添加以下依赖: <de…

    Java 2023年5月19日
    00
  • 黑客如何利用文件包含漏洞进行网站入侵

    黑客通过利用文件包含漏洞,可以轻松地将自己的代码注入到网站服务器中,从而实现对网站的入侵。下面是黑客会使用的一些攻击方法和技术: 使用文件包含漏洞的攻击方法 抓取页面源代码 黑客可以访问页面的URL,并使用一些指定的参数来获取页面的源代码。一旦黑客获取了页面的源代码,就可以查看其中是否存在文件包含漏洞。 判断漏洞类型 黑客可以通过分析页面源代码,判断该漏洞是…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部