面向对象(二)

来源:互联网 发布:淘宝水印制作教程 编辑:程序博客网 时间:2024/05/17 03:47

构造方法总结:

构造方法: 特殊方法,它的作用是在对象创建的时候自动执行一些初始化工作。
特征: a.方法名与类名一致
b.没有返回值类型,甚至连void也没有
c.不能被final static synchronized abstract等修饰
d.不可以像普通方法一样随意调用,只能在对象创建时调用一次
e.所有的类都必须有构造器(若类中没有构造器,编译器会自动添加一个无参构造器,若类中有构造器,编译器不会自动添加无参构造器)

构造器的使用:构造器可以重载
构造器间可以利用this()调用,实现连锁调用,但至少应该有一个没有使用this()(不能无限递归)
this()调用必须在第一行(有效行),保证对其他构造器的调用必须先执行。

包含构造器,对象在创建时,内存中的执行过程分析:
源程序:
这里写图片描述
内存执行过程分析:
这里写图片描述

匿名对象:创建一个对象,直接调用对象的方法,不将对象的内存地址保存在引用类型变量
匿名对象可以作为实参给方法传值。
若在方法中以对象为参数时,在方法中可以利用引用修改对象的信息。

面向对象中的两个关键字:package,import
package:告诉编译器当前源文件中的所有类最终生成class文件后,class文件保存的包目录结构。
package必须写在程序的第一行。
命名:字母全部小写
四部分:机构类型名称.机构名称.项目名称.模块名称
注:类中一旦使用了package语句,这个类的编译不一样,
javac -d . 源文件.java (在当前目录中生成package语句中指示的包目录结构)
类名不一样,在调用这个类的时候一定要写类的全限定名称(全称包名+类名)

import: 导类,建议一个一个类的导入,这样更清晰。
import作用告诉编译器,当前的源文件中要使用的其他包的类在什么包目录下面。
java.lang包中所有类都已经自动导入。

对于构造器,对象作为参数传递,package,import关键字有如下小例子供参考。

package com.atguigu.javase.javabean;/**    Student类,包含id,name,gender,major属性封装,    并提供两个构造器,一个是无参的另一个是4个参数的    并添加say方法    再添加一个参数的构造器,参数是id,    在构造器中使用this(...)实现构造器的连锁调用*/public class Student {    //对属性进行封装    private int id;    private String name;    private String gender;    private String major;    //无参构造器,若是自己没有定义构造器,系统会自动添加一个默认的无参构造器    public Student() {        this(1);    //利用this()实现构造器的连锁调用(调用,栈结构)                    //this()必须在有效行的第一行,保证对其他构造器的调用必须先执行                    //this()不能无限递归        System.out.println("Student()....");    }    //参数为id的有参构造器    public Student(int id) {        this(id,"未知","未知","未知");        System.out.println("Student(int)....");    }    //参数为int id, String name, String gender, String major的有参构造器    public Student(int id, String name, String gender, String major) {        this.id = id;        this.name = name;        this.gender = gender;        this.major = major;        System.out.println("Student(int,String,String,String)");    }    //为外界提供一个公共调用属性的方法    //id的set/get方法    public void setId(int id) {        this.id = id;    }    public int getId() {        return id;    }    //neme的set/get方法    public void setName(String name) {        this.name = name;    }    public String getName() {        return name;    }    //gender的set/get方法    public void setGender(String gender) {        this.gender = gender;    }    public String getGender() {        return gender;    }    //major的set/get方法    public void setMajor(String major) {        this.major = major;    }    public String getMajor() {        return major;    }    //将形参设置为引用类型的,如Phone ph    //在该类中使用其他类的对象    public void call(Phone ph) {        System.out.println(this.say() + ",在使用手机" + ph.say() + "打电话");    }    //say方法    public String say() {        return "学号:" + id + ",名字:" + name + ",性别:" + gender + ",专业:" + major;    }}
package com.atguigu.javase.javabean;/*    写一个phone类,属性os,screen    在Student类中添加一个方法,call(Phone phone)    在测试类中调用call方法*/public class Phone {    private String os;    private double screen;    public Phone() {    }    public Phone(String os, double screen) {        this.os = os;        this.screen = screen;    }    public void setOs(String os) {        this.os = os;    }    public String getOs() {        return os;    }    public void setScreen(double screen) {        this.screen = screen;    }    public double getScreen() {        return screen;    }    public String say() {        return "[操作系统:" + os + ",屏幕大小:" + screen + "]";    }}
package com.atguigu.javase.test;    //机构类型名.机构名称.项目名称.模块名称import com.atguigu.javase.javabean.Student; //导入Student类import com.atguigu.javase.javabean.Phone;       //导入Phone类/**    在测试类中分别使用两个构造器创建两个对象,    打印输出对象的详细信息    注:1.类中一旦使用了package语句,这个类的编译不一样。        javac -d . 源文件.java 在当前目录中生成package语句中        指示的包目录结构        2.类中一旦使用了package语句这个类的类名也会不一样。        在其他类中使用该类,必须使用该类的全限定名称(全称包名+类名)*/public class StudentTest {    public static void main(String[] args) {        //使用无参构造器创建对象        //com.atguigu.javase.javabean.Student s1 = new com.atguigu.javase.javabean.Student();        Student s1 = new Student();        System.out.println(s1.say());        //使用4参构造器创建对象        //com.atguigu.javase.javabean.Student s2 = new com.atguigu.javase.javabean.Student(2,"沈yl","男","计算机");        Student s2 = new Student(2,"沈yl","男","计算机");        System.out.println(s2.say());        //s2.call(new com.atguigu.javase.javabean.Phone("andriod",5.0));        s2.call(new Phone("andriod",5.0));    }}

这里写图片描述

2 0
原创粉丝点击