第六天 Java面向对象之方法

一、构造方法(构造器)

1. 特征

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

2. 作用

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

如:	Order o = new Order(); 
	Person p = new Person(“Peter”,15); 

如同我们规定每个“人”一出生就必须先洗澡,我们就可以在“人”的构造器中加入完成“洗澡”的程序代码,于是每个“人”一出生就会自动完成“洗澡”,程序就不必再在每个人刚出生时一个一个地告诉他们要“洗澡”了。

3. 语法格式

   class 类名 {
     修饰符  类名(形参列表) {
           构造方法体;
       }
   }
   修饰符:不能被staticfinalsynchronizedabstractnative修饰,
   构造体:不能有return语句返回值
如:
   class Person {
   	  int age ;
      public Person() {
      	 age = 10;
          System.out.println("构造方法就是我哦!");
       }
   }
当调用该构造方法时age初始化为10;


注意事项
   a.构造方法的名称与类名完全相同,并且没有返回值类型(void都不许有)。
   b.当使用new关键字创建对象时会自动调用构造方法实现成员变量的初始化工作。
 

4. 构造方法的分类

根据参数不同,构造器可以分为如下两类:

  • 隐式无参构造器(系统默认提供)
  • 显式定义一个或多个构造器(无参、有参)
注意:
   a.当一个类中没有自定义任何构造方法时,则编译器提供一个无参的空构造方法,
     叫做默认构造方法,如:Person() {}
   b.若类中出现了自定义构造方法,则编译器不再提供任何构造方法。
   c. 一个类可以创建多个重载的构造器
   d. 父类的构造器不可被子类继承

5. 构造器的重载

构造器一般用来创建对象的同时初始化对象。如
class Person{
	String name;
	int age;
	public Person(String n , int a){ name=n; age=a;}
}
构造器重载使得对象的创建更加灵活,方便创建各种不同的对象。

构造器重载举例:
 public class Person{
	public Person(String name, int age, Date d) {this(name,age);}
	public Person(String name, int age) {}
	public Person(String name, Date d) {}
	public Person(){}
 } 
构造器重载,参数列表必须不同

二、方法的重载

(1)基本概念

在Java语言中在同一个类中,允许存在一个以上的同名方法,若两个方法的名称相同但参数列表不同,则构成重载关系(Overload)。

(2)特点及表现形式

  • 方法重载的主要表现形式为:参数的类型不同、参数的个数不同、参数的顺序不同。

  • 与形参变量名以及返回值类型无关,但返回值类型最好相同。

  • 判断方法能否构成重载的核心:调用方法时能否加以区分。

(3)实际意义和例子

  • 方法重载的实际意义在于调用者只需要记住一个方法名就可以调用各种不同的版本实现各种不同的效果。
  • 使用重载方法,可以为编程带来方便。

例如,System.out.println()方法就是典型的重载方法,其内部的声明形式如下:

   
public void println(byte x)
public void println(short x)
public void println(int x)
public void println(long x)
public void println(float x)
public void println(double x)
public void println(char x)
public void println(double x)
public void println()
……

如:

public class PrintStream {
	public static void print(int i) {……}
	public static void print(float f) {……}
	public static void print(String s) {……}
	public static void main(String[] args) {
		print(3);
		print(1.2f);
		print("hello!");
	}
 }

三、可变数的形参

JavaSE 5.0 中提供了Varargs(variable number of arguments)机制,允许直接定
义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可
变的实参。

//JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量
public static void test(int a ,String[] books);
//JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量
public static void test(int a ,String…books);

注意:

  1. 声明格式:方法名(参数的类型名 …参数名)
  2. 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
  3. 可变个数形参的方法与同名的方法之间,彼此构成重载
  4. 可变参数方法的使用与方法参数部分使用数组是一致的
  5. 方法的参数部分有可变形参,需要放在形参声明的最后
  6. 在一个方法的形参位置,最多只能声明一个可变个数形参

四、递归方法

1. 概念

递归方法:一个方法体内调用它自身。
方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。
递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环

2. 实例

