方法
方法的使用
1.概述
拥有功能性代码的代码块,我们将来一个功能就应该定义一个方法
将来开发一个功能就应该对应搞一个方法,而不是将所有的功能相关代码放在一个方法中
到时候执行哪个功能就单独调用哪个方法
2.方法定义各部分解释:
1.方法的通用定义格式:
修饰符 返回值类型 方法名(参数){
方法体
return 结果
}
2.各部分解释:
a.修饰符: 固定为public static
b.返回值类型: 方法执行完毕之后最终返回的数据的数据类型
比如:return 1 -> 返回值类型为int
return 2.5 -> 返回值类型为double
return "5hysec" -> 返回值类型为String
c.方法名:给方法取的名字 -> 见名知意
d.参数:数据类型 变量名,数据类型 变量名 -> 用于接收别人传递过来的数据
e.方法体:实现这个方法的具体代码
f.return 结果 -> 方法运行之后最终的结果,将其返回 -> 返回值
3.在通用格式的基础上,分成四种方法
//无参无返回值方法定义和调用
1.格式:
public static void 方法名(){
方法体
}
2.注意:
void关键字代表的是无返回值,如果此方法没有返回值,返回值类型上写void,就不要写具体的返回值数据类型了
3.调用:
在其他方法中:方法名();

//有参数无返回值的方法定义和执行流程
1.格式:
public static void 方法名(参数){
方法体
}
2.直接调用:
方法名(具体得值)

//无参数有返回值定义以及执行流程
1.格式:
public static 返回值类型 方法名(){
方法体
return 结果
}
2.调用:
a.赋值调用: 数据类型 变量名 = 方法名() -> 推荐使用
b.打印调用: sout(方法名()) -> 不推荐使用

//有参数有返回值定义以及执行流程
1.格式:
public static 返回值类型 方法名(参数){
方法体
return 结果
}
2.调用:
a.赋值调用: 数据类型 变量名 = 方法名(具体的值)

4.形参和实参的区别
- 形参(形式参数):在定义方法的时候,形式上定义的参数,此时并没有值
- 实参(实际参数):在调用方法的时候,给形参传递的具体的值
5.参数和返回值使用的时机
- 参数:当想将一个方法中的数据传递到另外一个方法中,那么被调用方法需要定义参数,调用时传递想要传递过去的数据
- 返回值:调用方法时,想要此方法的结果,去参与其他操作,那么被调用的方法需要将自己的结果返回
6.注意:
- 方法不调用不执行
- 方法之间是平级关系,不能互相嵌套
- 方法的执行顺序只和调用顺序有关
- main方法是jvm自动调用
- void不能和[return 结果]共存,但是void能和[return]共存
- void:代表无返回值
- return 结果:代表有返回值 -> 先将结果返回,然后结束方法
- return:仅仅代表结束方法,不代表有返回值
- 方法的调用必须完全匹配(参数个数,类型,顺序等)
- 一个方法中只能有一个返回值,不要连续写多个return
方法的重载(Overload)
1.概述—方法名相同,参数列表不同的方法
2.什么叫做参数列表不同
- 参数个数不同
- 参数类型不同
- 参数顺序不同
3.和什么无关
- 和返回值无关
- 和变量名无关
4.使用场景:功能一样,实现细节不一样,就可以定义重载的方法
5.例子
1.需求:定义三个方法,分别求两个数的和,三个数的和,四个数的和
public class Demo06OverLoad {
public static void main(String[] args) {
sum(10,20);
sum(10,20,30);
}
public static void sum(int a,int b){
int sum = a+b;
System.out.println("sum = " + sum);
}
public static void sum(int a,int b,int c){
int sum = a+b+c;
System.out.println("sum = " + sum);
}
public static void sum(int a,int b,int c,int d){
int sum = a+b+c+d;
System.out.println("sum = " + sum);
}
}
面向对象
面向对象三大特征:
封装 继承 多态
- 什么是面向对象思想:java的核心编程思想
- 为什么要使用面向对象思想编程:有很多功能别人都写好了我们直接创建这个对象,直接拿过来用我们的功能就能实现 -> 懒-> 为了少写代码
- 什么时候要使用面向对象思想编程:在一个类中想使用别的类实现好的功能时,就需要使用面向对象思想编程了
- 怎么使用面向对象思想编程:
- a.new呀,点呀
- b.特殊:调用带static关键字的 -> 直接类名点
类
1.类的概述:一类事物的抽象表示形式
2.类的分类
a.实体类 -> 世间万物的分类
b.测试类 -> 带main方法的类 -> 为了测试代码是否能跑通的类
3.实体类包含两部分:
属性(这个分类有啥)-> 成员变量
a.定义格式: 数据类型 变量名
b.定义位置: 类中方法外
c.成员变量有默认值:
整数 0
小数 0.0
字符 ‘\u0000’
布尔 false
引用 null
行为(这个分类能干啥,有什么功能) -> 成员方法
将之前的方法干掉static关键字,其他的一样
public class Person {
//属性 -> 成员变量
String name;
int age;
//行为 -> 成员方法
public void eat(){
System.out.println("人要吃饭");
}
public void drink(){
System.out.println("人要喝水");
}
public void la(){
System.out.println("人要出恭");
}
public void sa(){
System.out.println("人要嘘嘘");
}
}
对象
1.概述:一类事物的具体体现
2.使用:
a.导包:import 包名.类名
如果两个类不在同一个包下,使用对方的成员就需要导包
如果两个类在同一个包下,使用对方的成员就不需要导包
b.创建对象:想要调用哪个类的成员,就new哪个类的对象
类名 对象名 = new 类名()
c.调用成员(成员方法,成员变量)
对象名.成员变量名 = 值
对象名.方法名()
public class Person {
//属性 -> 成员变量
String name;
int age;
//行为 -> 成员方法
public void eat(){
System.out.println("人要吃饭");
}
public void drink(){
System.out.println("人要喝水");
}
public void la(){
System.out.println("人要出恭");
}
public void sa(){
System.out.println("人要嘘嘘");
}
}
public class Demo02Object {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
System.out.println(person.age);
person.name = "涛哥";
person.age = 18;
System.out.println(person.name);
System.out.println(person.age);
person.eat();
person.drink();
person.la();
person.sa();
}
}
3.匿名对象的使用
1.匿名对象:
new对象的时候,没有等号左边,只有等号右边的new对象部分
有名对象:Person p = new Person()
匿名对象:new Person()
2.使用:
new Person().成员名
3.优缺点:
a.优点:好使用
b.缺点大大的:对象不能循环使用,浪费内存
4.注意:
a.如果我们想临时的调用一次方法,我们可以使用匿名对象
b.但是如果涉及到赋值,千万不要使用
public class Demo01 {
public static void main(String[] args) {
//有名对象
Person p = new Person();
p.eat();
p.drink();
System.out.println("=================");
//匿名对象
new Person().eat();
new Person().drink();
}
}

