1.构造方法

1.1 构造方法与成员方法的区别

构造方法分为无参构造和有参构造,其中有参构造方法和无参构造方法为方法的重载关系。

构造方法在初始化一个类的对象时进行调用,它没有返回值,方法名与类名相同,而成员方法是则是由对象主动调用,它有返回值,表现为对象的操作行为。

简单来说,构造方法定义了一个对象,赋予了对象属性值,而成员方法由对象主动调用,是对象具体行为的表现。

1.2 无参构造

[修饰符] 类名(){

}

public Dog(){

}

当类中没有定义无参构造时,jvm会默认分配一个无参构造。

1.3 有参构造

[修饰符] 类名(Type arg1,Type arg2,…){

// 初始化代码

}

public Dog(String name,int health,int love,String strain){
name = name;
health = health;
love = love;
strain = strain;
}

在实例化有参构造方法的时候必须按照有参构造的参数列表的内容传值。

当在类中定义了有参构造方法后,jvm不会再默认分配无参构造,因此在定义了有参构造方法后,应再定义一个无参构造方法,以便对对象进行创建。

1.4 对象初始化的内存图

      当一个类在进行编译时,jvm会将该类的字节码文件加载到方法区,并读取类中定义的成员变量和方法,完成方法的加载并根据定义的属性计算出需要申请的内存。在使用new关键字创建一个对象时,jvm会在堆区申请内存并进行初始化,该对象的内存地址储存在栈区中,当我们调用构造方法对该对象的属性进行赋值时,会通过栈区的内存地址来对堆区的对象进行访问。

2.封装

封装:将类的某些信息私有化,不允许外部程序直接访问,而是通过该类提供的设置器和访问器来实现对私有化信息的操作和访问。

封装的步骤

[1]属性私有化

[2]提供公共的设置器和访问器

[3]在设置器和访问器中添加业务校验逻辑

public class Dog{

	// 【1】private 私有的,对外不可见
private String name; // 【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 Dog(){ } public Dog(String name){
this.setName(name);
} public void showInfo(){
System.out.print("我的名字叫"+this.name);
}
}

3. This关键字

this表示对象本身(引用),一般而言,类的外部使用对象名本身,类的内部使用This关键字。

3.1 This调用本类中的属性

public class Dog{

	String name;
int health;
int love;
String strain;
public Dog2(String name,int health,int love,String strain){
this.name = name;
this.health = health;
this.love = love;
this.strain = strain; //调用本类中的属性

}
}  

this用于访问本类属性,解决了局部变量和成员变量同名的问题。

3.2 This调用本类的方法

public class Dog{
private String name;
public void setName(String name){
if(name.equals("")){
System.out.println("姓名不能为空.");
}else{
this.name = name;
}
}
public String getName(){
return this.name;
}
public Dog(){ }
public Dog(String name){
this.setName(name); //调用本类中的方法
}
public void showInfo(){
System.out.print("我的名字叫"+this.name);
}

3.3 This调用本类的其他构造方法(调用时应放首行)

public class Dog{
private String name;
     private String heath;
public void setName(String name){
if(name.equals("")){
System.out.println("姓名不能为空.");
}else{
this.name = name;
}
}
public String getName(){
return this.name;
}
    
     public void setHeath(String heath){
if(heath<0){
System.out.println("健康值不能为0");
              this.heath=0;
}else{
this.heath=heath;
}
}
public String getHeath(){
return this.heath;
}
     public Dog(){

}
public Dog(String name){
this.setName(name);
}
     public Dog(String name){ 
       this(name,health,love); //调用本类其他构造方法
        this.setStrain(strain);      
    }

4. static 关键字

static 关键字表示静态,可以修改变量,也可以修饰方法。

4.1 静态变量

静态变量由static修饰,存放在方法区,可被类中的对象共享访问。

访问方式有两种:[1] 类名.静态变量(推荐);  [2] 对象.静态变量。

public class Car{
String brand;
String type;
float price;
static int count = 0; //定义一个静态变量
public Car(){
Car.count++;
}
public Car(String brand,String type,float price){
this.brand = brand;
this.type = type;
this.price = price;
Car.count++;
}
public void showInfo(){
System.out.println("车辆信息:");
System.out.println("品牌:"+this.brand);
System.out.println("型号:"+this.type);
System.out.println("价格:"+this.price);
System.out.println("我是第"+Car.count+"辆车"); //对静态变量进行访问
}
}

4.2 静态方法

静态方法由static 修饰,归类所有。

[修饰符] static 返回值类型 方法名(arg…){

}  

访问方式有两种:[1] 类名.方法名(推荐);  [2] 对象.方法名。

需注意的是,实例方法可以访问静态成员,而静态方法不能访问非静态成员。(在静态成员被定义时,对象还未被定义。)

图示小结:

5. 代码块

代码块由{ }进行声明,根据其位置可以分为普通代码块、静态代码块、构造代码块、同步代码块(我还没学到)。

5.1  普通代码块

普通代码块一般存在于方法或者类、方法等的定义中,普通代码块形成一个作用域。

public class Test03{
public static void main(String[] args){
int count_1 = 10;
// 普通代码块
{
int count_2 = 20;
System.out.println("count_1:"+count_1);
System.out.println("count_2:"+count_2);
}
// 在代码块的作用域外无效

System.out.println("count_2:"+count_2);
}
}

5.2 构造代码块

构造代码块位于类中。构造代码块在构造方法前执行。构造一个对象执行一次。

public class Person{
String name;
int age;
// 构造代码块
{
System.out.println("构造代码块");
}
public Person(){
System.out.println("构造方法");
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
} //每当构造一个对象时,都会执行一次构造代码块中的语句。

5.3 静态代码块

静态代码块位于类中,归类所有,用static修饰。在类加载时执行,在构建多个对象时只执行一次。

public class Person{
String name;
int age;
static{
System.out.println("静态代码块");
} //静态代码块

public Person(){
System.out.println("构造方法");
}
public Person(String name,int age){
this.name = name;
this.age = age;
}
} //静态代码块在加载类时执行,在构建多个对象时只执行一次

小结:

静态代码块一般用于初始化静态资源,构造代码块一般用于初始化实例成员。

  

  

  

  

构造方法、封装、关键字(this、static)和代码块的介绍的更多相关文章

