2020-11-25

Java基础之:构造方法(构造器)与this关键字

Java基础之:构造方法(构造器)与this关键字

前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值。如果现在要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做? 这时就可以使用构造方法/构造器。

基本语法

[访问修饰符] 方法名 (参数列表){ 构造方法体; }

说明:

1) 构造器的修饰符可以默认

2) 构造器没有返回值(若前面写了返回值,就变成了成员方法)

3) 方法名 和 类 名字必须一样

4) 参数列表 和 成员方法一样的规则

5) 构造器的调用有系统JVM 来调用,当 我们创建新的对象,使用 new 的时候系统JVM来调用。

 

构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。

在创建一个类的新对象时,系统会自动的调用该类的构造方法完成对新对象的初始化。

简单案例

public class ConTest { public static void main(String[] args) {    //传统写法//  Person p1 = new Person();//  p1.name = "jack";//  p1.age = 20;​  //构造器  Person p2 = new Person("tom", 30);  System.out.println(p2.name + " " + p2.age);  }}​class Person{ String name; int age;​ //构造器 public Person(String pName, int pAge) {  System.out.println("构造器被调用....");  name = pName;  age = pAge; }}

注意事项

  1. 一个类可以定义多个不同的构造方法,构造方法重载 比如:我们可以再给Person类定义一个构造方法,用该方法来创建新对象的时候,只指定人名,不需要指定年龄。

  2. 如果程序员没有定义构造方法,系统会自动给类生成一个默认无参构造方法(也叫默认构造方法),比如 Person (){}。 可以在Dos中使用,javap -p Person.class 反编译,查看编译文件后Person类中的构造器。

  3. 一旦定义了自己的构造方法,默认的构造方法就覆盖了,就不能再使用默认的无参构造方法,除非显示的定义一下,即: Person(){}; 。 建议在自己写了有参构造方法后,默认写上无参构造方法,避免出现报错。

  4. 主要作用是完成对新对象的初始化(构造方法完成), 并不是创建对象。在创建新对象时(JVM完成),系统自动的调用该类的构造方法。

 

简单案例


/** 可以在Dos中使用,javap -p Person.class 反编译,查看编译文件后Person类中的构造器。​ 在定义的Person类中添加两个构造器: 第一个无参构造器:利用构造器设置所有人的age属性初始值都为18 第二个带pName和pAge两个参数的构造器:使得每次创建Person对象的同时初始化对象的age属性值和name属性值。​*/import java.util.Scanner; public class Constructor_Class{ public static void main(String[] args){  Person p1 = new Person();  Person p2 = new Person("小范",20);​  p1.print();  p2.print(); }}​class Person{  int age; String name;​ //习惯在定义有参构造器时,写出无参的构造器 public Person(){  age = 18; }​ //有参构造器 public Person(String pName,int pAge){  name = pName;  age = pAge; }  public void print(){  System.out.println("name:"+name+" , age:" + age); }}

  

 

对象创建流程分析(重点)

案例:

class Person{ int age=90; String name; Person(String n,int a){   name=n;   age=a; }}​Person p=new Person("小倩",20);

流程分析:

1) 加载 Person 类 (Person.class), 只会加载一次

2) 在堆中 开数据空间 , 得到一个地址

3) 数据的初始化(不断改变 堆空间中 age 与 name 的值)

(1) 默认初始化 age = 0, name = null

(2) 显式初始化 age = 90 , name = null

(3) 构造器初始化 age= 20 name = "小倩"

4) 把 堆中的地址,返回给 p

5) 使用

 

this关键字

java虚拟机会给每一个对象分配一个this关键字。this关键字指向对象自己。

例:小范说 我的 年龄是 20岁 , 小黄说 我的 年龄是 18岁。

在这句话中出现了两个"我的",但它们分别指向不同的对象。这就是this关键字。

使用方法简单案例

public class ThisTest {​ public static void main(String[] args) {    Person p1 = new Person("小范", 20);  System.out.println("p1的地址(hashcode=)" + p1.hashCode());  p1.showInfo();   System.out.println("======================");  Person p2 = new Person("小黄", 18);  System.out.println("p1的地址(hashcode=)" + p2.hashCode());  p2.showInfo(); ​​  //哪个对象调用,this就代表哪个对象​//  p1.m1();//  p2.m1();​ }}​​class Person{​ public String name; // null public int age; //0​ //形参,本质就是 局部变量  public Person(String name, int age){  //通过hashCode()可以基本区分对象地址,返回一个整数  this.name = name;  this.age = age;  System.out.println(this.name + " this.hashCode=" + this.hashCode());  }​ public void m1() {  System.out.println();  System.out.println(this.name + " this.hashCode=" + this.hashCode()); }​ public void showInfo(){  System.out.println(name + "\t" + age + "\t"); }}

  

this关键字细节

public class ThisDetail {​ public static void main(String[] args) {      AA a = new AA();  a.m2();​  System.out.println(a.name); // smith​  AA a2 = new AA("king");  System.out.println(a2.name); // king​   }}​class AA {​ int age = 10; String name = "tom";​ public AA() { //构造器1  //访问构造方法(构造器)语法:this(参数列表)  this("smith"); // this 可以调用其它构造器, 需要在构造器内 }​ public AA(String name) {  //this用于区分当前类的成员和局部变量  this.name = name; }​ public void m1() {  //this关键字可以用来访问本类的属性、方法、构造器  System.out.println(this.age); }​ public void hi() {  System.out.println("hi"); } public void m2() {  System.out.println("m2()");  //访问成员方法的语法:this.方法名(参数列表);  this.hi(); // 可以访问 本类的 hi(); }}

细节说明

1) this关键字可以用来访问本类的属性、方法、构造器

2) this用于区分当前类的成员和局部变量

3) 访问成员方法的语法:this.方法名(参数列表);

4) 访问构造方法(构造器)语法:this(参数列表);

5) this不能在类定义的外部使用,只能在类定义的方法中使用

 

简单案例

/** 1) 类House , 要求写两个构造器 2) 构造器1 (address, price) 3) 构造器2 (address, price ,ares) 4) 分别使用不同的构造器,并输出 房子信息 */import java.util.Scanner; public class Constructor_House{ public static void main(String[] args){  House h1 = new House("111",100);  House h2 = new House("222",200,120);    h1.print();  h2.print(); }}​class House{ String address; int price; int ares;​ public House(){}​ public House(String address,int price){  this.address = address;  this.price = price; }​ public House(String address,int price,int ares){//  this.address = address;//  this.price = price;  this(address,price); //可以这样写,调用其他构造器帮助我们赋值  this.ares = ares; }​ public void print(){  System.out.println("房子地址:"+ this.address        + " 价格:" + this.price + " 面积:" + this.ares); }}

  

 









原文转载:http://www.shaoqun.com/a/493083.html

prime day:https://www.ikjzd.com/w/131.html

俄罗斯灰色清关:https://www.ikjzd.com/w/1409

r标:https://www.ikjzd.com/w/1070


Java基础之:构造方法(构造器)与this关键字前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值。如果现在要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做?这时就可以使用构造方法/构造器。基本语法[访问修饰符]方法名(参数列表){构造方法体;}说明:1)构造器的修饰符可以默认2)构造器没有返回值(若前面写了返回值,就变成了成员方法)3)方法名和类名
易佰:易佰
kili:kili
巴西美食特产一览 - :巴西美食特产一览 -
口述:女友有6个男朋友让我左右为难:口述:女友有6个男朋友让我左右为难
深圳看海有哪些地方?:深圳看海有哪些地方?

No comments:

Post a Comment