Java学习16-- 面向对象学习45. 面向对象三大特征抽象类和接口

news2024/9/25 1:25:07

面向对象学习4. 面向对象三大特征

  • 1封装:高内聚(内部细节自己用,外部不能介入),低耦合(保留很少接口给外部使用),信息隐藏(禁止外界直接访问内部数据(private),如需要,可通过get/set接口访问)(method get/set下面有详细说明)
  • 2继承
  • 3多态

封装详解

面向对象学习5. 抽象类和接口

private/get/set详细说明:
实际操作中 class内部不是经常用public String def_name而是经常用 private String def_name;
但private的数据不可获取,解决方案是利用自建public get/set method下面新建变量,连接private变量,这样就能保证内部的加密性和模块固定完整性了。

比如在main里面新建一个my_class类型的object叫做x
my_class x = new my_class();
然后给x赋值,注意到my_class本身是公开的public class my_class{},但是其内部的接口全是private的,类似private String int_name;无法直接在main内调用int_name的值。

解决方案:
my_class类型下面加public get/set method

大概结构原理类似这样

public class my_class{
private String int_name;

public String get_name{return int_name;}

public void set_name(String io_name){this.int_name=io_name;}
}

具体代码如下


public class testjan05{
public static void main(String args[]) {
        my_class x = new my_class();
		//新建object
		//为non_s类型(需要按照non_s的class类型制作)
		//这个object取名叫做x
        x.set_name("Emma");
		//执行x里面的method方法set_name,
		//并给了一个叫做Emma的输入值
        System.out.println(x.get_name());}
		//打印输出x下的method方法get_name的返回值
}

//这是对应的my_class文件
public class my_class {
    private String int_name;


    public void set_name(String io_name) {
        this.int_name = io_name;
    }
	//io_name是能够连接外部接口的公开接口
	//int_name是my_class内部的private接口

    public String get_name() {
        return int_name;
    }
//外部需要int_name信息的时候,int_name是private无法调用
//就想办法调用public的method get_name即可

}

输出为

Emma

快捷键
IDEA 自动生成Get/Set模块

Alt+insert(AUUS电脑可能需要额外再按Fn键)

在这里插入图片描述

按下之后选择Getter或者Setter即可获得所想要的接口模块(如上图所式)

代码举例

package oop;

//import oop.Demo03.pet;
import oop.Demo04.Student;
public class Application {
    /*
    public static void main(String[] args) {
       pet doggy =new pet();
       doggy.name="wangcai";
       doggy.age =3;
       doggy.shout();

        System.out.println(doggy.name);
        System.out.println(doggy.age);
        System.out.println();

    }
     */


    public static void main(String[] args) {
        Student x = new Student();
        x.setName("Ella");
        x.setAge(33);
        System.out.println(x.getName());
        System.out.println(x.getAge());
    }

}




package oop.Demo04;

public class Student {
 private String name;
 private int age;
 private int id;


    public String getName() {
        return this.name;
    }

    public int getAge() {
        return age;
    }

    public int getId() {
        return id;
    }

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



    public void setAge(int def_age) {
        if (def_age <0 || def_age >120)
            this.age=3;
        else
            this.age = def_age;
    }

    public void setId(int id) {
        this.id = id;
    }
}


运行运行结果

Ella
33


get/set method的存在,可以帮助程序员在不改变内部结构的前提下,对代码控制维护
比如下面的例子,增加了age并且对输入的age范围控制为0-120,否则赋值666


public class testjan05{
public static void main(String args[]) {
        non_s x = new non_s();
        x.set_name("Lisa");
        System.out.println(x.get_name());
        x.setInt_age(166);
        System.out.println(x.getInt_age());


}
}



public class non_s {
    private String int_name;
    private int int_age;


    public void set_name(String io_name) {
        this.int_name = io_name;
    }

    public String get_name() {
        return int_name;
    }

    public void setInt_age(int io_age) {
        if (io_age >= 0 && io_age <= 120)
        this.int_age = io_age;
        else this.int_age=666;
    }

    public int getInt_age() {
        return int_age;
    }
}


总结:封装接口的作用

  1. 提高代码的安全性
  2. 隐藏代码的实现细节
  3. 统一接口
  4. 增加系统的可维护性
补充知识点:方法的重载
  • 思考:为什么println(x)可以输出很多不同种类的x呢?
    比如x可能是char int float String为什么println都能直接输出呢?

在IDEA里面找到一处出现println的地方,按住ctrl键,跳转到println的源码,会发现,源码将能想到的各种input全类型囊括了,一项写一个method。
这些定义的method全部都叫println,他们是同名的,但是他们每一个method定义的输入类型都是不同的。

继承

继承用于class之间。先学一个关键词extends
extends表示继承 扩展,Class kids extends Class human
子类kids继承了父类human的属性

  • 问题:什么是object class?
    先说结论:在java中,全体class代码都默认继承Object class

