java面向对象2-封装
2 封装
封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式,面向对象三大特点之一。
好处:
- 防止数据被任意篡改,提高安全性
- 隐藏了实现细节,仅暴露方法
如何实现封装?
- 使用private关键字修饰成员变量
- 对外提供公有的setter和getter方法
2.1private(私有的)
- private关键字:
是一个权限修饰符,用于修饰成员(成员变量和成员方法),被私有化的成员只在本类中可以直接访问。
- 常见用法:
将成员变量设置为私有,这样就防止在类外进行访问,对外提供相应的公有的setXxx/getXxx方法
- 好处:提高对数据访问的安全性。并且可以增加复杂的逻辑控制
2.2this关键字
作用:this代表当前正在调用方法的对象
使用场景:
1.setXxx方法中对成员变量赋值:区分成员变量和局部变量
2.构造方法互相调用:
this(...);
注意:构造方法中使用this或者super调用其它构造方法的话必须是构造方法的第一条语句(后面详讲)
3.方法中调用本类其它方法
2.3 构造方法/构造器-Constructor
特点:
构造方法是一种特殊的方法,它的方法名与类名相同
不用定义返回值类型,不用return关键字
其返回值可以理解为是新创建对象的引用,不用显式定义
作用:
给对象初始化,即:给成员变量赋值
注意:
如果没有写,系统提供一个默认构造方法
多个构造方法是以重载的形式存在的
使用new Student();实际上就是在调用空参构造方法
2.4标准类的定义和使用
定义标准的javabean
1成员变量:属性必须私有化,私有修饰
2成员方法:
- 空参构造方法,这个Java类必须具有一个无参的构造函数
- 普通成员方法:study() 可选
- 【get方法(不是必要)】/【set方法】。私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
note:
如果不希望单独获取成员变量的值,可以不定义getXxx方法
给成员变量赋值的方式有两种:set方法和构造方法
JavaBean的属性:
JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性。每个属性通常都需要具有相应的setter、 getter方法,setter方法称为属性修改器,getter方法称为属性访问器。
属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name属性的修改器名称为setName,password属性的修改器名称为setPassword。
属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name属性的访问器名称为getName,password属性的访问器名称为getPassword。
一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。
this关键字在构造方法中的使用
- 在某个构造方法中去调用本类的其它构造方法
- 必须放在构造方法的第一句
2.5对象初始化(实例化)过程
以Student s = new Student();为例
1.加载Student.class文件到方法区
2.在栈内存中定义变量s
3.在堆内存中开辟空间
4.对成员变量进行默认初始化(0/0.0/false/null)
5.对成员变量进行显式初始化(定义成员变量时赋值)
6.调用构造方法(成员变量赋值)
7.成员变量初始化完毕,将对象的地址值返回给栈中的变量s
Note:成员变量最多有四次赋值:
1.对成员变量进行默认初始化(0/0.0/false/null)
2.对成员变量进行显式初始化(定义成员变量时赋值)
3.调用构造方法(成员变量赋值)
4.成员方法赋值(set...)
Student s = new Student();
s一般出现在栈中(因为一般是成员方法中调用);
也会出现在堆中(在成员变量中时)
什么时候将变量定义为成员变量?
变量是用来描述类的,如果变量是这个类的描述信息,就定义为成员变量,否则,应该定义在方法形参或者方法体内,即:局部变量
变量定义的原则:范围越小越好,能被及时回收 练习:
.定义长方形类,其中包含求周长(perimeter)和面积(area)的方法
注意:由于没有必要单独获取长和宽,所以不用定义get方法
.定义员工类,自己分析有什么成员变量,包含一个显示所有成员变量的方法,然后测试.
.自定义计算类,提供基本的加减乘除运算,并测试.
被计算的数和类之间没有从属关系,最好不定义成成员变量,而是方法的参数
思考与练习
2.6static(静态)修饰符
2.6.1static关键字
用于修饰成员(成员变量和成员方法),称为类成员
被修饰后的成员具备以下特点:
- 随着类的加载而加载
- 优先于对象存在
- 被这个类的所有对象所共享
- 可以直接被类名调用,也可使用对象调用,推荐用类名调用,因为static修饰的成员就是类成员
使用注意
- 静态方法只能访问静态成员(变量,方法)(不可以访问非静态因为加载顺序的原因)
- 静态方法中不可以写this,super关键字
- 非静态的方法可以访问静态成员
/*
测试类
*/
public class PersonDemo{
public static void main(String[] args){
Person p1 = new Person();
p1.name = "tom";
p1.show();
p1.country = "USA";
p1.show(); Person p2 = new Person();
p2.name = "toms";
p2.show();
}
}
/*
演示static关键字
*/
public class Person{
static String country = "China";
String name;
public void show(){
System.out.println(country +","+ name);
}
}
结果:
China,tom
USA,tom
USA,toms
note:通过对象.类成员变量调用竟然改变了类里面的类成员变量 和python有区别
class A:
country='USA'
def __init__(self,name):
self.name=name def chaNation(self,nation):
self.country=nation a=A('wang')
a.chaNation('china')
print(a.country) b=A('li')
print(b.country) 结果:
china
USA
与python区别
静态变量(static)和实例变量(没static)的区别
- 所属不同
- 静态变量属于类,也称为类变量
- 实例变量属于对象,也称为对象(实例)变量
- 在内存中的位置不同
- 静态变量在方法区中
- 实例变量在堆内存
- 生命周期不同
- 静态变量随着类的加载而加载,随着类的消失而消失
- 实例变量随着对象的创建而存在,随着对象的消失而消失
- 调用方法不同
- 静态变量可以通过类名和对象名两种方式调动,推荐使用类名调用
- 实例变量只能使用对象名的方式调用
2.6.2main方法的格式及传参
public static void main(String[] args){...}
- public:修饰符,用来控制访问权限的,后面讲
- static:说明main方法是属于类的,通过类名直接调用,JVM不用创建对象就直接调用
- void:返回值为空,main方法不用返回任何值
- main:默认的程序入口,不是关键字,JVM从这里开始执行
- String[] args:形参列表,String类型的数组
- args:形参名,也就是数组名
如何使用?早期用来从键盘接收参数的
java Demo hello world java
JDK1.5之后有了Scanner,基本不使用它了
2.6.3工具类的制作
1.写一个类,包含一个方法用来遍历一维数组
2.使用static修饰,可以直接使用类名调用,方便在main中调用
3.将这个类单独放到一个文件中,形成工具类
4.可以继续定义更多的关于数组的操作,获取最值等,丰富工具类
2.6.3工具类说明书的制作
1.写一个完整的工具类,类要用public修饰
2.类名上加@author,@version标签 /** */
3.方法上加@param,@return标签
4.注意,方法上标签中不用加类型
5.使用以下命令生成文档
javadoc -d mydoc -author -version ArrayTool.java
.在线版
.离线版
.关注事项:
所在包
构造方法
形参,返回值类型
是否是static的
从哪个版本开始 练习:猜数字(在循环时讲过)
随机产生一个1-100之间的int型值
从键盘输入一个数值与之对比,给出对比结果
可以多次输入:猜中则结束,猜不中则继续
API的使用与练习
3.7代码块
1.局部代码块
在方法内部,用于限定变量的生命周期,及时释放内存
2.构造代码块
定义在成员位置,用于抽取不同构造方法中相同的部分运行在局部代码块之前
3.静态代码块
static修饰的构造代码块,用于对类进行初始化(即:static修饰的类变量)
面试题:
静态代码块(1),构造代码块(2),构造方法(3)的执行顺序和特点
面试题1:
:
面试题2
java面向对象2-封装的更多相关文章
- Java面向对象(封装性概论)
Java面向对象(封装性概论) 知识概要: (1)面向对象概念 (2)类与对象的关系 (3)封装 (4)构造函数 (5)this关键字 (6)static关键 ...
- Java面向对象的封装
封装是Java面向对象的三大特性之一,通常我们是通过包管理机制同时对类进行封装,隐藏其内部实现细节,通常开发中不允许直接操作类中的成员属性,所以属性一般设置为私有权限private,类中一般会给出一些 ...
- java面向对象(封装,继承,多态,抽象,接口的定义和实现)
1.封装 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...
- Java面向对象之封装
面向对象的三个特征:封装.继承和多态. Java开发的过程就是找合适的库对象使用,没有对象创建新对象.找对象,建立对象,使用对象并维护对象之间的关系. 类就是对现实生活中事物的描述,而对象就是这类事 ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- Java面向对象之封装 入门实例(一)
一.基础概念 (一)面向对象的三大特征: 1.封装 2.继承 3.多态 (二)封装:隐藏实现细节,对外提供公共的访问方式(接口). 封装的体现之一:将属性都 ...
- java面向对象之封装性
面向对象的特征之一:封装和隐藏: 一.问题的引入: 当创建一个类的对象以后,可以通过“对象.属性”的方式,对对象的属性进行赋值.这里,赋值操作要受属性的数据类型和存储范围的制约.除此之外,没有其他制约 ...
- Java 面向对象,封装,继承
1相关概念的理解 1.1面向过程.面向对象 面向过程与面向对象都是编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.(职员思想) 面向 ...
- Java 面向对象和封装
目录 面向对象思想的概述 类和对象的关系 什么是类 什么是对象 类和对象的关系 局部变量和成员变量的区别 this关键字 构造方法 一个标准的类 面向对象思想的概述 面向过程:当需要实现一个功能的时候 ...
- Java面向对象07——封装
封装 (补充 this关键字): package oop.demon01.demon03; /* 封装的意义: 1. 提高程序的安全性,保护代码 2. 隐藏代码 ...
随机推荐
- 《Python编程从0到1》笔记4——你分得清“索引和切片”吗?
Python为序列类型(sequence types)[1]提供了独特的索引(indexing)和切片(slicing)机制以访问序列的某个元素或某一部分. [1] 如list, tuple, ran ...
- MySql数据库优化-汇总
各位,不喜勿喷,和气生财- 数据库优化,是一种综合性的技术,不是通过某一种方式让数据库效率提高很多,而是通过各个方面的优化,来是数据库效率明显的稳步的提高. 主要包括以下: 1.库表的设计优化(三种范 ...
- 【6.24校内test】T2 不老梦
[题目背景] 于万人中万幸得以相逢,刹那间澈净明通. 成为我所向披靡的勇气和惶恐,裂山海,堕苍穹. 爱若执炬迎风,炽烈而哀恸,诸般滋味皆在其中. 韶华宛转吟诵,苍凉的光荣,急景凋年深情难共. ——银临 ...
- 04: CI(持续集成)/CD(持续交付/持续部署)
1.1 持续集成.持续交付 介绍 参考博客:https://www.cnblogs.com/cay83/p/8856231.html 1.传统交付 1. 传统软件的开发与交付的周期都很漫长,从需求 ...
- C - 卿学姐与诡异村庄(并查集+One face meng bi)
卿学姐与诡异村庄 Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- python3的一些文件操作的脚手架
用python把原来的脚本重构了一下,其中写了文件操作的一些函数,如下: import os import shutil import hashlib import stat #查找文件夹中的某个文件 ...
- golang中如何阻塞等待所有goroutines都完成
有一天,一个人问了我此问题,回头仔细翻阅了一下资料,仔细的想了一下,这个问题的解决有两种方案.方案一:也是推荐方案,也是官方推荐方案,涉及到一个写并发经常关注的模块sync模块,利用里面的sync.W ...
- 关于encodeURI() 踩的坑
情景: 列表页跳转详情页,需要把列表页的数据带到详情页直接展示,思路是在路径后面加?传参,然后再在详情页获取url的参数. 为了以防中文乱码什么的所以先试用encodeURI转码再decodeURI解 ...
- input搜索框实时检索功能实现(超简单,核心原理请看思路即可)
问题:实现input搜索框实时检索的功能,类似哔哩哔哩首页搜索功能(壮哉我大b站!).公司要求,emmmm没办法,果然懒人是要被赶着走才会进步的说,诶嘿O(∩_∩)O. 解决方法: 1.参考资料:ht ...
- vim学习(一)之简介、安装、配置
vim简介 Vim是从 vi 发展出来的一个文本编辑器,是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面. 简单的来说, vi 是老式的文字处理器,不过功能已经很齐全了,但是还是 ...