封装和static 以及关键字“this”的用法
1 封装
1.1 构造方法
构造方法是一种特殊的方法,专门用于构造/实例化对象,形式
[修饰符] 类名(){};
1.1.1 无参构造
无参构造方法就是构造方法没有任何参数。构造方法在创建对象(new Dog())调用,无参构造方法中一般用于给属性赋值默认值。
如果开发中没有定义无参构造方法,jvm默认给类分配一个无参构造,
1.1.1 有参构造
当构造/实例化一个对象时,可以向构造方法中传递参数,这样的构造方法称为有参构造。形如:
[修饰符] 类名(Type arg1,Type arg2,…){
// 初始化代码
}
1.1.1.1 局部变量和成员变量优先级
如果在一个作用域中,局部变量和成员变量同名,局部变量的优先级更高。
有参构造和无参构造是方法重载关系。
1.1.1.1 有参构造常见问题
如果一个类提供了有参构造方法,jvm不在给类默认分配无参构造。
总结:
在开发过程中,如果开发者提供了有参构造方法,一定要习惯性的提供无参构造。
1.1 This关键字(上)
1.1.1 对象初始化内存图

this 是一个关键字,表示对象本身,本质上this中存有一个引用,引用对象本身。
this用于访问本对象属性,同时解决局部变量和成员变量同名的问题。
通过打印this中的引用,可以看出对象dog和this指向同一内存。
一般而言,dog用于类的外部,this用于类的内部。因为类的内部根本不知道dog变量名的存在。
1.1.1 方法的调用内存图

1.1 static
需求:统计汽车工厂生成了多少量车?
ð 统计工厂生成了多少量汽车的功能应该放到类功能上,不应该属于某个对象。
ð 声明一个变量用于统计个数,这个变量应该被类的实例共享。
ð 被类的实例共享的区域在方法区(Car.class)
ð 用static关键字声明这样的变量
static 关键字表示静态,可以修改变量,也可以修饰方法。
1.1.1 静态变量
static 修饰的变量称为静态变量/静态属性,形式
static 类型 变量名称 [= 初始值]
被static修饰的变量称为静态变量,归类所有,分配在方法区(共享区)中的静态区,可以被类的实例共享访问。

静态变量归类所有,也叫类变量,访问方式
[1] 类名.静态变量(推荐)
[2] 对象.静态变量
类中包含静态成员(静态变量和静态方法)和实例成员(实例变量和实例方法)
1.1.1 静态方法
static 修饰的方法称为静态方法,形式
[修饰符] static 返回值类型 方法名(arg…){
}
静态方法归类所有,调用形式
[1] 类名.方法名() (推荐)
[2] 对象.方法名()
总结
[1]实例方法可以访问静态成员。
[2]静态方法不能访问非静态成员。
1.1.1 类加载机制
Car car = new Car(…);
当实例化一个对象时,jvm首先把Car.class加载到方法区
[1]读取Car.class 根据声明的成员变量计算申请内存需要的字节数
[2]读取Car.class 中的静态成员,给静态变量分配空间并初始化。
new Car 申请内存得到一个car对象,此时才有对象的空间。showInfo才可以通过car对象调用。
小结

1.1 代码块(B)
代码块通过{}声明,根据其位置可以分为普通代码块、静态代码块、构造代码块、同步代码块(多线程讲解)
1.1.1 普通代码块
普通代码块一般存在于方法或者类、方法等的定义中,普通代码块形成一个作用域。
1.1.1 构造代码块
构造代码块位于类中。构造代码块在构造方法前执行。构造一个对象执行一次。
1.1.1 静态代码块
静态代码块位于类中,归类所有,用static修饰。在类加载时执行,在构建多个对象时只执行一次。
总结
静态代码块一般用于初始化静态资源,构造代码块一般用于初始化实例成员。
1.1 封装
封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
封装的步骤
[1]属性私有化
[2]提供公共的设置器和访问器
[3]在设置器和访问器中添加业务校验逻辑
例如:
public class Dog{
// 【1】private 私有的,对外不可见
private String name;
private int health;
private int love;
private String strain;
// 【2】提供公共的设置器(setter)和访问器(getter)
public void setName(String name){
// 【3】逻辑校验
if(name.equals("")){
System.out.println("姓名不能为空.");
}else{
this.name = name;
}
}
public String getName(){
return this.name;
}
public void setHealth(int health){
if(health < 0){
System.out.println("健康值不合法.");
this.health = 0;
}else{
this.health = health;
}
}
public int getHealth(){
return this.health;
}
public void setLove(int love){
if(love < 0){
System.out.println("亲密度不合法.");
this.love = 0;
}else{
this.love = love;
}
}
public int getLove(){
return this.love;
}
public void setStrain(String strain){
if(strain.equals("")){
System.out.println("品种不能为空.");
}else{
this.strain = strain;
}
}
public String getStrain(){
return this.strain;
}
public Dog(){
}
public Dog(String name,int health,int love,String strain){
this.setName(name);
this.setHealth(health);
this.setLove(love);
this.setStrain(strain);
}
public void showInfo(){
System.out.print("我的名字叫"+this.name);
System.out.print(",健康值"+this.health);
System.out.print(",亲密度"+this.love);
System.out.println(",我是一只"+this.strain);
}
}
1.1 his关键字(下)
this表示对象本身。
[1] this调用属性
[2] this调用方法
public Dog(String name,int health,int love,String strain){
this.setName(name);
this.setHealth(health);
this.setLove(love);
this.setStrain(strain);
// showInfo();
this.showInfo();
}
[3] this调用本类的构造方法,形式
this(arg1,arg2,…)
public Dog(){
}
public Dog(String name,int health,int love){
this.setName(name);
this.setHealth(health);
this.setLove(love);
}
public Dog(String name,int health,int love,String strain){
//this.setName(name);
//this.setHealth(health);
/this.setLove(love);
// this调用本类的其他构造方法
// System.out.println("test");
this(name,health,love);
this.setStrain(strain);
// showInfo();
//this.showInfo();
}

