面向对象
一、java面向对象学习的三条主线
1.java类及类成员:属性、方法、构造器;代码块、内部类
2.面向对象的三大特征:封装,继承,多态,(抽象性)
3.其他关键字 this super static final abstract interface package import
“大处着眼,小处着手”
二、“人吧大象装进冰箱”
1.面向过程,强调的是功能行为,一函数为最小单位,考虑怎么做
1)把冰箱门打开
2)抬起大象
3)把冰箱门关闭
2.面向对象,强调具备了功能的对象,以类、对象为最小单位。考虑谁来做
人{
打开冰箱门{
冰箱.打开();
}
抬起大象{
大象.进入(冰箱)
}
关闭(冰箱){
冰箱.闭合();
}
}
冰箱{
打开() { };
闭合() { };
}
大象{
进入(冰箱){
}
}
}
三、面向对象的两个要素
类:对一类事物描述,是抽象的、概念上的定义
对象:是实际存在的该类事物的每个个体,因而也称为实例(instance)
面向对象程序设计的重点是类的设计
设计类,就是设计类的成员
/*
四、设计类,其实就是设计类的成员
属性=成员变量=field=域、字段
方法=成员方法=函数=method
五、类和对象的使用面向对象思路落地的实现
1.创建类、设计类成员
2.创建对象
3.通过"对象.属性"或"对象.方法"调用对象的结构
六、如果创建了一个雷的多个对象,则每个对象都独立拥有一套类的属性
意味着:我们修改一个对象属性A,则不影响另一个属性对象
七、对象的内存解析
import javax.security.auth.login.AppConfigurationEntry.LoginModuleControlFlag;
//测试类
public class PersonTest {
public static void main(String[] args) {
//创建Person类的对象
Person p1 = new Person();
//调用对象的结构:属性、方法
//调用属性:“对象.属性”
p1.name="tom";
p1.isMale = true;
System.out.println(p1.name);
p1.eat();
p1.sleep();
p1.talk("中文");
//将P1变量保存的对象地址赋给P2,导致P1和P2指向了堆空间中的同一个对象实体。
Person p2 = p1;
System.out.println(p2.name);
p2.age = 10;
System.out.println(p1.age);
}
}
class Person{
//成员
String name;
int age =1;
boolean isMale;
//方法
public void eat() {
System.out.println("人可以吃饭");
}
public void sleep() {
System.out.println("人可以睡觉");
}
public void talk(String language) {
System.out.println("人可以说话,使用的是:"+language);
}
}
八、类中属性的使用
- 属性(成员变量) VS 局部变量
1.相同点
1.1定义变量的格式:数据类型 变量名 = 变量值
1.2先声明,后使用
1.3变量都有其对应的作用域
2.不同点
2.1在类中声明的位置不同
属性:直接定义在类的一对{}内
局部变量:声明在方法内、方法形参、代码块、构造器形参、构造器内部的变量
2.2关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修饰符
常用的权限修饰符:private、public、缺省protected —》封装性
目前大家声明属性时,都使用缺省就可以了
局部变量:不可以使用权限修饰符
2.3默认初始化值的情况:
属性:类的属性,根据其类型,都有默认初始化值
整型(byte、short、int、long)0
浮点(float、double)0.0
字符型(char)0或’\u0000’
布尔型(boolean),false
引用数据类型(类、数组、接口):null
局部变量:没有默认初始化值
意味着,我们在调用局部变量之前,一定要显式赋值
特别地,形参在调用时,我们赋值即可。
2.4在内存中加载的位置
属性:加载到堆空间中(非static)
局部变量,加载到栈空间
public class UserTest {
public static void main(String[] args) {
User u1 =new User();
System.out.println(u1.name);
System.out.println(u1.age);
System.out.println(u1.isMale);
u1.talk("中文");
u1.eat();
}
}
class User{
//属性(或成员变量)
String name;
int age;
boolean isMale;
public void talk(String language) {
System.out.println("我们使用"+language);
}
public void eat() {
String food = "烙饼";
System.out.println("北方人喜欢吃"+food);
}
}
类中方法的声明和使用
方法:描述类应该具有的功能
比如:math类:sqrt()\random()
Scanner类:nextXxx()
Array类:sort()\binarySearch()\toString()\equals()```
##1.举例
2.方法的声明:权限修饰符 返回值类型 方法名(形参列表){
方法体
}
3.说明
3.1关于权限修饰符
private、public、缺省、protected
3.2返回值类型:有返回值,没有返回值
3.2.1如果方法有返回值,则必须在方法声明时,指定返回值类型。同时要,方法中,需要使用
return关键字来返回指定类型的变量或常量。
如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不需要
使用return,如果使用的话,只能“return;”来表示结束此方法的意思。
3.2.2我们定义方法该不该有返回值?
1)题目要求
2)凭经验,具体问题具体分析
3.3方法名,属于标识符,遵循标识符的规则和规范,“见名知意”
3.4形参列表,方法可以声明0个,1个···
3.4.1格式:数据类型1 形参1,数据类型2 形参2,···
3.4.2我们定义方法时,该不该定义形参
1)题目要求
2)凭经验
3.5方法体:方法功能的体现
4.return关键字使用
1.使用范围,使用在方法体中
2.作用:1)结束方法,2)针对于有返回值类型的方法,使用"return 数据"方法返回所要的数据
3.注意点,return关键字后面不可以声明执行语句
5.方法的使用:可以调用当前类的属性或当前类的方法
方法中不可以定义方法
public class CustomerTset {
public static void main(String[] args) {
Customer cust1 = new Customer();
cust1.eat();
cust1.sleep(6);
}
}
class Customer{
String name;
int age;
boolean isMale;
public void eat() {
System.out.println("客户吃饭");
}
public void sleep(int hour) {
System.out.println("休息时间"+hour+"个小时");
eat();
}
public String getName(){
if(age > 18) {
return name;
}else {
return "Tom";
}
}
public String getNation(String nation) {
String info = "我的国籍是"+nation;
return info;
}
}
课后练习一(利用面向对象的编程方法)
利用面向对象的编程方法,设计类Circle计算园的面积
public class CircleTest {
public static void main(String[] args) {
Circle c1 = new Circle();
c1.radius = 5;
double area = c1.findArea();
System.out.println(area);
c1.findArea1();
}
}
class Circle{
//属性
double radius;
//求圆面积
public double findArea() {
double area = Math.PI*radius*radius;
return area;
}
public void findArea1() {
double area = Math.PI * radius*radius;
System.out.println("园的面积:"+area);
}
}
课后练习二
public class StudentTest1 {
public static void main(String[] args) {
Student1[] stus = new Student1[20];
for(int i = 0; i < stus.length;i++) {
//给数组元素赋值
stus[i] = new Student1();
//给Student对象赋值
stus[i].number = (i+1);
//年级
stus[i].state = (int)(Math.random()*(6-1+1)+1);
//成绩[0,100]
stus[i].score = (int)(Math.random()*(100-0+1));
}
StudentTest1 test = new StudentTest1();
//遍历学生 数组
test.print(stus);
System.out.println("**************");
//打印出三年级的学生信息
test.searchState(stus, 3);
System.out.println("**************");
//使用冒泡排序,排序学生的成绩
test.sort(stus);
test.print(stus);
}
//遍历数组封装
public void print(Student1[] stus) {
for(int i = 0;i < stus.length; i++) {
System.out.println(stus[i].info());
}
}
/**
*
* @Description 查找student的数组中指定年级的学生信息
* @author admin
* date 2020年9月12日下午8:01:11
* @param stus要查找的数组
* @param state要找的年级
*/
public void searchState(Student1[] stus,int state) {
for(int i = 0;i<stus.length;i++) {
if(stus[i].state == state) {
System.out.println(stus[i].info());
}
}
}
/**
*
* @Description 给Student1排序
* @author admin
* date 2020年9月12日下午8:02:46
* @param stus
*/
public void sort(Student1[] stus) {
for(int i = 0;i<stus.length;i++) {
for(int j = 0;j<stus.length-1;j++) {
if(stus[j].score>stus[j+1].score) {
Student1 temp = stus[j];
stus[j] = stus[j+1];
stus[j+1]=temp;
}
}
}
}
}
class Student1{
int number;//学号
int state;//年级
int score;//成绩
//显示学生信息的方法
public String info() {
return "学号:"+number+",年级:"+state+",成绩"+score;
}
}