//计算1-100之间所有自然数的和
public int sum(int num){
	if(num == 1){
		return 1;
	}else{
		return num + sum(num - 1);
	}
 }

使用条件:
(1)使用递归必须找到规律和退出条件;
(2)使用递归必须使得问题简单化而不是复杂化;
(3)若递归影响程序的执行性能,使用递推取代之;

五、UML 类图

在这里插入图片描述

六、this关键字

1. 基本概念

在构造方法中若出现了this关键字,则表示当前正在构造的对象。
在成员方法中若出现了this关键字,则表示当前正在调用方法的对象。

原理分析:
当构造方法和成员方法中访问成员变量时默认会加上this.的形式,this.相当于汉语中"我的",当不同的对象调用同一个方法时导致this不同,那么this.访问的结果也就随之不同。

2. 使用方式

  • 当形参变量和成员变量同名时,在方法体内会遵循就近原则优先使用形参变量,为了明确使用成员变量,则需要在成员变量名的前面加上this.加以说明(重中之重)。
  • 在构造方法的第一行使用this()的方式可以调用本类中的其他构造方法(了解)。
  • 什么时候使用this关键字呢?
    当在方法内需要用到调用该方法的对象时,就用this。
    具体的:我们可以用this来区分属性和局部变量。
    比如:this.name =name;
    在这里插入图片描述

3. 注意

  • 可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其 他的构造器!
  • 明确:构造器中不能通过"this(形参列表)"的方式调用自身构造器
  • 如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了 “this(形参列表)”
  • "this(形参列表)"必须声明在类的构造器的首行!
  • 在类的一个构造器中,最多只能声明一个"this(形参列表)"

七、 import、package

1. package

package语句作为Java源文件的第一条语句,指明该文件中定义的类所在的包。(若缺省该语句,则指定为无名包)。

它的格式为:
package 顶层包名.子包名 ;

举例:pack1\pack2\PackageTest.java
package pack1.pack2; 
//指定类PackageTest属于包pack1.pack2
public class PackageTest{
	public void display(){
		System.out.println("in method display()");
	}
 } 
 1.包对应于文件系统的目录,package语句中,用 “.” 来指明包(目录)的层次
 2.包通常用小写单词标识。通常使用所在公司域名的倒置:com.baidu.com

在这里插入图片描述
作用:

  • 包帮助管理大型软件系统:将功能相近的类划分到同一个包中。比如:MVC的设计模式
  • 包可以包含类和子包,划分项目层次,便于管理
  • 解决类命名冲突的问题
  • 控制访问权限
    例:某航运软件系统包括:一组域对象、GUI和reports子系统
MVC设计模式

在这里插入图片描述
在这里插入图片描述

JDK中主要的包介绍
  1. java.lang----包含一些Java语言的核心类,如String、Math、Integer、 System和Thread,提供常用功能
  2. java.net----包含执行与网络相关的操作的类和接口。
  3. java.io ----包含能提供多种输入/输出功能的类。
  4. java.util----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
  5. java.text----包含了一些java格式化相关的类
  6. java.sql----包含了java进行JDBC数据库编程的相关类/接口
  7. java.awt----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。 B/S C/S

2. import

为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类或全部类(.*)import语句告诉编译器到哪里去寻找类。

语法格式:
import 包名. 类名; 
应用举例:
import pack1.pack2.Test; //import pack1.pack2.*;表示引入pack1.pack2包中的所有结构
public class PackTest{
	public static void main(String args[]){
		Test t = new Test(); //Test类在pack1.pack2包中定义
		t.display();
	}
 }
注意:
  1. 在源文件中使用import显式的导入指定包下的类或接口
  2. 声明在包的声明和类的声明之间。
  3. 如果需要导入多个类或接口,那么就并列显式多个import语句即可
  4. 举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。
  5. 如果导入的类或接口是java.lang包下的,或者是当前包下的,则可以省略此import语句。
  6. 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的是哪个类。
  7. 如果已经导入java.a包下的类。那么如果需要使用a包的子包下的类的话,仍然需要导入。
  8. import static组合的使用:调用指定类或接口下的静态的属性或方法

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值