面向对象编程

体会可变个数的形参

//下面采用数组形参来定义方法
public static void test(int a,String[] books);
//以可变个数形参来定义方法
public static void test(int a,String... books);

值得注意:

  • 可变参数:方法参数部分指定类型的参数个数是可变多个的。
  • 声明方式:方法名(参数类型... 参数名);
  • 可变参数方法的使用与方法参数部分使用数组,是一致的。
  • 方法的参数部分有可变形参,需要放在形参声明的最后。

方法的参数传递

  • 方法必须被其所在的类或对象调用才有意义

    • 形参:方法声明时的参数
    • 实参:方法调用时实际传给形参的参数值
  • Java的实参值如何传入方法呢?

    • Java里方法的参数传递方式只有一种:值传递。
    • 值传递即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响

方法的参数传递之基本数据类型

public class Test2 {
    public static void swap(int i) {
        System.out.println("swap方法中i的初始值:" + i);
        i = 6;
        System.out.println("swap方法中改变i的值:" + i);
    }
    
    public static void main(String[] args) {
        int a = 0;
        System.out.println("调用swap方法之前参数a的值:" + a);
        swap(a);
        System.out.println("调用swap方法之后参数a的值:" + a);
    }
}

/*
调用swap方法之前参数a的值:0
swap方法中i的初始值:0
swap方法中改变i的值:6
调用swap方法之后参数a的值:0
*/
//总之,基本数据类型在参数传递的过程中,就是把实参的值复制到形参上,参数本身不受影响。

方法的参数传递之引用对象

public class DataSwap {
    public int a;
}

public class Test3 {
    public static void swap(DataSwap ds) {
        System.out.println("在swap方法中,ds.a的初始值:" + ds.a);
        ds.a = 6;
        System.out.println("在swap方法中,改变ds.a的值:" + ds.a);
    }
    
    public static void main(String[] args) {
        DataSwap ds1 = new DataSwap();
        System.out.println("调用swap方法之前,ds1.a的值是:" + ds1.a);
        swap(ds1);
        System.out.println("调用swap方法之后,ds1.a的值是:" + ds1.a);
    }
}

/*
调用swap方法之前,ds1.a的值是:0
在swap方法中,ds.a的初始值:0
在swap方法中,改变ds.a的值:6
调用swap方法之后,ds1.a的值是:6
*/
//这段代码示例中,ds和ds1实际上操作的是同一个对象,都会改变对象中a属性的值

方法的参数传递总结

  • 基本数据类型都是保存在栈内存中,引用对象在栈内存中保存的是引用对象的地址,那么方法的参数传递就是传递值(变量在栈内存中的值)
  • 如果方法的形参是基本数据类型,那么实参(实际的数据)向形参传递参数时,就是直接传递值,把实参的值赋值给形参。
  • 如果方法的形参是对象,那么实参(实际的对象)向形参传递参数时,也是把值传给形参,但这个值是实参在栈内存中的值,也就是引用对象在堆内存中的地址

软件包

  • 包帮助管理大型软件系统:将语义近似的的类组织到包中,解决类命名冲突的问题。
  • 包可以包含类和子包。
  • 在Java中包的概念和文件夹的概念类似,同样包的存在也是为了解决文件太乱不好管理和文件同名。

关键字——package

  • package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。它的格式为:package 顶层包名.子包名;
  • 包对应于文件系统的目录,package语句中,用 “.” 来指明包(目录)的层次。
  • 包名通常用小写单词,类名首字母通常大写

关键字——import

  • 为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类或全部类(.*)。import语句告诉编译器到哪里去寻找类。
  • 语法格式:import 包名.子包名.类名;
  • import语句出现在package语句之后、类定义之前,一个源文件中可以包含多个import语句。
  • 可以使用import lee.*; 语句,表明导入lee包下的所有类。而lee包下sub子包内的类则不会被导入,需要用import lee.sub.*; 导入

面向对象的特征之一:封装和隐藏

