封装

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”的用法的更多相关文章

  1. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块

    JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...

  2. 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封装 ...

  3. 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封装 ...

  4. 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封装 ...

  5. 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封装 ...

  6. static关键字的新用法

    static关键字的新用法和总结: static这个关键字,也可以像“self”一样,代表“当前类”,用于访问一个类的“静态属性或静态方法”: 但, static,在应用中,更灵活,因此更常见! 因为 ...

  7. WPF中的常用布局 栈的实现 一个关于素数的神奇性质 C# defualt关键字默认值用法 接口通俗理解 C# Json序列化和反序列化 ASP.NET CORE系列【五】webapi整理以及RESTful风格化

    WPF中的常用布局   一 写在开头1.1 写在开头微软是一家伟大的公司.评价一门技术的好坏得看具体的需求,没有哪门技术是面面俱到地好,应该抛弃对微软和微软的技术的偏见. 1.2 本文内容本文主要内容 ...

  8. Java中static静态关键字的使用

    我们可以基于一个类创建多个对象,每个对象都拥有自己的成员,所有成员变量的值是根据对象而存在的,有些时候我们希望一个类的所有对象共享一个成员,这就用到了static静态关键字 被静态关键字修饰的成员属于 ...

  9. js之字面量、对象字面量的访问、关键字in的用法

    一:字面量含义 字面量表示如何表达这个值,一般除去表达式,给变量赋值时,等号右边都可以认为是字面量. 字面量分为字符串字面量(string literal ).数组字面量(array literal) ...

随机推荐

  1. 单模式串匹配----浅谈kmp算法

    模式串匹配,顾名思义,就是看一个串是否在另一个串中出现,出现了几次,在哪个位置出现: p.s.  模式串是前者,并且,我们称后一个 (也就是被匹配的串)为文本串: 在这篇博客的代码里,s1均为文本串, ...

  2. dos.orm

    引言: Dos.ORM(原Hxj.Data)于2009年发布.2015年正式开源,该组件已在数百个成熟项目中应用,是目前国内用户量最大.最活跃.最完善的国产ORM.初期开发过程中参考了NBear与My ...

  3. AUTOCAD参数约束功能

    概要:http://through-the-interface.typepad.com/through_the_interface/2011/08/a-simplified-net-api-for-a ...

  4. Java的家庭记账本程序(J)

    日期:2019.3.9 博客期:041 星期六 这次就来看看我使用全新的模板写的家庭记账本程序!本次附带配色样式!作为本周的学习进度条吧!明天再研究微信小程序的方法! 这一次的记账本程序加了很多功能! ...

  5. django 实战篇之视图层

    视图层(views.py) django必会三板斧 HttpResponse >>> 返回字符串 render >>> 支持模板语法,渲染页面,并返回给前端 red ...

  6. ORACLE 根据 sql_id 查询绑定变量的传入值

    查询当前查询: select b.NAME,b.POSITION,b.DATATYPE_STRING,b.VALUE_STRING,b.LAST_CAPTUREDfrom v$sql_bind_cap ...

  7. Django模型初识

    模型层(what.why.how) 模型的相关配置

  8. 理解Python协程:从yield/send到yield from再到async/await

    Python中的协程大概经历了如下三个阶段:1. 最初的生成器变形yield/send2. 引入@asyncio.coroutine和yield from3. 在最近的Python3.5版本中引入as ...

  9. sort it 树状数组+逆序对

    sum[i]是1-i所有1的和,而i-sum[a[i]]就是在a[i]后面的数,即在i之前出现,却比他大的数.1是加在a[i]上,即i实际应该放的位置.而c[i]是为sum做准备的 #include& ...

  10. JS对象的拷贝

    1:对数据进行备份的时候,如果这个数据是基本的数据类型,那么很好办,通过赋值实现复制即可. 赋值与浅拷贝的区别 var obj1 = { 'name' : 'zhangsan', 'age' : '1 ...