面向过程:怎么做
面向过程:谁来做
学习java面向对象3条主线:
1.java类及类的成员:属性,方法,构造器;代码块,内部类
2.面向对象的三大特征:封装性,继承性,多态性
3.其他关键字:this,super,static,final,abstract,interface,package
二,面向对象的两个要素
类:对一类事物的描述;对象:一个实例
设计类就是设计类的成员,即为属性和方法
属性=成员变量=field=域,字段;方法=成员方法=函数=method
类和对象的使用:
注意:调用也不一定是写在主函数中,也可能在方法中调用
如何理解类和对象:
类:抽象的,概念性的
对象:实实在在的
关系:对象是类的一个实例
万事万物皆对象:
(1)在java语言范畴中,我们都是将共那个呢,结构封装到具体的类当中,通过类的实例化,创建一个对象,来调用具体的功能结构
(2)涉及到java语言与前端的html,后端的数据库有交互时,都体现为类和对象
1,如果创建了一个类的多个对象,则每个对象都拥有独立的一套属性
但是如果把person p3=p1,则是把p1变量的地址附给p3,让他们指向同一个堆空间,则p1和p3一了
2.属性的默认值
如果是属性,如果没有赋值,会有默认值,同之前一样
如果是类,没有赋值,会是地址值
3.对象的内存解析
虚拟机栈:存储局部变量;堆:存放对象实例;方法区:类信息,常量,静态变量
对象数组的内存解析
4.属性(成员变量) vs 局部变量
相同点:
(1)定义变量的格式都一样: 数据类型 变量名=变量值
(2)先声明,后使用
(3)都有其对应的作用域
不同点:
(1)在类中声明的位置不同
属性(成员变量):直接定义在类的一对{}里面
局部变量:声明在方法内,方法形参,代码块内,构造器形参,构造器内部的变量
(2)关于权限修饰符的不同
属性:在声明权限时,指明权限,使用权限修饰符
常见的权限修饰符:private,public,缺省(前面没有任何东西的),protected
局部变量:不能使用权限修饰符
(3)默认初始化值
属性:均有默认化初始值 整形--0;浮点型--0.0;字符型--0;引用类型--null;布尔型--false
局部变量:没有默认初始化值,因此要使用必须要赋值,不然会报错!!!!!!!
特别的,形参在调用的时候我们赋值即可
(4)在内存中加载的位置
属性:加载到堆空间中
局部空间:加载到栈空间
5.类中方法的声明和使用
方法:描述类应该具有的功能
(1)方法的声明:
格式:权限修饰符 返回值类型 方法名 (形参列表){方法体}
public void eat(){}
public void eat(int a){}
public Stringeat(){}
public String eat(String a){}
说明,声明类型可以是空,可以是数据类型,如果是空,不需要返回,如果是具体类型,需要有返回值;可以有形参,可以没有形参
a:关于权限修饰符:暂时先默认均使用public
b:返回值类型
b1:如果方法有返回值,则必须在方法声明时,指定返回值类型,同时,必须使用return关键字返回这个类型的变量或者常量
b2:如果方法没有返回值: 方法声明时要用void表示,且不需要使用return,若使用则写return;
b3:作用:(1)结束方法 (2)针对有返回值的方法,使用“return 数据”方法,返回所要的数据
b4:注意:return 后面不可以声明执行语句
b5:范围:在方法体中
c:如何判断该不该有返回值
题目要求+凭经验
d:方法名:就是一个标识符,要见名知意
e:形参列表:方法可以声明0个,1个,多个形参
格式:数据类型1 形参1,数据类型2,形参2
f:我们定义方法时,该不该定义形参?
题目要求+凭经验,形参类比成原材料,方法为菜名,方法体为具体过程
(2)方法的使用:
a:在方法体中,可以调用当前类的属性或方法(通常可以调别人或自己,掉自己就是递归)
b:不能在方法里面定义新方法
练习题:
注意:调用有参数的,最好是创建一个对象去调用,或者是static直接调用
package mianxinagduixiang;
public class _4 {
public static void main(String[] args) {
Student[] s = new Student[20];//题目要求创建20个对象,故用数组来表示相同类型的集合
for (int i = 0; i < s.length; i++) {
s[i]=new Student();//这里理解为创建的每一个对象,而在循环里面调用的话就写成了s【i】
s[i].number = i + 1;//i从0开始,学号是1到20
s[i].state = (int) (Math.random() * (6 - 1 + 1) + 1);
s[i].score = (int) (Math.random() * (100 - 0 + 1) + 0);
}
for (int i = 0; i < s.length; i++) {
if (s[i].state == 3)
System.out.println(s[i].info());
}//循环里面调用必须是要加上是s【i】.
System.out.println("****************************************");
//问题二:用冒泡排序按学生成绩排序,并遍历所有学生信息
for (int i1 = 0; i1 < s.length-1; i1++) {
for (int j = 0; j < s.length-1-i1; j++) {
if(s[j].score>s[j+1].score) {
Student temp=s[j];//交换的不是成绩
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
for (int i = 0; i < s.length; i++) {
System.out.println(s[i].info());
}
}
}
class Student {
int state;
int score;
int number;
public String info() {
return "学号为" + "" +number + "的年级为" +
state + "" + "成绩为" + score;
}
}
6.类的内存解析
练习:
解决方法:
way1:
package classroom;
public class C_1 {
public static void main(String[] args) {
//把它从实例变量变成局部变量
long a[]=new long[10];
System.out.println(a[6]);
}
}
way2:
将a变成静态的,实例方法可以调用静态变量
way3:
创建一个对象,通过对象.属性来调用
涉及到的知识点:——静态的调用
(1)若实例变量在实例方法里面,则可以直接调用
(2)实例方法可以调用静态变量
(3)可以调用一个对象的属性



