四、面向对象:
类=抽象概念的人;例如人、猫、狗
对象=实实在在的某个人;
属性:姓名、性别、年纪、出生年月;
方法(行为):吃饭,睡觉....;
面向对象的重点是类的设计;
类的设计就是类的成员的设计;
1、类,类的设计就是类的成员的设计;
field = 属性 = 成员变量,Method =(成员)方法 = 函数
一个类中包含有:属性、方法(行为)、构造器、代码块、内部块(可无)
class person{ //定义了一个person的类,人的类
//属性
string name;
int age;
boolean isMale;
//方法
public void sleep(){
system.out.println("人可以睡觉");
}
public void eat(){
system.out.println("人可以吃饭");
}
public void talk(string language){
system.out.println("人可以说话,使用的是"+language);
}
}
类的实例化,即创建类的对象;
创建类的对象 = 类的实例化 = 实例化类
创建person对象的测试(test)
public class persontest(){
public static void main(String[] args){
//创建Person类的对象
person p1 = new person();
//调用对象的结构,属性,方法
//调用属性:"对象.属性”
p1.name="桂桂";
p1.isMale = true;
system.out.println(p1.name);
//调用方法,“对象.方法
p1.eat();
p1.sleep();
p1.talk("chinese");
preson p2 = new person();
system.out.println(p2.name);//未赋值,默认初始化未null
system.out.println(p2.isMale);//为赋值,默认初始化未false
//p1变量保存的对象地址赋给p3,导致p1和p3指向堆空间中的同一对象实体。
person p3 = p1;
System.out.println(p3.name);//桂桂
p3.age = 10;
System.out.println(p1.age);//10
//如果创建了一个类的多个对象,则每个对象都独立的拥有一套类的属性。(非statuc的)
//意味着,如果修改一个对象的属性A,则不影响另外一个对象属性A的值。
}
}
面向对象的使用(面向对象的落地的实现);
1、创建类,设计类的成员
2、创建类的对象
3、通过 ”对象.属性“ 或 ”对象.方法“ 调用对象的结构
p180 00:53 2023/5/6
四14:44 2023/5/614:44 2023/5/6对象的内存解析
内存中有堆空间、栈空间。
局部变量存在堆空间中,
栈中有,对象的首地址值
p3=p1时,栈中新建一个p3,并指向p1所指的地址值。
五,类的设计
(1)类中属性的使用
属性(成员变量)vs 局部变量
1.相同点
1.1定义变量的格式:数据类型 变量名 = 变量值
1.2先声明,后使用
1.3变量都有其对应的作用域
2.不同点
2.1在类中声明的位置不同
属性,直接定义在类的一对{}内
局部变量,声明在方法内,方法形参(方法小括号里)、代码块、构造器内部的变量
2.2关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修辞符。
常用的的权限修辞符:private、public、缺省(没写)、protected --->封装性
目前,声明属性时,都使用缺省就可以了
局部变量:不可以使用权限修饰符,
2.3默认初始化值的情况
属性:类的属性,根据其类型,都有默认的初始化值。
整型(byte、收人头、int、long):0
浮点型(float\double):0.0
字符型(char):0(或'\u0000')
布尔型:(boolean),false
引用数据类型(类、数组、接口):null
局部变量:没有默认初始化值。
意味着,我们在调用局部变量之前,一定要显式赋值。
特别的:形参在调用时赋值即可。
在内存中加载的位置:
属性;加载到到堆空间中(非static)
局部变量:加载到栈空间
public class usertest{
public static void main(String[] args){
user p1 = new user();
System.out.println(p1.name);
}
class user{
//属性(成员变量)
private String name;
public int age;
boolean isMale;
}
(2)、类中的方法声明和使用
方法:描述类应该具有的功能。
比如:math类:事情让他()\random()...
(3)、方法体的声明形式:
权限修饰符 返回值数据类型 方法名(传入形参列表){
。。。
方法体
。。。20:24 2023/5/6
}
例:public void eat(){};--->void表示没有返回值
public void sleep(int hour){};--->void表示没有返回值
public String getName(){};--->返回两个字符串
public String getNation(String nation){};--->返回两个字符串
方法中经常出现:static<---特殊的关键字
(4)、说明
4.1:关于权限修饰符:
Java规定的4种权限修饰符:private、public、缺省、protected。(前两个频率高)--->封装再细说
4.2返回值类型:有返回值 VS 无返回值
4.2.1如果方法有返回值,则必须在方法声明时,指定返回值类型。
public class Customertest{
}
class Customertest{
//属性
String name;
int age;
boolean isMale;
//方法
public void eat(){
System.out.println("客户吃饭");
}
public void sleep(int hour){
System.out.println("休息了"+ hour +"个小时");
}
public String getName(){
return name;
}
public String getNation(String nation){
String info = "我的国籍是:" + nation;
return info;
}
}
(3)、方法体的声明形式:
权限修饰符 返回值数据类型 方法名(传入形参列表){
。。。
方法体
。。。20:24 2023/5/6
}
例:public void eat(){};--->void表示没有返回值
public void sleep(int hour){};--->void表示没有返回值
public String getName(){};--->返回两个字符串
public String getNation(String nation){};--->返回两个字符串
方法中经常出现:static<---特殊的关键字
(4)、说明
4.1:关于权限修饰符:
Java规定的4种权限修饰符:private、public、缺省、protected (前两个频率高)--->封装性说
4.2返回值类型:有返回值 VS 无返回值
4.2.1如果方法有返回值,则必须在方法声明时,指定返回值类型。同时,方法中,需要使用
return关键字来返回指定类型的变量或常量,例:return 变量(常量);
如果方法中没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不使用return,但如果使用,只能用“return;”表示结束此方法的意思。
return;后边不能声明表达式;
4.2.2我们定义的方法该不该有返回值
(1)看题目要求;
(2)经验
4.3方法名:属于标识符,遵循标识符规则和规范,“见名知意”
4.4形参列表:方法可以声明0个、1个、或多个形参。
4.4.1型1 形参1,数据类型2 形参2,····
4.5:方法体:方法体功能的体现;
5.return关键字的使用:
1、使用的范围,使用在方法中;
2、作用:1结束一个方法;2针对有个返回值的方法,使用”return 数据“方法返回所要的数据。
3、注意点:return关键字后面不可以声明执行语句
6.方法的使用中,可以调用当前类的属性或方法
特殊的:方法A中又调用方法A:递归方法。
方法中,不可以定义方法
P192 对象数组题
定义类student,包含学号number(int),班级state(int),成绩score(int).
创建20个学生对象,学号为1到20,年级和班级都由随机数确定。
问题一,打印出3年级(state值为3)的学生信息。
问题二,使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:
1)生成随机数:Math.random(),返回值类型double;
2)四舍五入取整:Math.round(double d),返回值类型long.
public class studentTest {
public static void main(String[] args){
//声明一个student数组
student[] stus = new student[20];
for(int i = 0;i <stus.length;i++){
//给数组元素赋值
stus[i] = new student();
//给Student对象的属性赋值
stus[i].number = i + 1;
//给Student对象年纪赋[1,6]
stus[i].state = (int)(Math.random()*(6-1+1)+1);
}
}
class Student{
int number;//学号
int state;//年级
int score;//成绩
}