1. 作用域上部分承接course-32
2. 作用域注意事项 237
2.1 例
public class Test33
{
public static void main(String[] args)
{
T t1 = new T();
// 属性生命周期较长,伴随着对象的创建而创建,伴随着对象的销毁而销毁。
// 局部变量,生命周期较短,伴随着它的代码块的执行而创建,
// 伴随着代码块的结束而销毁。即在一次方法调用过程中
t1.say();//当执行 say 方法时,say 方法的局部变量比如 name,会创建,当 say 执行完毕后
//name 局部变量就销毁,但是属性(全局变量)仍然可以使用
//全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
//第 1 种跨类访问对象属性的方式
A a1 = new A();
a1.test();//jack
//第 2 种跨类访问对象属性的方式
a1.test2(t1);//jack 这里我把上面的t1传给了A类中的test2方法
}
}
class T
{
String name = "jack";
public void say()
{
String name = "king";
//细节 属性和局部变量可以重名,访问时遵循就近原则
System.out.println("say() name="+name);//king
}
}
class A
{
//全局变量/属性:可以被本类使用,或其他类使用(通过对象调用)
public void test()
{
T t2 =new T();//声明T类
System.out.println(t2.name);//jack
}
public void test2(T t1)
{
System.out.println(t1.name);//jack
}
}
3. 构造方法/构造器 239
3.1 看一个需求
我们来看一个需求:前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如 果现在我要求,在创建人类的对象时,就直接指定这个对象的年龄和姓名,该怎么做? 这时就可以使用构造器。
3.2 基本语法
[修饰符] 方法名(形参列表){
方法体;
}
3.2.1 说明:
1) 构造器的修饰符可以默认, 也可以是 public protected private
2) 构造器没有返回值
3) 方法名 和类名字必须一样
4) 参数列表 和 成员方法一样的规则
5) 构造器的调用, 由系统完成
3.3 基本介绍
构造方法又叫构造器(constructor),是类的一种特殊的方法,它的主要作用是完成对新对象的初始化。它有几个特点:
1) 方法名和类名相同
2) 没有返回值
3) 在创建对象时,系统会自动的调用该类的构造器完成对象的初始化。
3.4 构造器的快速入门 240
现在我们就用构造方法来完成刚才提出的问题:在创建人类的对象时,就直接指定这个对象的年龄和姓名
//现在我们就用构造方法来完成刚才提出的问题:在创建人类的对象时,就直接指定这个对象的年龄和姓名
public class Test33
{
public static void main(String[] args)
{
Person p1 = new Person("jack",80);
System.out.println("p1的信息如下");
System.out.println("p1对象的name="+p1.name);//jack
System.out.println("p1对象的age="+p1.age);//80
}
}
class Person
{
String name;
int age;
//构造器
//解读
//1. 构造器没有返回值, 也不能写 void
//2. 构造器的名称和类 Person 一样
//3. (String pName, int pAge) 是构造器形参列表,规则和成员方法一样
public Person(String pName,int pAge)
{
System.out.println("构造器被调用,完成对象的属性初始化");
name=pName;
age=pAge;
}
}
4. 构造器的注意事项
4.1 概览
4.2 一个类可以定义多个不同的构造器,即构造器的重载 241
比如:我们可以再给Person类定义一个构造器,用来创建对象的时候,只指定人名,不需要指定年龄
public class Test33
{
public static void main(String[] args)
{
Person p1 = new Person("king",40);//第1个构造器
Person p2 = new Person("tom");//第2个构造器 只指定人名,不需要指定年龄
}
}
class Person
{
String name;
int age;//默认值0
//注:构造器本身也是一个方法
//第1个构造器
public Person(String pName,int pAge)
{
name=pName;
age=pAge;
}
//第2个构造器 只指定人名,不需要指定年龄
public Person(String pName)
{
name=pName;
}
}
4.3 如果程序员没有定义构造方法 系统会自动给类生成一个默认无参构造器(也叫默认构造器)可以使用 javap 指令 反编译看看 242
4.4 一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器, 除非显式的定义一下 242
这句话是什么意思呢,意思是,我们开始没有定义构造器,但是在main中声明Dog dog1 = new Dog();代码编译是可以通过的(因为系统给我们了默认无参构造器),但是后面我们自己定义了一个构造器public Dog(String dName){ },此时的系统的默认无参构造器就被覆盖了,如果在跑代码,就会出错,因为main中声明Dog dog1 = new Dog();没有给参数,但是我们就是不想给参数,还想用无参构造器,那就要重新显式的定义一下无参构造器Dog(){ },此时在编译代码就可以跑了
//如果程序员没有定义构造方法 系统会自动给类生成一个默认无参构造器(也叫默认构造器) 242
public class Test33
{
public static void main(String[] args)
{
Dog dog1 = new Dog();//使用的是默认的无参构造器
}
}
class Dog
{
//如果程序员没有定义构造方法 系统会自动给类生成一个默认无参构造器(也叫默认构造器)
//默认构造器 Dog()
// {
//
// }
//使用 javap 指令 反编译看看
// 一旦定义了自己的构造器,默认的构造器就覆盖了,就不能再使用默认的无参构造器, 除非显式的定义一下
public Dog(String dName)
{
}
//就不能再使用默认的无参构造器, 除非显式的定义一下
Dog() //显式的定义一下,无参构造器
{
}
}