  1. Java-静态关键字Static&静态代码块

    静态成员变量:(static修饰变量) 如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类.多个对象共享同一份数据. 静态方法:(static修饰方法) 一旦使用 ...

  2. JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

    JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程 ...

  3. static{}静态代码块与{}普通代码块之间的区别

    先看一个例子: //class A package com.my.test; class A { static { System.out.println("A1:父类静态代码区域" ...

  4. Java之static静态代码块

    Java之static静态代码块 构造代码块 使用{}包裹的代码区域,这里的代码区域特指位于class{}下面的而不是存在于其他type method(){}这类函数下面的代码区域 public cl ...

  5. java 中的静态(static)代码块

    类字面常量 final 静态域不会触发类的初始化操作 非 final static 静态域(以及构造器其实是一种隐式的静态方法) Class.forName():会自动的初始化: 使用 .class来 ...

  6. Java static 静态代码块、代码块

    简述 static{} 静态代码块,加载类之前执行 {} 代码块,每次new的时候都会被执行 示例 类: public class Student { int age; String name; bo ...

  7. block(代码块)的介绍以及使用方法和变量之间的关系

    http://blog.csdn.net/menxu_work/article/details/8762848 block(代码块)的介绍以及使用方法和变量之间的关系 block(代码块)的介绍以及使 ...

  8. java:构造方法:无参构造/有参构造 this static关键字 静态变量 静态方法 代码块 封装 静态常量。

    /*构造方法是一种特殊的方法,专门用于构造/实例化对象,形式:[修饰符] 类名(){ }构造方法根据是否有参数分为无参构造和有参构造*/public class Dog {               ...

  9. 静态(static)代码块、构造代码块、构造函数、父类子类执行顺序

    静态代码块:static修饰的代码块. 在类加载-初始化的时候进行,主要目的是给变量赋予初始值 构造代码块:直接在类中定义且没有加static关键字的代码块称为构造代码块. java会把构造代码块放到 ...

随机推荐

  1. 动态DP之全局平衡二叉树

    目录 前置知识 全局平衡二叉树 大致介绍 建图过程 修改过程 询问过程 时间复杂度的证明 板题 前置知识 在学习如何使用全局平衡二叉树之前,你首先要知道如何使用树链剖分解决动态DP问题.这里仅做一个简 ...

  2. 1.3 正则表达式和python语言-1.3.7 匹配任何单个字符

    1.3.7 匹配任何单个字符 (2018-05-08) 点号(.)不能匹配一个换行符\n 或者非字符,也就是说,一个空字符串 搜索一个真正的句点(小数点), 而我们通过使用一个反斜线对句点的功能进行转 ...

  3. java字符串转json

    针对不同jar包 一: import org.json.JSONObject; JSONObject jo = new JSONObject(new String(需要转换的字符串)); 二: imp ...

  4. PBRT笔记(14)——光线传播2:体积渲染

    传输公式 传输方程是控制光线在吸收.发射和散射辐射的介质中的行为的基本方程.它解释了第11章中描述的所有体积散射过程--吸收.发射和内.外散射.并给出了一个描述环境中辐射分布的方程.光传输方程实际上是 ...

  5. dotnetcore http服务器研究(二)性能分析

    Asp.net core kestrel 服务器性能分析 因近来发现neocli 使用asp.net core kestrel 服务器提供rpc调用,性能比较低. 和以前做过测试差异比较大,故而再次测 ...

  6. WebStorm重复代码快捷表达

    一,问题 平时使用WebStorm时需要很多引用js,重复代码比较多,每次都要写很多次同样的代码,那么如何通过几个快捷键来简单的写出重复代码呢? 问题具体描述: 每次都要写两个script的重复: & ...

  7. 通过s3cmd上传css文件到s3导致样式加载失败

    情景说明: 将css文件上传到aws s3存储桶中,通过浏览器访问页面,发现css文件渲染失败. 通过浏览器工程模式发现css为 Content-Type: text/html,正确的 Content ...

  8. vue的环境安装(一node环境)

    话不多说都知道vue是基于node环境的.肯定是要安装node环境的 1.node官网下载https://nodejs.org/en/download/对应的版本我的是win的 2.双击下载下来的安装 ...

  9. 《JavaScript高级程序设计(第3版)》阅读总结记录第二章之在HTML中使用JavaScript

    本章目录: 2.1 <script> 元素 2.1.1 标签的位置 2.1.2 延迟脚本 2.1.3 异步脚本 2.1.4 在XHTML 中的用法 2.1.5 不推荐使用的语法 2.2 嵌 ...

  10. HTML入门10

    目前,掌握了图像,视频和音频的嵌入,下面来谈iframe和embed.object嵌入网页, 嵌入简史,刚开始流行用嵌入框架然后不同部分显示i不同内容,可以解决下载速度慢时的问题: 慢慢的插件技术流行 ...