成员变量和局部变量区别
1.定义位置不同:
a.成员变量:类中方法外
b.局部变量:方法内部,或者参数位置上
2.初始化值不同:
a.成员变量:是有默认值的,不需要赋值就能直接使用
b.局部变量:没有默认值的,必须先初始化才能使用
3.作用范围不同:
a.成员变量:作用于整个类
b.局部变量:只作用于自己所在的方法内部
4.内存位置不同:
a.成员变量:在堆中,因为成员变量跟着对象走
b.局部变量:在栈中,因为局部变量跟着方法走
5.生命周期不同:
a.成员变量:随着对象的创建而创建,随着对象的消失而消失
b.局部变量:随着方法的执行而创建,随着方法的弹栈而消失
public class Person {
String name;//成员变量
public void eat(){
//局部变量
int i = 10;
System.out.println(i);
int j;
//System.out.println("j = " + j);
System.out.println(name);
}
public void drink(){
System.out.println(name);
//System.out.println(i);
}
}
封装
1.封装的介绍及使用
1).封装怎么用:
a.将代码放到一个方法中,方法体就是我们隐藏起来的细节,方法名就是对外提供的公共接口 -> 我们直接通过调用方法名,方法内部的细节就执行了,至于这个方法怎么实现的,我们无需关注,我们只关注调用方法
b.将成员私有化 -> private
private -> 代表的是私有的,被私有化的成员只能在自己当前类中使用
private可以修饰成员变量,也可以修饰方法
2).封装总结一句话:将细节隐藏起来(不让外界直接使用),对外提供一套公共的接口(供外界通过这个公共的接口间接使用隐藏起来的细节)
(1).用private修饰成员之后(相当于隐藏细节)
(2).提供getxxx/setxxx方法(相当于对外提供的公共接口)
a.setxxx:为属性赋值
b.getxxx:获取属性值
public class Person {
private String name;
private int age;
/**
* 针对私有化的name提供getxxx/setxxx方法
*/
public void setName(String xingMing) {
name = xingMing;
}
public String getName() {
return name;
}
public void setAge(int nianLing) {
if (nianLing <= 0) {
System.out.println("年龄不合法");
} else {
age = nianLing;
}
}
public int getAge() {
return age;
}
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
//person.name = "萌姐";
//person.age = 38;
//System.out.println(person.name);
//System.out.println(person.age);
person.setName("萌姐");
person.setAge(-38);
String name = person.getName();
int age = person.getAge();
System.out.println(name+"..."+age);
}
}