在java中 class相当于样板,新建的object需要根据对应的class样板来依葫芦画瓢。而所有自建的class都有一个共同的“爸爸”它就是Object class注意这个“Object”首字母是大写的。

  • 验证Object class的存在(在IDEA中):
    打开Hierarchy模块
    在IDEA里面打开View/Tool Window/Hierarchy可以在屏幕右侧看到Hierarchy模块,默认已经选中了当前的文件,可以看到它是在一个叫public class Object的文件结构下列着

如果还想查看其他的文件,选中一个文件比如Application,然后快捷键Ctrl+H即可打开hierarchy window里看到对应的结构信息

在这里插入图片描述

可以看到 最上面通通都有一个Object字样。
结论 在java中,全体class代码都默认继承Object class

注意只有单继承,没有多继承。一个儿子class只能有一个爸爸class,但是一个爸爸class可以有多个儿子class。

使用方法


public class kids extends human{
   //表明kids class继承了human class的全部功能模块和其变量&值
   //kids本身是空的
}




public class human {

    public static void talk() {
        System.out.println("小嘴巴巴说个不停");

    }

    public static int valuables() {
	//public 换成 private 就不能被继承了,如果调用就会报错
	//如果不写,默认为public
        int money = 1_000_000_000;
        return money;

    }

}



public class testjan05{
public static void main(String args[]) {

kids x = new kids();
//新建一个kids类型的object叫做x,样本从kids class那里来
x.talk();
//调用x object里面的talk method
//注意kids类型本身是空的,talk method能用,只可能是从human class那里继承的


System.out.println(x.valuables());



}
}


程序运行结果:

小嘴巴巴说个不停
1000000000

想要子类继承 那必须是public的,一旦设置为private,继承并且使用的子类马上会报错。 默认的四个属性修饰符为public/private/default/protected

如果想要使用内部private的变量,那么可以自定义前面介绍过的get/set method进行获得再使用。

比如对刚才的例子进行修改



public class human {

    public static void talk() {
        System.out.println("小嘴巴巴说个不停");

    }
    private int money=6_00_000_000;
	//注意这里的money已经变成private了。卖年里面之前的调用方法不合适了


    public int getMoney() {
        return money;
    }//这里创建public getMoney method,
	//成功将class内部private的money变量通过public method getoney的return引出
}


kids程序除继承语句仍为空,main主程序如下


public class testjan05{
public static void main(String args[]) {

kids x = new kids();

x.talk();


//System.out.println(x.valuables());
    System.out.println( x.getMoney());



}
}



最后运行结果

小嘴巴巴说个不停
600000000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1439202.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序(三十八)滚动容器

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.滚动触底事件 2.下拉刷新事件 源码&#xff1a; index.wxml <view class"Area"> <!-- scroll-y 垂直滚动refresher-enabled 允许刷新bindrefresherrefresh 绑定刷新作用函数bindscrollto…

自然语言处理(NLP)——使用Rasa创建聊天机器人

1 基本概念 1.1 自然语言处理的分类 IR-BOT&#xff1a;检索型问答系统 Task-bot&#xff1a;任务型对话系统 Chitchat-bot:闲聊系统 1.2 任务型对话Task-Bot:task-oriented bot 这张图展示了一个语音对话系统&#xff08;或聊天机器人&#xff09;的基本组成部分和它们之间的…

各款Excel、word在线预览工具对比分析以及onlyoffice预览Excel加载时间长的解决方案

对于onlyoffice插件预览慢的问题分析&#xff1a; 研究了一下onlyoffice&#xff0c;得出以下结论&#xff01; 对于预览慢的问题&#xff0c;原因出在文件类型上&#xff0c;文件类型为低版本xls而非新版xlsx文件&#xff0c;onlyoffice服务器会自动将该文件转换为xlsx文件再…

【大厂AI课学习笔记】1.5 AI技术领域(6)目标检测

目标检测是CV中的重要场景。 在图像中定位感兴趣的目标&#xff0c;准确判断每个目标的类别&#xff0c;并给出每个目标的边界框。 上图是目标检测的典型应用案例。 目标检测的难点是小目标的高精度检测。 目前主要的应用领域是机器人导航、自动驾驶、智能视频监督、工业检测…

Java 排序

Java 排序 1 Collection 排序 Collections类中的: sort方法可以对List对象进行排序,该方法使用自然排序&#xff0c;即根据元素的自然顺序进行排序。如果需要对自定义对象进行排序&#xff0c;需要实现Comparable接口并重写compareTo方法。Collections类还提供了一些静态方法…

提速MySQL:数据库性能加速策略全解析

提速MySQL&#xff1a;数据库性能加速策略全解析 引言理解MySQL性能指标监控和评估性能指标索引优化技巧索引优化实战案例 查询优化实战查询优化案例分析 存储引擎优化InnoDB vs MyISAM选择和优化存储引擎存储引擎优化实例 配置调整与系统优化配置调整系统优化优化实例 实战案例…

