面向对象的特征
一、封装
代码示例:
package com.oop;
//javaBean(定义类的规范方法)
public class Test1 {
private int age=10;
private String name="小猫";
//访问器
public int getAge() {
return age;
}
//修改器
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
1.1、方法
(1)要有访问修饰符 public private protected 不写
(2)普通方法要有返回值,如果没有返回值,需要在定义函数使用void
(3)需要方法名,在同一个类中方法名的签名不能重复(方法签名:方法名+参数列表)
(4)需要有参数列表,但是参数列表可以为空
(5)可以使用一些关键字修饰方法:static final 等,不同关键字修饰的方法意义不一样
1.2、构造方法(又叫构造器)
- 构造方法要与类名相同
- 构造方法不需要返回值,也不需要加void
- 类中默认存在无参的构造方法
- 一个类中可以有多个构造方法,构造方法也可以重载
- 显示的定义了构造方法,就会覆盖掉默认无参的构造方法,如果想要同时使用无参构造方法,需要显示的定义出来
- 构造方法(构造器)是用于初始化对象,是对象在创建时被调用
- 如果方法有放回值,即使方法名跟类名相同,该方法也不是构造方法
-
作用:是用于初始化对象,是对象创建时被调用的
-
方法签名:方法名+参数列表 (重要)
-
注意:这种情况就是两种方法 对
1.2.1、方法签名不同
- 参数数量不同
- 参数类型不同
- 参数和类型不同
- 如果都是一个类型和参数列表的顺序无关
- 当参数类型和数量相同时,和参数列表的顺序有关,如上图。
1.2.2、构造方法的特点
优点:优化方法名,使用户在使用方法时不需要过度的注意参数的类型
package com.oop;
//javaBean(定义类的规范方法)
public class Test1 {
private int age=10;
private String name="小猫";
public void sleep(int a,String b){
System.out.println("无参构造方法");
}
public void sleep(String a,int b){
System.out.println("有参构造:"+name);
}
public int add(int a,int b){
return a+b;
}
public double add(double a,double b){
return a+b;
}
public static void main(String[] args) {
Test1 t1=new Test1();
//可以传输多种类型的数据,会自动的找到对应的方法
System.out.println(t1.add(3,4));
System.out.println( t1.add(3.4,5.8));
}
}
1.3、方法参数(形参和实参)
1.3.1、形参和实参
形参:方法调用时产生,方法调用结束时及时销毁(临时变量)
实参:方法调用前就已经存在,方法调用完成之后同时存在(全局变量)
1.3.2、参数传递方式(值传递和引用传递)
java只有值传递:但是要注意传递对象时,对象里面的值的地址为真实地址
(1)值传递:在方法调用时,实参通过把它的内容副本传入到方法内部,此时形参接受的内容是实参的副本,因此在方法内实参的任何操作仅仅是对实参的副本操作,不影响原始值的内容。
(2)引用传递:“引用”也就是传递的是指向真实内容的地址值(其实也就是栈中的地址)------>相当于把地址复制了一份传递给了调用的方法。
此时形参和实参指向的是同一块内存,值将会发生变化
**注意:**引用传递中对于传递的数据为对象时:
此时:值传递时把对象p复制了一个副本,而对象里边的name的堆中的地址就是真实的地址,所以调用方法时,改变p对象的name值时,name的值会发生变化,最终在main方法中访问对象p中的name最终发生了变化。
当方法中的person=null时,person的地址连接断开,但是main方法中的p对象并没有断,所以main方法中的p对象还是有值,可以访问到。
public static void change(Student s1,Student s2){
Student temp=new Student();
temp=s1;
s1=s2;
s2=temp;
}
public static void main(String[] args) {
Student s1=new Student("张三",18);
Student s2=new Student("李四",20);
change(s1,s2);
System.out.println(s1.toString());
System.out.println(s2.toString());
}
//输出
Student{name='张三', age=18}
Student{name='李四', age=20}
**结论:**最终只是交换了副本s1和副本s2的地址,对于实参s1和s2的真实地址没有发生变化,没有改变