Java面向对象(1) —— 封装

目录

  • 一、封装的概念
  • 二、类的封装以及使用
  • 三、访问修饰符
  • 四、属性封装的实现
  • 五、方法封装的实现
  • 六、UML类图
  • 七、类的构造方法与可重载
  • 八、this关键字
  • 九、static关键字
  • 十、方法重载:overload
  • 十一、包:package

一、封装的概念

将字段(C结构体中的属性)和方法(C结构体中的函数)包装进类中,加上具体实现的隐藏(访问修饰符),共同被称作为封装,其结果是一个同时带有特征和行为的数据类型。

定义类,定义其属性、方法的过程称为封装类。

学会从C语言的结构体中转换概念:

struct Student
{int age;   //类似与java中的属性  特征char* name;void (*introduce)(int age,int name,int score); //函数 = 方法void (*testFunc)();
};

二、类的封装以及使用

//封装一个类
class Student //写规范来,第一个字母大写
{int age;       //特征String name; //JAVA中没有char*double score;void introduce(){   // 方法 = C语言中的函数System.out.println("my name is"+name  +  "age:"+age   +  "score"+score);}    //面向对象的特性就是方法可以访问本类的特征属性,不需要额外的去传参void testFunc(){System.out.println("testFunc");}
}//怎么使用这个类呢?
public class Demo1 {public static void main(String[] args) {Student stu1 = new Student(); //这操作叫实例化一个对象//类 = 模板,类不能直接使用,不能直接访问变量,需要先实例化,申请一个空间。//改成Student stu1 = null,好比C语言的指针使用前不malloc开辟空间/*这操作就等同于在c语言中,我们对结构体指针的定义及访问struct Student* p;p = malloc(sizeof(struct Student));*/stu1.age = 18;stu1.score = 99.5;stu1.name = "小明"; //不需要像C语言中strcpy赋值stu1.introduce();}
}

其中比较重要的概念:

面向对象的特性就是方法可以访问本类的特征属性,不需要额外传参

三、访问修饰符

访问修饰符用于信息隐藏,是OOP(Object Oriented Programming面向对象的编程)重要的功能。

隐藏信息的原因:


(1)对模块的任何实现细节所做的更改不会影响使用该模块的代码
(2)防止用户意外修改数据
(3)使模块易于维护和使用(就是电脑配件)
(4)规范方法,特征的使用空间


访问修饰符:访问权限(通过“.”来访问),可以看到private是最严格的:

位置private默认protectedpublic
同一个类
同一个包(文件)内的类
不同包内的子类
不同包且不是子类

权限怎么理解呢?

下面就以 “只有正确输入银行卡密码才能读取银行卡信息” 为例子

在这里插入图片描述

四、属性封装的实现

封装属性:修改属性的可见性来限制对属性的访问。

为每个属性创建一对赋值方法(getter)和取值(setter)方法,用于公开对这些属性的访问接口,在getter和setter方法中,根据需要加入对属性操作的限制。

举一个最简单的例子:

public class Student {private  String  name; //可以通过下面的方法间接访问隐私属性public void setName(String name){this.name = name;}public String getName(){return  name;}
}

五、方法封装的实现

方法封装的目的:隐藏方法实现细节(方法体),向外部提供公开接口(方法头),以供安全调用;简化调用,方便修改维护;可以私有化方法,以提供内部使用——帮助方法helper。

先设置自己的真实年龄为36岁,当别人当面问你多少岁时,通过“封装的”不对外公开的方法修改了自己的真实年龄,再告诉他我18岁。

但是如果直接访问简历上的年龄,通过这个方法访问到的就是真实年龄36岁

class Age//注意这个类的名字第一个大写(好习惯),不能跟下面的age一样
{private int age;void setAge(int realAge){age = realAge;}private void tellAlie(int falseAge){age = falseAge;}void askMyAge()//当别人问我的姓名  假{tellAlie(18);  //外部不知道这个方法的存在System.out.println("别人问我我就说我永远"+age);}void resumeAge()  //真{System.out.println("简历上是真实年龄:"+age);}
}
public class Demo3 {public static void main(String[] args) {Age a1 = new Age();a1.setAge(36);a1.resumeAge();//通过这个方法访问到的是真实年龄a1.askMyAge(); //不对外公开的方法修改了真实年龄}
}

六、UML类图

UML-Unified Modeling Language 统一建模语言,又称标准建模语言。

(1)类的命名尽量采用应用领域内的术语

(2)类的属性、操作中的可见性用+ # -分别表示public protected private

在这里插入图片描述

七、类的构造方法与可重载

类的构造方法的概念和作用

构造方法负责对象初始化工作,为对象的属性赋合适的初始值。

在用户操作对象之前,系统就已经完成了类的构造方法。

构造方法的语法规则

(1)构造方法名与类名一致
(2)没有返回类型
(3)方法实现主要为特征赋初值

构造方法的调用很特别:实例化对象(new)的时候,自动被调用

java系统保证每个类都有构造方法:如果没有指明,系统将自动为其分配“空参数”的构造方法。

class Student
{private int age;int momAge;String name;float score;Student(int newAge,String newName,float newScore)//方法名字与类名相同{                                                //构造方法在实例化对象new时会被调用,到时候再传递参数//如果不写,系统自动实现,无参无内容System.out.println("构造方法一被调用");age = newAge;name = newName;score = newScore;}//java中,方法是可重载的,即为函数名一样,参数列表不同即可,C语言是不允许的Student(String newName){System.out.println("构造方法二被调用");name = newName;}Student(String newName,float newScore){System.out.println("构造方法三被调用");name = newName;score = newScore;}Student(float newScore,String newName) //传入参数类型不同,调换顺序就成为新的构造方法{System.out.println("构造方法四被调用");name = newName;score = newScore;}/* 不能同时有两个int int类似的构造方法,否则数据混淆,IDEA不给你用Student(int newAge,int newMomAge){System.out.println("构造方法五被调用");age = newAge;momAge = newMomAge;}Student(int newMomAge,int newAge){System.out.println("构造方法五被调用");age = newAge;momAge = newMomAge;}*/
}
public class Demo1 {public static void main(String[] args) {      //使用哪种构造方法,根据传入的参数而定(不仅是靠个数判断)Student stu1 = new Student(20,"小明",100);Student stu2 = new Student("小明");Student stu3 = new Student("小明",100);Student stu4 = new Student(100,"小明");//Student stu5 = new Student(100,100);System.out.println(stu1.name + stu1.score);}
}

运行结果:

构造方法一被调用
构造方法二被调用
构造方法三被调用
构造方法四被调用
小明100.0

八、this关键字

(1) 调用此方法的对象的引用
(2)可以看做是一个变量,它的值是对当前对象的引用
(3)可以处理方法中的成员变量与形参同名的问题
(4)在类的构造方法中可以调用this([参数列表])来调用该类的指定构造方法

举例子看看这4个用法:

class student
{String name;int age;void thisTest(){//第一种使用方法示例:System.out.println(this.name);//第二种使用方法示例:student stuTemp = null;//临时的对象,太像结构体指针了stuTemp = this;        //把当前对象赋给stuTemp.当前对象:如果是对象stu1,那么就是stu1对象赋给它System.out.println(stuTemp.age);//必须开辟空间(有对象)}//第三种使用方法示例:最常用的解决同名问题/*student(String name,int age){name = name;age = age;} */student(String name,int age){System.out.println("构造方法1被调用了");this.name = name;   //name传给当前对象的namethis.age = age;}//第四种使用方法示例:构造方法中又调用另一个构造方法student(String name){this("小明",21); //this构造方法只能放在第一句!!!System.out.println("构造方法2被调用了");this.name = name;}
}public class Demo1 {public static void main(String[] args) {student stu1 = new student("小明");//被指定了使用这个构造方法stu1.thisTest();//thisTest是一种方法,而stu1是调用这个方法的对象//this就是对这个对象的一种引用,引用他的特征,所以//会输出stu1对象的信息}
}

九、static关键字

(1)用来修饰类的成员 —— 修饰成员变量的称为类变量(静态变量)

(2)用来修饰成员方法 —— 称之为类方法(静态方法)

在这里插入图片描述

(3)用来修饰语句块 —— 称之为静态代码块

静态代码块先于构造方法之前执行,只会执行一次,用来对静态成员做初始化。当类被加载的时候静态代码块就会被加载,优先于对象的存在

因为静态代码块的优先于对象存在,所以静态方法中不能出现this关键字:this指的是对象的引用,而static是先于对象存在的

(4)不实例化直接使用类的特征,就是依赖于对象直接对类进行访问
(5)调用的时候可以直接通过类名.成员来进行访问。

例子

class Student
{String name;int score;static int money;   //1、类变量(静态变量)Student(String name,int score){ //构造方法System.out.println("构造方法");this.name = name;this.score = score;}static {                            //3、静态代码块的格式要求System.out.println("静态代码块"); //静态代码块优先于构造方法执行money = 5;                      //并且只执行一次,因为静态变量同类一起,一开始就存在了(相对于需要创建的对象)}                                   //但构造方法每次在实例化一个对象都会执行/*static void test(){System.out.println(this.name);  //静态方法中不能出现this关键字}*/              //因为静态代码块早于对象的创建,而this就是对对象的引用//并且只能对静态成员做初始化 即moneyvoid introduce(){System.out.println("名字:"+name + "  分数:"+score);}
}public class Demo1 {public static void main(String[] args) {Student stu1 = new Student("小明",98);Student stu2 = new Student("陈立臣",100);Student.money = 10; //不通过对象,直接通过类名访问类的特征。//这个静态变量优先于对象的存在(当类被加载时,money也就被加载了)//而对象实例化之后才有System.out.println("ret = "+add(1,1));//2、不通过对象,直接访问类的方法 /*如果不用static,只能new,用对象.方法的方式来访问Demo1 d1 = new Demo1();System.out.println("ret = "+d1.add(1,1));*/}static int add(int a,int b){ //2、类方法 脱离对象,直接使用方法 优先于对象的存在return a + b;}
}

运行结果(注意执行顺序!):

静态代码块
构造方法
构造方法
ret = 2

十、方法重载:overload

同一个类中,同名不同参的方法成为重载方法(在上文类的构造方法与可重载中有大量的例子。)

多数程序设计语言(C语言)要求为每个方法(函数)提供一个独一无二的方法名,不存在方法重载的概念。而在java中,规定方法签名是解析方法的规则而不是方法名,为方法重载开创了条件。

方法重载使得在一个类中,方法名相同而参数列表不同的方法可同时存在,代表相似的行为或功能。

注意:仅有返回值不同的方法不能成为重载

System.out.print下面有很多的构造方法,也就是方法的重载

在这里插入图片描述

十一、包:package

标准java库是由一系列包组成,包括java.lang ,java.util,java.net等等。

java.lang

java语言的核心,它提供了java中的基础类。包括基本Object类、Class类、String类、基本类型的包装类、基本的数学类等等最基本的类。

java.net

和网络相关

java.util

集合类、时间处理模式、日期时间工具等各类常用工具包

打包的意义:

1、java的包是为了更好地规划代码,防止命名冲突和混乱。所以java出现了打包机制。

2、当把类组织起来放进一个包内时,也就给包中的成员赋予了相互访问的权限

package —— 声明包

java程序员都可以编写属于自己的java包,为了保证包名唯一性,要求程序员在自己定义包的名字前加上唯一前缀。

由于互联网上的域名名称不会重复,所以推荐采用公司在互联网上的域名的倒置作为包的唯一前缀,如 com.iotek.ch09(倒置,当然这也不是绝对的啦)

一个类可以使用同一个包中的所有类
一个类可以使用其他包中的所有公开类

怎样使用其他包中的公开类?

①在每个类的签名之前加上完整包名,例如:

java.util.Data today = new java.util.Date();
  • 1

②更简洁更通用的方式:使用import语句来导包(ctrl +shift +O快捷导入)

import java.util.Date
  • 1

实际地去做一个包

一个类可以使用同一个包中的所有类,不同包之间记得前面加上public

在这里插入图片描述
同一个工程中尽量避免出现两个完全一样的类名。容易混淆,虽然有解决的办法(导包)。

同一个类、同一个包、同一个工程。

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

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

相关文章

linux下源码软件包的安装

我们在使用linux做服务器的时候,因为linux自带的软件包都有些老,不是最新的,但是有时候我们为了使用最新的软件,会使用最新的软件的源码来进行安装。所以我们需要用心去做了...在我们拿到一个软件的源码时,源码一般都是…

react-native 打包apk 并解决 图片 不出现问题

react-native官网打包apk方法:https://reactnative.cn/docs/signed-apk-android/ 解决办法: 找到项目 android目录下 gradle.properties文件 打开加入如下代码: android.enableAapt2false这段代码非常重要 官网缺少 。不然打包apk图片不出现。…

龙芯派2亚克力外壳

0x0 龙芯派自带的亚克力顶板没有风扇的孔位,在长时间运行时亚克力板很烫,因此我设计了个带风扇孔位的亚克力顶板 效果如下: 风扇规格 4X4风扇 供电由龙芯派的GPIO上的5V管脚供电 使用方法 1.某宝搜索亚克力板定制 2. 将本文件发送给店家…

Java面向对象(2) —— 继承

目录前言继承的概念和实现extends关键字super关键字继承过来的属性和方法的权限研究方法重写OverrideObject根类常见方法toString()常把toString()方法重写后应用equals()重写:判断两个对象p1和p2特征是否相同IDEA的重写模板:敲equals可选择的方案之一St…

dpdk18.11 收发包流程分析

pci probe RTE_PMD_REGISTER_PCI(net_ixgbe, rte_ixgbe_pmd); 宏注册了net_ixgbe driver到pci bus rte_ixgbe_pmd 的定义如下 static struct rte_pci_driver rte_ixgbe_pmd {.id_table pci_id_ixgbe_map,.drv_flags RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC,.pr…

人工智能芯片龙头之一gti概念股_AI芯片龙头寒武纪IPO价格定了!概念股全名单收好...

寒武纪披露首次公开发行股票并在科创板上市发行公告,确定发行价格为64.39元/股,本次科创板上市发行剔除无效报价和最高报价后剩余报价拟申购总量为3,405,910万股,整体申购倍数为回拨前网下初始发行规模的1327.12倍。战略配售投资者包含中信证…

Java面向对象(3) —— 抽象类、接口、内部类、匿名内部类

目录抽象类(abstract)抽象类的使用方法抽象类的应用:模板方法模式接口接口的概念接口的特点接口的使用接口实现与抽象类继承的区别接口的多继承内部类概念成员内部类(使用较多)及应用创建成员内部类的实例在成员内部类…

Kohana和Zencart

2019独角兽企业重金招聘Python工程师标准>>> 我有一个Kohana php框架但是客户求和zencart系统结合。我有一个想法是Kohana重新zencart 有没有人用过?应该没有吧 Kohana 是一款纯 PHP5 的框架,基于 MVC 模式开发, 它的特点就是高安…

Linux stmac网卡代码分析 -- open

Open stmmac_open是在stmmac_netdev_ops结构体里的,这个ops在probe时就已经注册到了net_device结构体里,在网卡对于stmmac_open函数调用的时间我还不确定是否是在网卡link up时 下面看看stmmac_open函数,文件位置: drivers/net/…

g++ linux 编译开栈_方舟编译器编译hello world踩坑全记录

闲来无事,看到方舟编译器完整开源,于是打算拿来试着编译一个东西来,接下来把踩过的一些坑记录一下。参考文档方舟编译器的官网是OpenArkCompiler​www.openarkcompiler.cn但是这个网站上的文档其实是过时的,没有更新过的&#xff…

绘制自定义键盘

先看下微信当中的自带的数字键盘 这种实现方式比较简单,可以直接用inline-block标签,设置每行平均宽度,比如一行要放4个按钮,可以那么宽度就可以设为25%,同时要注意设置css样式为box-sizing: border-box,这样在设置边框…

配置管理小报100329:脚本中ftp命令无法自动输入密码怎么办?

为什么80%的码农都做不了架构师?>>> 知识点: 作者:王(zbwangjian.cn) 脚本中ftp命令无法自动输入密码怎么办?参考: http://www.linji.cn/post/1620/ http://www.hamo…

linux下使用网易邮箱发邮件

0x0 最近要写个脚本监视系统运行情况,有异常及时通过邮件通知我。 本次测试中使用网易的邮箱作为邮件发送服务器(邮箱账号需要开启smtp服务如下图),由于网易邮箱验证比较严格,需要进行一些额外操作才可以正常发送邮件…

ubuntu下网易云音乐适配高分辨率屏幕

0x0 环境 ubuntu20处理器 AMD 我主流工作环境是Ubuntu20,而且很依赖音乐,网易云音乐适配了Ubuntu,而最近我换了个4K屏幕 开机启动网易云音乐后发现界面文字变得很小完全没法看,如下图 分析发现网易云音乐是通过 /opt/netease/ne…

Java基础 —— 异常

目录异常的概念及分类异常的处理try-catch-finally异常抛出throw(s)自定义异常异常的概念及分类 什么是异常 异常是指在程序的运行过程中发生的一些不正常事件。比如:除0溢出、数组下标越界、所要读取的文件不存在。 异常导致的后果 项目JAVA程序的执行过程中如出现…

解决网站请求速度慢的一些方法

开门见山,网站请求反应速度慢首先考虑服务器问题。 我在开发中遇到的就是服务器实例限制cpu占用10%以内访问正常,超出则限制访问速度,也就是网站请求速度慢 具体和阿里工程师聊天截图如下: 按照对方说的,升级了相关配置…

Windows Server 2012 在个人终端上使用的推荐设置

Windows Server 2012,也就是 Windows 8 的服务器版本,相对于 Windows 8 企业版而言,增强了作为服务器的功能,弱化了作为终端系统的功能。   目前微软官方提供了 Windows 8 企业版(90 天评估期)和 Windows…

Java高级 —— 泛型

目录泛型概念泛型可设置多个类型参数泛型继承泛型接口限制泛型可用类型泛型通配声明泛型方法泛型方法限制泛型可用类型泛型概念 问题引入:如果我们需要产生多个对象,每个对象的逻辑完全一样,只是对象内的成员啊变量的类型不同。那我们如何去…

wopihost

项目介绍 基于wopi协议开发的WopiHost, 支持word, excel,ppt(仅支持预览)等文档的预览和编辑。 运行环境 需要安装Office online 2016才可以使用,基于jdk 1.8,spring boot开发。 使用案例 word文档预览 http://[owas.domain]/wv/wordviewerfr…

java 人物属性

写代码,可以浏览人物的属性:package day14; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ImageIcon; import javax.swing.JComboBox; im…