Java面向对象编程基础
- 一、面向对象完成具体功能的操作的三步流程
- 二、对象在内存中的分配
- 三、类的成员之一:属性
- 1.变量的分类:
- 2.成员变量与局部变量
- 3.案例
- 4.案例
- 四、方法
- 1 声明举例
- 2 方法声明的格式
- a、权限修饰符
- b、返回值类型
- c、方法名
- d、形参列表
- 3 案例
- 五、方法的重载
- 1、定义
- 2、如何判断两个方法是相同的呢?
- 六、可变个数形参的方法
- 1、使用场景
- 七、方法的值传递机制
一、面向对象完成具体功能的操作的三步流程
步骤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";//todoe.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 10m++;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中的参数传递机制是什么?值传递