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

面向对象学习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取名叫做xx.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;elsethis.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 就不能被继承了,如果调用就会报错//如果不写,默认为publicint 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.hqwc.cn/news/458962.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1Panel面板如何安装并结合内网穿透实现远程访问本地管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

springboot项目热部署实现(Spring Boot DevTools方式)

文章目录 Spring Boot DevTools简介Spring Boot DevTools原理spring Boot Devtools优缺点Spring Boot DevTools集成步骤第一步&#xff1a;添加maven依赖第二步&#xff1a;IDEA热部署配置 Spring Boot DevTools简介 Spring Boot DevTools是Spring Boot提供的一个开发工具&…

机器人运动学林沛群——变换矩阵

对于仅有移动&#xff0c;由上图可知&#xff1a; A P B P A P B o r g ^AP^BP^AP_{B org} APBPAPBorg​ 对于仅有转动&#xff0c;可得&#xff1a; A P B A R B P ^AP^A_BR^BP APBA​RBP 将转动与移动混合后&#xff0c;可得&#xff1a; 一个例子 在向量中&#xff…

【JS】基于React的Next.js环境配置与示例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍基于React的Next.js环境配置与示例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

Cuda编程注意小事项

1、函数执行空间标识符 用__global__修饰的函数称为核函数&#xff0c;般由主机调用,在设备中执行。如果使用动态并行&#xff0c;则也可以在核函数中调用自己或其他核函数。用__device__修饰的函数称为设备函数&#xff0c;只能被核函数或其他设备函数调用&#xff0c;在设备…

深兰科技陈海波出席CTDC2024第五届首席技术官领袖峰会:“民主化AI”的到来势如破竹

1月26日&#xff0c;CTDC 2024 第五届首席技术官领袖峰会暨出海创新峰会在上海举行。深兰科技创始人、董事长陈海波受邀出席了本届会议&#xff0c;并作为首个演讲嘉宾做了题为“前AGI时代的生产力革命范式”的行业分享。 作为国内顶级前瞻性技术峰会&#xff0c;CTDC首席技术官…

基于SpringBoot的美妆管理系统

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

Bagging的随机森林;Boosting的AdaBoost和GBDT

集成学习应用实践 import numpy as np import os %matplotlib inline import matplotlib import matplotlib.pyplot as plt plt.rcParams[axes.labelsize] 14 plt.rcParams[xtick.labelsize] 12 plt.rcParams[ytick.labelsize] 12 import warnings warnings.filterwarnin…

《Redis核心技术与实战》学习笔记1——基本架构:一个键值数据库包含什么?

基本架构&#xff1a;一个键值数据库包含什么&#xff1f; 文章目录 基本架构&#xff1a;一个键值数据库包含什么&#xff1f;可以存哪些数据&#xff1f;可以对数据做什么操作&#xff1f;采用什么访问模式&#xff1f;如何定位键值对的位置&#xff1f;不同操作的具体逻辑是…

Page 251~254 Win32 GUI项目,第二次分析

11行&#xff0c;本程序要创建的窗口的窗口过程(回调函数)&#xff0c;就是窗口用于处理消息的过程&#xff0c;返回值的类型是一个宏定义&#xff0c;即LRESULT&#xff0c;当操作系统分派消息给本窗口时&#xff0c;回调此函数&#xff0c;处理消息。 14行&#xff0c;使用全…

【MySQL】MySQL复合查询--多表查询/自连接/子查询

文章目录 1.基本查询回顾2.多表查询3.自连接4.子查询4.1单行子查询4.2多行子查询4.3多列子查询4.4在from子句中使用子查询4.5合并查询4.5.1 union4.5.2 union all 1.基本查询回顾 表的内容如下&#xff1a; mysql> select * from emp; ----------------------------------…

opensatck中windows虚拟机CPU核数显示异常问题处理

文章目录 一、问题描述二、元数据信息三、以32核的实例模版为例3.1 单槽位32核3.2 双槽位32核 总结 一、问题描述 openstack创建windows虚拟机的时候&#xff0c;使用普通的实例模版会出现CPU数量和实例模版不一致的问题。需要定制元数据才可以正常显示。 帖子&#xff1a;htt…