2.this的介绍
1.注意:当成员变量和局部变量重名的时候,遵循”就近原则”,先走局部变量
2.this关键字:
a.概述:代表的是当前对象
b.用法:this.成员的
3.this代表的是当前对象,具体代表哪个当前对象呢?
哪个对象调用的this所在的方法,this就代表哪个对象
public class Person {
String name;
public void speak(String name){
System.out.println(this+"...............");
System.out.println(this.name+"您好,我是"+name);
}
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person+"...");
person.name = "沉香";
person.speak("刘彦昌");
System.out.println("====================");
Person person2 = new Person();
System.out.println(person2+"......");
person2.name = "王思聪";
person2.speak("王健林");
}
}

public class Person {
private String name;
private int age;
//为name属性提供get/set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//为age属性提供get/set方法
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Test01 {
public static void main(String[] args) {
Person person1 = new Person();
person1.setName("萌姐");
person1.setAge(48);
System.out.println(person1.getName()+"..."+person1.getAge());
System.out.println("=================================");
Person person2 = new Person();
person2.setName("涛哥");
person2.setAge(18);
System.out.println(person2.getName()+"..."+person2.getAge());
}
}

3.构造方法
1.构造方法作用:主要是new对象的
2.特点:
a.方法名和类名一致
b.没有返回值,连void都没有
3.空参构造
1.格式:
public 类名(){
}
2.作用:
new对象使用
3.注意:
a.我们一new,就相当于调用了构造方法
b.jvm会为每个类都提供一个空参构造,不写也有
public class Person {
private String name;
private int age;
//空参构造
public Person(){
System.out.println("我是空参构造");
}
//为name属性提供get/set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//为age属性提供get/set方法
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Test01 {
public static void main(String[] args) {
Person person1 = new Person();
}
}
构造方法可以是其他的权限修饰符,比如private修饰,如果被private修饰了构造方法,我们就不能利用构造方法new对象了
4.有参构造
1.格式:
public 类名(形参){
为属性赋值
}
2.作用:
a.创建对象
b.为属性赋值
3.注意:
如果写上了有参构造,jvm将不再提供无参构造了,所以建议都写上
public class Person {
private String name;
private int age;
//空参构造
public Person(){
System.out.println("我是空参构造");
}
//有参构造
public Person(String name,int age){
this.name = name;
this.age = age;
}
//为name属性提供get/set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//为age属性提供get/set方法
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Test01 {
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("==================");
Person person2 = new Person("张无忌",25);
System.out.println(person2.getName());
System.out.println(person2.getAge());
}
}

5.标准JavaBean
JavaBean是 Java语言编写类的一种标准规范。符合JavaBean` 的类,要求:
- 类必须是具体的(非抽象 abstract)和公共的,public class 类名
- 并且具有无参数的构造方法
- 成员变量私有化,并提供用来操作成员变量的
set和get方法。
public class Person {
private String name;
private int age;
//空参构造
public Person(){
System.out.println("我是空参构造");
}
//有参构造
public Person(String name,int age){
this.name = name;
this.age = age;
}
//为name属性提供get/set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//为age属性提供get/set方法
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
编写符合JavaBean 规范的类,以学生类为例,标准代码如下:
public class Student {
private int id;
private String name;
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Test01 {
public static void main(String[] args) {
Student student = new Student();
student.setId(1);
student.setName("张三");
System.out.println(student.getId()+"..."+student.getName());
System.out.println("=======================");
Student student1 = new Student(2, "李四");
System.out.println(student1.getId()+"..."+student1.getName());
}
}
static关键字
1.static的介绍以及基本使用

1).概述: static静态关键字
2).使用:
a.修饰成员变量: static 数据类型 变量名
b.修饰方法:
修饰符 static 返回值类型 方法名(形参){
方法体
return 结果
}
3.static的特点:
a.静态成员属于类成员,静态成员会随着类的加载而加载
b.静态成员会优先于对象存在(非静态成员属于对象的成员)
c.凡是根据static所在的类创建出来的对象,都可以共享这个静态成员
4.调用:类名直接点
public class Student {
int id;
String name;
static String classRoom;
}
public class Test01 {
public static void main(String[] args) {
//类名直接调用
Student.classRoom = "教研室9";
Student s1 = new Student();
s1.id = 1;
s1.name = "张三";
s1.classRoom = "教研室90";
System.out.println(s1.id);
System.out.println(s1.name);
System.out.println(s1.classRoom);
System.out.println("================");
Student s2 = new Student();
s2.id = 2;
s2.name = "李四";
s2.classRoom = "教研室900";
System.out.println(s2.id);
System.out.println(s2.name);
System.out.println(s2.classRoom);
//System.out.println(s1.classRoom);
}
}
2.static修饰成员的访问特点
1.在静态方法中能直接访问非静态成员嘛?不能
new对象访问
2.在静态方法中能直接访问静态成员嘛?能
a.在同一个类中 -> 直接调用
b.不在同一个类中 -> 类名调用
3.在非静态方法中能直接访问静态成员嘛?能
a.在同一个类中 -> 直接调用
b.不在同一个类中 -> 类名调用
4.在非静态方法中能直接访问非静态成员嘛?能
a.在同一个类中 -> 直接调用
b.不在同一个类中 -> new对象调用

总结:
1.调用静态的:不管在不在同一个类中,能直接调用就直接调用,不能直接调用类名调用
2.调用非静态的:不管在不在同一个类中,能直接调用就直接调用,不能直接调用就new对象调用
可变参数
1.介绍和基本使用
1).格式:
数据类型…变量名
2).本质:可变参数本质上是数组
3).注意:
参数位置只能有一个可变参数,而且要在参数列表最后

public class Demo01Var {
public static void main(String[] args) {
method(1,2,3,2,3,4,53,4,5);
method02(1,2,3,4,5);
}
public static void method(int...arr){
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum+=arr[i];
}
System.out.println("sum = " + sum);
}
public static void method02(int a,int...arr){
}
}
2.可变参数
在JDK1.5之后,如果我们定义一个方法时,此时某个形参的类型可以确定,但是形参的个数不确定,那么我们可以使用可变参数。
格式:【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型… 形参名){ }
要求:
(1)一个方法最多只能有一个可变参数
(2)如果一个方法包含可变参数,那么可变参数必须是形参列表的最后一个
(3)其实这个书写“≈”
【修饰符】 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型[] 形参名){ }
只是后面这种定义,在调用时必须传递数组,而前者更灵活,既可以传递数组,又可以直接传递数组的元素,这样更灵活了。
递归
1.概述:方法内部自己调用自己
2.分类:
a.直接递归: 方法内部自己调用自己
b.间接递归:
方法之间互相调用
3.注意:
a.递归必须要有出口,否则会出现”栈内存溢出”
b.即使有出口,也不要递归太多次,否则也会出现”栈内存溢出”
public class Demo01DiGui {
public static void main(String[] args) {
method();
}
public static void method() {
method();//没有出口,就会出现栈内存溢出现象
}
}
4.递归
- 递归:指在当前方法内调用自己的这种现象。
- 递归的分类:
- 递归分为两种,直接递归和间接递归。
- 直接递归称为方法自身调用自己。
- 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
- 注意事项:
- 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出(因为会不断的压栈)。
- 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
示例:利用递归输出3到1
public class Demo02DiGui {
public static void main(String[] args) {
method(3);
}
public static void method(int n) {
if (n==1){
System.out.println(n);
return;//结束方法
}
System.out.println(n);
n--;
method(n);
}
}

方法参数
1.基本数据类型做方法参数传递
基本类型做方法参数传递,传递的是变量的值,不是变量本身
public class Test01 {
public static void main(String[] args) {
int a = 10;
int b = 20;
/*
参数为基本类型,传递的是变量代表的值
不是变量本身
*/
method(a,b);
System.out.println(a);//10
System.out.println(b);//20
}
public static void method(int a,int b){
a+=10;
b+=20;
System.out.println(a);//20
System.out.println(b);//40
}
}
2.引用数据类型做方法参数传递
引用类型做方法参数传递,传递的地址值
public class Test02 {
public static void main(String[] args) {
int[] arr = {10,20};
method(arr);
System.out.println(arr[0]);//20
System.out.println(arr[1]);//40
}
public static void method(int[] arr){
arr[0]+=10;
arr[1]+=20;
System.out.println(arr[0]);//20
System.out.println(arr[1]);//40
}
}