注意:this调用其他构造方法必须写到构造方法的第一句。
1.1 静态常量
在程序运行过程中,如果一个量的值不会发生改变,可以把该量声明为静态常量,用static final修饰。
public class Penguin{
private String name;
private int health;
private int love;
private String gender;
static final String SEX_MALE = "雄";
static final String SEX_FEMALE = "雌";
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setHealth(int health){
if(health>100 && health<1){
this.health = 60;
System.out.println("健康值必须在1-100之间,默认为60");
}else{
this.health = health;
}
}
public int getHealth(){
return this.health;
}
public void setLove(String love){
this.love = love;
}
public int getLove(){
return this.love;
}
public void setGender(String gender){
this.gender = gender;
}
public String getGender(){
return this.gender;
}
public Penguin(){
}
public Penguin(String name,String gender){
this.setName(name);
this.setGender(gender);
}
public Penguin(String name,int health,int love,String gender){
this(name,gender);
this.setHealth(health);
this.setLove(love);
}
public void showInfo(){
System.out.print("我的名字叫"+name);
System.out.print(",健康值"+health);
System.out.print(",亲密度"+love);
System.out.println(",性别"+gender);
}
public class Test02{
public static void main(String[] args){
Penguin penguin = new Penguin("大脚",100,0,Penguin.SEX_MALE);
}
}
封装和static 以及关键字“this”的用法的更多相关文章
- JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块
JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...
- 094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 04 static关键字(续)
094 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)
093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 02 static关键字(中)
092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)
091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...
- static关键字的新用法
static关键字的新用法和总结: static这个关键字,也可以像“self”一样,代表“当前类”,用于访问一个类的“静态属性或静态方法”: 但, static,在应用中,更灵活,因此更常见! 因为 ...
- WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化
WPF中的常用布局 一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...
- Java中static静态关键字的使用
我们可以基于一个类创建多个对象,每个对象都拥有自己的成员,所有成员变量的值是根据对象而存在的,有些时候我们希望一个类的所有对象共享一个成员,这就用到了static静态关键字 被静态关键字修饰的成员属于 ...
- js之字面量、对象字面量的访问、关键字in的用法
一:字面量含义 字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量. 字面量分为字符串字面量(string literal ).数组字面量(array literal) ...
随机推荐
- 简单使用Markdown
Markdown是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式. 相比WYSIWYG编辑器 优点: 1.因为是纯文本,所以只要支持Markdown的地方都能获得一样 ...
- Python不能用于大型项目?关于Python的10大误解
 语言多元化是PayPal编程文化中一个重要的组成部分.在C++和Java长期流行的同时,更多的团队选择了Jva和Scala.同时,Braintree的收购也引入了一个久经世故的Ruby社区.Pyt ...
- web开发简史与技术选型
视频地址:http://v.youku.com/v_show/id_XMTQxNzM1MzAwOA==.html?firsttime=0&from=y1.4-2
- CVE_2012_1876堆溢出分析
首先用windbg附加进程ie页面内容进程,!gflag +hpa添加堆尾检查,.childdbg 1允许子进程调试,然后加载POC. POC: <html> <body> & ...
- 使用putty连接Ubuntu虚拟机,使用ssh方式访问
1 前言 Ubuntu14.04版本是可以直接连接的,没想到新装的Ubuntu18.04竟然没有默认安装ssh. 则安装一下open-ssh-server就可以的. 2 步骤 2.1 更新一下源 命令 ...
- php 两变量值互换 方法
//方法一:$a ="abc";$b="def"; $a = $a^$b;$b = $b^$a;$a = $a^$b; //方法二:list($a, $b)= ...
- iOS之UIApplicatio、AppDelegate
UIApplication,代表的是整个应用做的事,因此每个程序只能有一个,系统使用的是单例模式,就是[UIApplication sharedApplication]来得到一个实例. 这个单例实例是 ...
- 自定义InputFormat和OutputFormat案例
一.自定义InputFormat InputFormat是输入流,在前面的例子中使用的是文件输入输出流FileInputFormat和FileOutputFormat,而FileInputFormat ...
- Java开发人员必须掌握的Linux命令-学以致用(5)
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
- css-tips
div的height:100%有作用 其父元素设置height:100% 包括html,body