构造器


package chapter06.D9构造器;
//构造器:在创建人类对象时候就直接指定这个对象的年龄和姓名
public class Constructor01 {
public static void main(String[] args) {
//当我们new一个对象时,直接通过构造器指定名字和年龄
Person p1 = new Person("smith",80);
System.out.println("p1的信息如下");
System.out.println("p1对象name"+p1.name);
System.out.println("p1对象age"+p1.age);
}
}
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;
}
}
package chapter06.D9构造器;
public class ConstructorDetail {
public static void main(String[] args) {
Person1 p1 = new Person1("king",66);
Person1 p2 = new Person1("88");
System.out.println(p1.name + p1.Age);
System.out.println(p2.name);
//构造器不能用 p1.Person1()调用
Dog dog1 = new Dog();//无参构造器调用
}
}
class Person1{
String name;
int Age;
//构造器重载,本质也是方法
public Person1(String pname) {//快捷 alt+insert
name = pname;
}
public Person1(String pname, int page) {
name = pname;
Age = page;
}
}
/*
1 构造器名和类名相同
2 构造器没有返回值
3 构造器是完成对象初始化,不是创建对象
4 创建对象时候自动调用该类的构造方法
*/
class Dog{
//若没有定义构造器,系统自动给类生成默认无参构造器
//默认构造器会被有参构造器覆盖,此时若还想调用默认构造器,必须再显示定义
/* Dog() {默认构造器
}
*/
}
package chapter06.D9构造器;
public class ConstructorExercise {
public static void main(String[] args) {
Person2 p1 = new Person2();
System.out.println("p1的信息 name="+p1.name+"age="+p1.age);
Person2 p2 = new Person2("scott",50);
System.out.println("p2的信息 name="+p2.name+"age="+p2.age);
}
}
class Person2{
String name;//默认null
int age;
public Person2() {//第一个无参构造器,设置所有人age属性初始值为18
age=18;
}
public Person2(String pname, int page) {
name = pname;
age = page;
}
}
package chapter06.D9构造器;
public class TestPerson {
public static void main(String[] args) {
Person3 p1 = new Person3("marry",20);
Person3 p2 = new Person3("smith",30);
System.out.println("p1和p2的比较结果="+p1.compareTo(p2));//p1>this p2>p
}
}
class Person3{
String name;
int age;
public Person3(String name,int age){
this.name=name;
this.age=age;
}
public boolean compareTo(Person3 p){//名字和年龄完全一样
/* if (this.name.equals(p.name)&&this.age==p.age){
return true;
}else {
return false;
}*/
return this.name.equals(p.name)&&this.age==p.age;
}
}
This
package chapter06.D9构造器;
public class This01 {
public static void main(String[] args) {
Dog2 dog1 = new Dog2("大壮",3);
System.out.println("dog1的hashcode="+dog1.hashCode());//hashcode值可视为对象地址
dog1.info();
System.out.println("============================");
Dog2 dog2 = new Dog2("大黄",2);
System.out.println("dog2的hashcode="+dog2.hashCode());
dog2.info();
}
}
class Dog2{
public String name;
public int age;
public Dog2(String name, int age) {
this.name = name;//避免name=name 两个name全是构造器里的局部变量
this.age = age;//this 指本次调用的对象
System.out.println(this.hashCode());
}
public void info(){
System.out.println(this.name+"\t"+this.age+"\t"+"当前对象的hashcode是:"+this.hashCode());
}
}

package chapter06.D9构造器;
public class ThisDetail {
public static void main(String[] args) {
T t1 = new T();
t1.f2();
t1.f3();
}
}
class T{
String name="jack";
int num=100;
public void f1(){
System.out.println("f1()方法..");
}
public void f2(){
System.out.println("f2()方法..");
//调用本类的f1方法
f1();
this.f1();//可调用方法
}
public T() {
//访问有参构造器
this("jack",100);//对this的调用必须是构造器中的第一个语句
System.out.println("T()构造器执行了");
}
public T(String name,int age){
System.out.println("T(String name,int age)构造器执行了");
}
public void f3(){
String name="smith";
System.out.println("name="+name+"num="+num);//就近原则访问局部变量
System.out.println("name="+this.name+"num="+this.num);//访问属性(全局变量)
}
}