使用者对类内部定义的属性(对象的成员变量)的直接操作会导致数据的错误、混乱或安全性问题。

信息的封装和隐藏

Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以达到下述目的:

  • 隐藏一个类中不需要对外提供的实现细节;
  • 使用者只能通过事先定制好的方法来访问数据,可以方便地加入逻辑控制,限制对属性的不合理操作;
  • 便于修改,增强代码的可维护性。

四种访问权限修饰符

Java权限修饰符public、protected、private置于类的成员定义之前,用来限定对象对该类成员的访问权限。

修饰符类内部同一个包子类任何地方
privateyes
(缺省)yesyes
protectedyesyesyes
publicyesyesyesyes

对于class的权限修饰只可以用publicdefault(缺省)

  • public类可以在任意地方被访问。
  • default类只可以被同一个包内部的类访问。

类的成员之三:构造器

构造器的特征

  • 它具有与类相同的名称。
  • 它不声明返回值类型。(与声明为void不同)
  • 不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值

构造器的作用:创建对象;给对象进行初始化

  • 如:Order o = new Order(); Person p = new Person(Peter,15);
  • 如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造方法中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个告诉他们要“洗澡”了。

构造器(构造方法)

  • 语法格式:

    修饰符 类名(参数列表){
        初始化语句;
    }
  • 根据参数不同,构造器可以分为如下两类:

    • 隐式无参构造器(系统默认提供)
    • 显示定义一个或多个构造器(无参、有参)
  • 注意:

    • Java语言中,每个类都至少有一个构造器。
    • 默认构造器的修饰符与所属类的修饰符一致。
    • 一旦显式定义了构造器,则系统不再提供默认构造器
    • 一个类可以创建多个重载的构造器。
    • 父类的构造器不可以被子类继承。
    • new 对象实际上就是调用类的构造方法

构造器的重载

  • 构造器一般用来创建对象的同时初始化对象。构造器也叫构造方法,既然是方法,就可以重载。
  • 构造器重载使得对象的创建更加灵活,方便创建各种不同的对象。
  • 构造器重载,参数列表必须不同。

关键字——this

this是什么?

  • 在Java中,this关键字比较难理解,它的作用和其词义很接近。

    • 它在方法内部使用,即这个方法所属对象的引用。
    • 它在构造器内部使用,表示该构造器正在初始化的对象。
  • this表示当前对象,可以调用类的属性、方法和构造器。
  • 当在方法内需要用到调用该方法的对象时,就用this。

使用this,调用属性、方法

public class Person5 {//定义Person类
    public Person5(int age,String name) {//有参构造方法
        this.age = age;//形参与成员变量重名
        this.name = name;//形参与成员变量重名
    }
    //成员变量
    int age;
    String name;
    
    public void setName(String name) {
        this.name = name;
    }
    
    public void setName1(String name) {
        this.setName(name);//调用当前类的成员方法
    }
    
    public void showInfo() {
        System.out.println("姓名:" + this.name);
        System.out.println("年龄:" + this.age);
    }
}
  • 当形参与成员变量重名时,如果在方法内部需要使用成员变量,必须添加this来表明该变量是类成员。
  • 在任意方法内,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的阅读性
  • 使用this调用本类的构造器。this()可以作为一个类中,构造器相互调用的特殊格式

    • 使用this()必须放在构造器的首行!
    • 使用this调用本类中其他的构造器,保证至少有一个构造器是不使用this的。(实际上就是不能出现构造器自己调用自己)

JavaBean

  • JavaBean 是一种Java语言写成的可重用组件。
  • 所谓的JavaBean,是指符合如下标准的Java类:

    • 类是公有的
    • 有一个无参的公共的构造器
    • 有属性,属性一般是私有的,且有对应的get、set方法
  • 用户可以使用JavaBean 将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。用户可以认为JavaBean提供了一种随时随地的复制和粘贴的功能,而不用关心任何改变。
Last modification:January 16th, 2020 at 05:01 pm
If you think my article is useful to you, please feel free to appreciate