Java面向对象编程基础
一、面向对象完成具体功能的操作的三步流程
步骤1:创建类,并设计类的内部成员(属性、方法)
步骤2:创建类的对象。比如:Phone p1=new Phone();
步骤3:通过对象,调用其内部声明的属性或方法,完成相关的功能
二、对象在内存中的分配
创建类的一个对象给对象赋值
创建类的2个对象给对象赋值
创建类的多个对象时:每个对象在堆空间中有一个对象实体。每个对象实体中保存着一份类的属性。
如果修改某一个对象的某属性值时,不会影响其他对象此属性的值。
强调:
Person p1 = new Person();
Person p3 = p1;
说明:此时p1,p3两个变量指向了堆空间中的同一个对象实体(p1,p3保存的地址值相同)。如果通过其中某一个对象修改属性时,会导致另一个对象的属性值改变。
三、类的成员之一:属性
1.变量的分类:
角度一:按照数据类型来分:基本数据类型(8种)、引用数据类型(数组、类、接口、枚举、注解、记录)
角度二:按照变量在类中声明的位置的不同:成员变量(或属性)、局部变量(方法内、方法形参、构造器内、构造器)
2.成员变量与局部变量
相同点:
变量声明的格式相同:数据类型 变量名=变量值
变量都有其有效的作用域。出了作用域,就失效了。
变量必须先声明,后赋值,再使用。
不同点:
a、类中声明的位置的不同:
属性:声明在类内,方法外的变量
局部变量:声明方法、构造器内部的变量
b、在内存中分配的位置不同(难):
属性:随着对象的创建,存储在堆空间中。
局部变量:存储在栈空间中
c、生命周期:
属性:随着对象的创建而创建,随着对象的消亡而消亡。
局部变量:随着方法对应的栈帧入栈,局部变量会在栈中分配;随着方法对应的栈帧出栈,局部变量消亡。
d、是否可以有权限修饰符进行修饰:
都有哪些权限修饰符:public、protected、缺省、private。(用于表明所修饰的结构可调用的范围的大小)
属性,是可以使用权限修饰符进行修饰的。暂时还未讲封装性,所以大家先不用写任何权限符。
而局部变量,不能使用任何权限修饰符进行修饰的。
e、是否有默认值(重点):
属性:都有默认初始化值;意味着没有给属性进行显示初始化值,则会有默认初始化值
局部变量:都没有默认初始化值。意味着,在使用局部变量之前,必须显示的赋值,否则报错。
注意:对于方法的形参而言,在调用方法时给形式参数赋值。
3.案例
声明员工类Employee,包含属性:编号id、姓名name、年龄age、薪资salary。
声明Employeellst测试类,并在main方法中,创建2个员工对象,并为属性赋值,并打印两个员工的信息。
package com;
public class Exec_Employee {
int id; //编号
String name; //姓名
int age; //年龄
double salary; //工资
}
package com;
public class Exec_EmployeeTest {
public static void main(String[] args) {
Exec_Employee e1 = new Exec_Employee();
Exec_Employee e2 = new Exec_Employee();
e1.id = 1;
e2.id = 2;
e1.age = 18;
e2.age = 20;
e1.name = "jimmy";
e2.name = "jimmy1";
e1.salary = 30000.98;
e2.salary = 40000.98;
System.out.println("员工编号为:" + e1.id + "工资为:" + e1.salary);
System.out.println("员工编号为:" + e2.id + "工资为:" + e2.salary);
}
}
员工编号为:1工资为:30000.98
员工编号为:2工资为:40000.98
4.案例
package com.exec2;
/**
* package:com.exec2
*
* @Author jimmy-yan
* @Create 2024/10/14 14:05
*/
public class Mydate {
String year;
String month;
String day;
}
package com.exec2;
/**
* package:com.exec2
*
* @Author jimmy-yan
* @Create 2024/10/14 14:04
*/
public class Employee {
int id;
String name;
Mydate brithday; //todo 生日
}
package com.exec2;
/**
* package:com.exec2
*
* @Author jimmy-yan
* @Create 2024/10/14 14:08
*/
public class EmploayTest {
public static void main(String[] args) {
Employee e = new Employee();
e.id = 1;
e.name = "jimmy";
//todo
e.brithday = new Mydate();
e.brithday.year = "2024";
e.brithday.month = "08";
e.brithday.day = "08";
System.out.println("员工信息为:" + e.name + ",生日:" + e.brithday.year + e.brithday.month + e.brithday.day);
}
}
员工信息为:jimmy,生日:20240808
四、方法
1 声明举例
public void eat() {
public void play(String hobby)
public String sleep(int hour)
public int getAge()
2 方法声明的格式
权限修饰符 [其他修饰符] 返回值类型 方法名(形参列表){
方法体
}
a、权限修饰符
四种:private、缺省、protected、public
b、返回值类型
描述当调用完此方法时,是否需要返回一个结果。
无返回值类型:使用void
有返回值类型:需要指明返回的数据类型,可以是基本数据类型,也可以是引用数据类型。
- 需要在方法内部配合“return”+返回值类型的变量或者常量。
我们在在声明方法时,要不要提供返回值类型呢?具体问题具体分析。
c、方法名
属于标识符。需要满足见名知义
d、形参列表
属于局部变量,可以有多个。
分类:无形参列表、有形参列表
3 案例
创建Person类的对象,设置该对象的name、age和gender属性,
调用study方法,输出字符串"studying";
调用showAge()方法,返回age值;
调用addAge(int addAge)方法给对象的age属性值增加addAge岁。比如:2岁。
package com.method.exec1;
/**
* package:com.method.exec1
*
* @Author jimmy-yan
* @Create 2024/10/14 16:27
*/
public class Exec1 {
String name;
int age;
char gender;
public void study() {
System.out.println("sudying");
}
public int showAge() {
return age;
}
public void addAge(int addAge) {
age += addAge;
System.out.println(age);
}
}
package com.method.exec1;
/**
* package:com.method.exec1
*
* @Author jimmy-yan
* @Create 2024/10/14 16:32
*/
public class Exec1Test {
public static void main(String[] args) {
Exec1 e = new Exec1();
e.study();
System.out.println(e.showAge());
e.addAge(5);
}
}
五、方法的重载
1、定义
在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可。满足这样特征的多个方法,彼此之间构成方法的重载。
总结为:“两同一不同”
两同:同一个类、相同的方法名
一不同:参数列表不同。①参数个数不同②参数类型不同
注意:方法的重载与形参的名、权限修饰符、返回值类型都没有关系。
2、如何判断两个方法是相同的呢?
方法名相同,且形参列表相同。(形参列表相同指的是参数个数和类型都相同。
要求:在一个类中,允许存在多个相同名字的方法,只要他们的形参列表不同即可。
package com.method_more;
/**
* package:com.method_more
*
* @Author jimmy-yan
* @Create 2024/10/14 17:25
*/
public class OverloadTest {
public static void main(String[] args) {
}
public void add(int i, int j, int k) {
}
public void add(String s1, String s2) {
}
public void add(int i, String s) {
}
public void add(String s, int i) {
}
}
六、可变个数形参的方法
1、使用场景
在调用方法时,可能会出现方法形参的类型是确定的,但是参数的个数不确定。此时,我们就可以使用可变个数形参的方法。
格式 : (参数类型 … 参数名)
a、可变个数形参的方法在调用时,针对于可变的形参赋的实参的个数可以为:0个、1个或多个。
b、可变个数形参的方法与同一个类中,同名的多个方法之间可以构成重载。
c、特例:可变个数形参的方法与同一个类中方法名相同,且与可变个数形参的类型相同的数组参数不构成重载。
d、可变个数的形参必须声明在形参列表最后
e、可变个数的形参最多再一个方法的形参列表中出现1次
package com.method_more;
/**
* package:com.method_more
*
* @Author jimmy-yan
* @Create 2024/10/14 17:56
*/
public class ArgsTest {
public static void main(String[] args) {
ArgsTest test = new ArgsTest();
test.print();
test.print(1);
test.print(1, 2);
test.print(1, 2, 4);
}
public void print(int... nums) {
System.out.println("1111");
}
public void print(int i) {
System.out.println("2222");
}
public void print(int i, int j) {
System.out.println("3333");
}
}
七、方法的值传递机制
如果是基本数据类型的变量,则将此变量保存的数据值传递出去。
如果是引用数据类型的变量,则将此变量保存的地址值传递出去。
package com.method_more;
/**
* package:com.method_more
*
* @Author jimmy-yan
* @Create 2024/10/14 18:26
*/
public class ValueTransferTest {
public static void main(String[] args) {
//todo 1、基本数据类型的局部变量
int m = 10;
int n = m;
System.out.println("m=" + m + ",n=" + n); //10 10
m++;
System.out.println("m=" + m + ",n=" + n);//11 10
//todo 2、引用数据类型的局部变量
// 2.1数组类型
int[] arr1 = new int[]{1, 2, 3, 4, 5};
int[] arr2 = arr1; //todo 传递的是地址值
arr2[0] =10;
System.out.println(arr1[0]); //10
//todo 2.2、对象类型
Order order1 = new Order();
order1.orderId=1001;
Order order2 = order1;
System.out.println(order2.orderId); //1001
}
}
class Order{
int orderId;
}
m=10,n=10
m=11,n=10
10
1001
规则:实参给形参赋值的过程
如果形参是基本数据类型的变量,则将实参保存的数据值赋给形参。
如果形参是引用数据类型的变量,则将实参保存的地址值赋给形参。
package com.method_more;
/**
* package:com.method_more
*
* @Author jimmy-yan
* @Create 2024/10/14 18:52
*/
public class ValueTransferTest1 {
int age;
public static void main(String[] args) {
ValueTransferTest1 test = new ValueTransferTest1();
//1、对于基本类型的数据变量
int m = 10;
test.method1(m);
System.out.println("m=" + m); //10
}
public void method1(int m) {
m++;
}
}
面试题:Java中的参数传递机制是什么?值传递