NAT——网络地址转换、NAPT

网络地址转换 NAT (Network Address Translation) 1994 年提出。 需要在专用网连接到互联网的路由器上安装 NAT 软件。 装有 NAT 软件的路由器叫做 NAT路由器&#xff0c;它至少有一个有效的外部全球 IP 地址。 所有使用本地地址的主机在和外界通信时&#xff0c;都要在 NA…

【python绘图】爱心、樱花树、饼图、折线图、雷达图

一、爱心 import turtledef curvemove():for i in range(200):turtle.speed(0)turtle.right(1) # 光标向右偏1度turtle.forward(1)# 前进1pxturtle.penup() turtle.goto(0, -70) turtle.pendown()turtle.color(red) turtle.begin_fill() turtle.left(140) turtle.forward(111…

计算机网络-无线通信技术与原理

一般我们网络工程师接触比较多的是交换机、路由器&#xff0c;很少涉及到WiFi和无线设置&#xff0c;但是呢在实际工作中一般企业也是有这些需求的&#xff0c;这就需要我们对于无线的一些基本配置也要有独立部署能力&#xff0c;今天来简单了解一下。 一、无线网络基础 1.1 无…

[设计模式Java实现附plantuml源码~行为型]请求的链式处理——职责链模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

详解各种LLM系列|LLaMA 1 模型架构、预训练、部署优化特点总结

作者 | Sunnyyyyy 整理 | NewBeeNLP https://zhuanlan.zhihu.com/p/668698204 后台留言『交流』&#xff0c;加入 NewBee讨论组 LLaMA 是Meta在2023年2月发布的一系列从 7B到 65B 参数的基础语言模型。LLaMA作为第一个向学术界开源的模型&#xff0c;在大模型爆发的时代具有标…

基于Springboot的足球社区管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的足球社区管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

二分算法--模板及原理总结

二分答案 首先我们看这个图&#xff1a; 我们需要二分的答案就是这个临界点x。 什么情况下可以使用二分呢&#xff1a; 具有单调性&#xff08;单调递增&#xff0c;单调递减&#xff09;&#xff0c;二段性&#xff08;整个区间一分为二&#xff0c;一段区间满足&#xff0c;一…

嵌入式学习之Linux入门篇笔记——7,Linux常用命令第二部分

配套视频学习链接&#xff1a;http://【【北京迅为】嵌入式学习之Linux入门篇】 https://www.bilibili.com/video/BV1M7411m7wT/?p4&share_sourcecopy_web&vd_sourcea0ef2c4953d33a9260910aaea45eaec8 目录 1.mkdir 命令 2.rmdir 3.rm 命令 4.touch 命令 5.clear…

【Git教程】(一)基本概念 ——工作流、分布式版本控制、版本库 ~

Git教程 基本概念 1️⃣ 为什么要用 Git2️⃣ 为什么要用工作流3️⃣ 分布式版本控制4️⃣ 版本库5️⃣ 简单的分支创建与合并&#x1f33e; 总结 在本章中&#xff0c;将介绍一个分布式版本控制系统的设计思路&#xff0c;以及它与集中式版本控制系统的不同之处。除此之外&am…

传输层DoS

传输层是国际标准化组织提出的开放系统互联参考模型&#xff08;OSI&#xff09;中的第四 层。该层协议为网络端点主机上的进程之间提供了可靠、有效的报文传送服务。 平时我们所谈论的拒绝服务攻击大多是基于TCP的&#xff0c;因为现实中拒绝服务的对象 往往都是提供HTTP服务的…

cmd卸载软件

如果使用的是Win 10&#xff0c;并且需要在磁盘内释放一些空间&#xff0c;可以直接在命令提示符里卸载不再使用的应用程序&#xff0c;和小编一起来看看详细的步骤吧。 步骤如下&#xff1a; 以管理员身份运行命令提示符来卸载程序。在Windows搜索框中&#xff0c;键入“ cm…

服务器运存使用率多少正常?

服务器运存使用率多少正常&#xff0c;这是一个相对主观的问题&#xff0c;因为服务器的正常运行不仅取决于运存使用率&#xff0c;还与服务器的工作负载、应用程序的特性和需求、服务器的配置和用途等多种因素有关。然而&#xff0c;一般来说&#xff0c;大多数服务器在运存使…

SpringCloud-Eureka原理分析

Eureka是Netflix开源的一款用于实现服务注册与发现的工具。在微服务架构中&#xff0c;服务的动态注册和发现是必不可少的组成部分&#xff0c;而Eureka正是为了解决这一问题而诞生的。 一、为何需要Eureka 在微服务架构中&#xff0c;服务之间的协同合作和高效通信是至关重要…

PostgreSql与Postgis安装

POstgresql安装 1.登录官网 PostgreSQL: Linux downloads (Red Hat family) 2.选择版本 3.安装 ### 源 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm ### 客户端 yum install postgresql14 ###…