构造方法

构造器的定义、作用

构造方法的特征
它具有与类相同的名称;它不含返回值;

注意:在构造方法里不含返回值的概念是不同于“void”的,在定义构造方法时加了“void”,结果这个方法就不再被自动调了。

构造方法的作用

当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成初始化工作的代码。这就好像我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造方法中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们要“洗澡”了。

构造器(构造方法)

功能:创建类的实例时,初始化实例的一组指令。
语法格式:
  < 修饰符> <类名>([< 参数表>]) {
    [< 语句>]
  }
举例:
public class Animal {
  private int legs;
  public Animal() {legs = 4; } //构造器
  public void setLegs(int i) {

    legs = i;

  }
  public int getLegs(){return legs;}
}
创建Animal类的实例:Animal a=new Animal(); //调用构造器,将legs初始化为4
注释:构造器的名称必须与类名相同。修饰符:public、private、protected
构造器不是方法,没有返回值(连void也不能写)

默认的构造方法

Java语言中,每个类都至少有一个构造方法;
如果类的定义者没有显式的定义任何构造方法,系统将自动提供一个默认的构造方法:
默认构造方法没有参数
默认构造方法没有方法体
默认的构造方法:Animal(){}
所以:不编写构造方法就能用new Xxx()创建类的实例
Java类中,一旦类的定义者显式定义了一个或多个构造方法,系统将不再提供默认的构造方法;
构造器的主要作用:利用构造器参数初始化对象的属性

练习3
1. 在前面定义的Person类中添加构造方法,利用构造方法设置所有人的age属性初始值都为18。
2. 修改上题中类和构造方法,增加name属性,使得每次创建Person对象的同时初始化对象的age属性值和name属性值。

 /**
* 使用 class 关键字定义了一个类: Person
*/
public class Person { //定义类的属性: 类型 属性名
String name = "unknown"; //类型 变量名 = 初始值
int age = -1; //Java类中,一旦类的定义者显式定义了一个或多个构造方法,系统将不再提供默认的构造方法;
public Person(String personName, int personAge){
System.out.println("洗澡..."); name = personName;
age = personAge;
} //定义类的方法
//带返回值的: 返回值类型 方法名(){ 有可能使用 return 返回具体的值 }
int getAge(){
return age;
} //没有返回值的方法: 也开始使用 return 标示方法结束
//return 标示方法结束, return 的后面不能再有其他语句.
void shout(){
System.out.println("I am " + name);
return;
} //带参数, 但没有返回值的方法
void hello(String personName){
System.out.println("Hello: " + personName);
} //带参数, 且有返回值的方法
int add(int i, int j){
int result = i + j;
return result;
}
}
 /**
* 测试类
*
*/
public class TestPerson {
public static void main(String[] args) { //3. 匿名对象: 没有名字的对象.
new Person("A", 10).shout(); //2. 创建一个 Person 对象 p2
Person p2 = new Person("B", 18);
p2.shout();
p2.hello("Mike"); int result2 = p2.add(1, 4);
System.out.println(result2);
int age2 = p2.getAge();
System.out.println(age2); //10. 定义类时的初始值 //p1 和 p2 是 Person 的两个对象, 操作任何一个的(非静态的)成员变量, 并不会对另一个对象的属性产生影响.
p2.age = 100; System.out.println(); //1. 创建一个 Person 对象 p1
//使用 new 关键字创建一个对象.
Person p1 = new Person("C", 30); //为对象的属性赋值, 使用 . 操作符
p1.age = 30;
p1.name = "Tom"; //调动对象的方法, 使用 . 操作符
int result = p1.add(2, 5);
System.out.println(result); int age = p1.getAge();
System.out.println(age); //30. 在 31 行为 p1 的 age 赋的值 p1.hello("Jerry");
p1.shout();
}
}

分析对象创建过程内存状态的变化

this 关键字

每个成员方法内部,都有一个this引用变量,指向调用这个方法的对象,类中的成员方法与this之间的关系如图:

 public class Boy {

     private String name;

     public Boy(String n){
name = n;
} public String getName() {
return name;
} /**
* 和一个女孩进行表白, 并得到女孩的回复.
* @param girl
*/
public void marry(Girl girl){
System.out.println("嫁给我吧: " + girl.getName()); /**
* this: this 是对 "调用当前方法的那个-当前对象" 对象的引用.
* 当前对象: 当前方法所在的对象.
*
* this 的用途: 指代的是当前对象
* 1. 在一般的方法中可以通过 this 来引用当前对象的成员(方法、属性)
* 2. 通过 this() 调用重载的构造器. 需要注意的是, 通过此种方法调用重载的构造器的代码必须放在当前构造器的第一行.
*
* public Person(String n, int a, String s, String m){
* this(n, a, s);
* major = m;
* }
*
*/
girl.shout(this);
}
}
 public class Girl {

     private String name;

     public Girl(String n){
name = n;
} public String getName() {
return name;
} public void shout(Boy boy){
System.out.println("好吧, 嫁给你: " + boy.getName());
}
}
 public class TestThis {
public static void main(String[] args) { Boy boy = new Boy("Tom");
Girl girl = new Girl("Jerry"); boy.marry(girl);
}
}

函数的参数传递

基本数据类型的参数传递

 //package: package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包
package com.atguigu.app; //import:为使用定义在不同包中的Java类,需用import语句来引入所需要的类。
//import语句告诉编译器到哪里去寻找类。
import java.io.File;
import java.text.DateFormat; class PassValue{
public static void main(String [] args){ File file = null;
System.out.print(Math.PI); int x = 5;
change(x);
System.out.println(x);
} public static void change(int y){
y = 3;
}
}

引用数据类型的参数传递

 public class PassRef {
int x;
public static void main(String [] args) {
PassRef obj = new PassRef();
obj.x = 5;
change(obj);
System.out.println(obj.x);
} public static void change(PassRef obj) {
obj.x = 3;
}
}

 public class PassRef1 {

     int x;
public static void main(String [] args){
PassRef obj = new PassRef();
obj.x = 5;
change(obj);
System.out.println(obj.x);
} public static void change(PassRef obj){
obj = new PassRef();
obj.x = 3;
}
}

package语句/import语句

package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:
  package <顶层包名>[.<子包名>]* ;
举例:pack\Test.java
  package p1; //指定类Test属于包p1
  public class Test {
    public void display() {
    System.out.println("in method display()");
  }
}

包对应于文件系统的目录,package语句中,用‘ .’ 来指明包(目录)的层次;
包通常用小写单词,类名首字母通常大写
为使用定义在不同包中的Java类,需用import语句来引入所需要的类。Import语句告诉编译器到哪里去寻找类。

语法格式:
  import 包名[.子包名…]. <类名 |*>
应用举例:
  import p1.Test; //import p1.*;表示引入p1包中的所有类
  public class TestPackage{
    public static void main(String args[]){
    Test t = new Test(); //Test类在p1包中定义
    t.display();
  }  
}

JDK中主要的包介绍

java.lang----包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。
java.net----包含执行与网络相关的操作的类。
java.io----包含能提供多种输入/输出功能的类。
java.util----包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。

面向对象----构造方法、this 关键字、函数的参数传递、package语句/import语句的更多相关文章

  1. Java面向对象-构造方法,this关键字

    Java面向对象-构造方法,this关键字 构造方法 概念:构造方法是一个特殊的方法,这个特殊方法用于创建实例时执行初始化操作: 上代码: package com.java1234.chap03.se ...

  2. Java package和import语句

    Java中的package和import语句 如果你想让其他人访问你的类,你一定要把你写的类放到正确的子目录下. 在Java里,对于位于包中的类是这样管理的: Java编译器把包对应于文件系统的目录管 ...

  3. package和import语句_1

    package 和 import语句   >为便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,Java引入包(package)机制,提供类的多重类命名空间. >package语句 ...

  4. package和import语句_4

    J2SDK中主要的包介绍   java.lang—包含一些Java语言的核心类,如String.Math.Integer.System和 Thread,提供常用功能. java.awt—包含了构成抽象 ...

  5. package和import语句_2

    package import 总结   1.如果想将一个类放入包中,在这个类源文件第一句话写package 2.必须保证该类的class文件位于正确目录下     1)该类的源码可能会产生影响     ...

  6. Package 和 import 语句

  7. package和import语句_5

    J2SDK中主要的包介绍   java.lang—包含一些Java语言的核心类,如String.Math.Integer.System和 Thread,提供常用功能. java.awt—包含了构成抽象 ...

  8. Java——package和import关键字

    1.8 package和import关键字 1.8.1 package 包其实就是目录,特别是项目比较大,java 文件特别多的情况下,我们应该分目录管理,在java 中称为分包管理,包名称通常采用小 ...

  9. 乐字节Java|GC垃圾回收机制、package和import

    本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...

随机推荐

  1. ubuntu 12.04下gedit查看txt中文乱码解决办法

    http://blog.sina.com.cn/s/blog_6273990801013dwv.html 由于我不能要求别人保存txt文件时必须用utf-8,那我只能自己找解决办法: 打开终端输入: ...

  2. 腾讯云Ubuntu挂载硬盘空间

    第一.检查硬盘设备是否有数据盘 42G是系统盘那么就剩下了200G的剩余空间,那么下面我就把这200G挂载. 查询命令:  sudo fdisk -l 我们可以看到有200GB的数据盘没有挂载,看好前 ...

  3. 高速掌握Lua 5.3 —— 扩展你的程序 (1)

    Q:怎样在C中将Lua作为配置文件语言使用? A: "config.lua"文件里: -- window size width = 200 height = 300 "m ...

  4. 3dMax常见问题

    误关掉了命令面板顶部菜单栏[自定义]->[显示UI]->勾选上命令面板 调整右侧命令面板的位置鼠标放在命令面单顶部,当显示两个长方形时,可以鼠标左键拖动.       命令面板拖动后可以停 ...

  5. C语言 · 实现strcmp函数 · 字符串比较

    蓝桥杯练习场上碰到两个此类题了: 算法提高 11-1实现strcmp函数   时间限制:1.0s   内存限制:256.0MB      问题描述 自己实现一个比较字符串大小的函数,也即实现strcm ...

  6. [usb/uart]内核添加USB转串口驱动支持

    转自:http://blog.csdn.net/gatieme/article/details/49491325 目录 1. 问题 2. 驱动源码 3. 内核配置 4. 编译内核和模块驱动 5. 加载 ...

  7. 深入分析java中文乱码问题

    http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/

  8. Android——ImageView的scaleType属性与adjustViewBounds属性 (转)一

    ImageView的scaleType的属性有好几种,分别是matrix(默认).center.centerCrop.centerInside.fitCenter.fitEnd.fitStart.fi ...

  9. log4j日志pattern配置

    c category的名称,可使用{n}限制输出的精度.例如:logger名为"a.b.c",%c{2}将输出"b.c". C 产生log事件的java完全限定 ...

  10. Golang 类型转换整理

    1.整形到字符串: var i int = 1 var s string s = strconv.Itoa(i) 或者 s = FormatInt(int64(i), 10) 2.字符串到整形 var ...