面向对象编程(OOP)
Object Oriented Programming
C 面向过程编程
ps : 抓药的例子,要的是抓药的过程
C++ 半面向对象,半面向过程
JAVA 面向对象编程
ps : 抓药的例子,只是看抓药的结果
类名
具有相同特点(属性)和行为(动作)的集合的总称.
比如人类 动物类 房间类 手机类等
对象
是某一类的具体体现,实例,所存在的
将类的抽象概念具体化.
人类的对象: 张三,李四等
植物类的对象 : 路边的梧桐,杨树
属性
是一类事物的特点/特征.
人类 : 有五官,有四肢,肤色等
植物类的属性 : 树干,树叶,树根,花,果实
手机的属性 : 价格,重量,颜色,形状
方法
一类事物都可以进行的动作/行为.
人类 : 吃饭,睡觉,学习等
对象、属性、方法的堆、栈
```
1)方法执行进栈
2)new动作会在堆内存开启空间,创建对象,分配地址值
3)调用方法方法会进栈,执行后方法会弹栈
```java
package com.zhiyou100.oop;
/*
* 学生类:
* 属性 : 姓名 年龄 学号 学校
* 方法 : 学习 吃饭 睡觉
*/
public class Student {
/*
* 属性的写法:
* [访问修饰符] 数据类型 变量名;
* []内的代码,public可写可不写;
*/
public String name;
public Integer age;
public String stuNo;
public String schoolName;
/*
* [访问修饰符] 返回值类型 方法名([参数1],[参数2],...){
* 方法内的执行语句;
* ...
* }
* 访问修饰符 : 控制访问权限
* 返回值类型 : 该方法执行后返回的结果的数据类型
* 基本数据类型 / 引用数据类型 /
* void : 返回为空,方法执行后不返回任何数据
*
* ---
* 如果方法需要返回数据,
* 1) 那就需要返回类型处写上返回的数据类型
* 2) 在方法体的最后使用 return 值的 ; 的格式将值明确的显示返回
* 3) return 后不执行任何的代码;
* 4) return 只能有一个值
* 方法名 : 见名知意,驼峰原则
* () 参数列表 :
* 1) 形式参数 : 该方法执行可能用到的数据
* 2) 形式参数的写法 : 数据类型 变量名;
* 3) 列表内可以写多个参数,也可以不写
* 4) 当方法参数列表有参数时,在调用时(让方法执行时)
* 就必须给方法的参数赋值
*/
public static void main(String[] args) {
}
/*
* 游戏
*/
public String youXi(){
return "赢了";
}
/*
* 学习
*/
public String study(String book,String pen){
System.out.println("学习" + book + "用的" + pen);
return "赢了";
}
/*
* 吃
*/
public void eat(){
System.out.println("吃");
}
/*
* 睡觉
*/
public void sleep(String peopleName){
System.out.println(peopleName + "在睡觉");
}
}
package com.zhiyou100.oop;
/*
* @autor lxf
* 测试类
*/
public class TestOOP {
public static void main(String[] args) {
/*
* 通过类 创建 对象 <==> 实例化
* 类型 对象名 = new 类名();
* ---------------
* 数据类型 变量名 = 值;
* ---------------
* 对象属性取值:
* 数据类型 变量名 = 对象名.属性名;
*
* 对象属性赋值:
* 对象名.属性名 = 值;
*
* 调用对象的方法
* 1) 方法有参数,调用时候必须传入实参
* 实参与形参的个数,顺序,数据类型要保持一致
* 2) 方法无参数,不能给定参数
* 3) 方法无返回值,一定不能接收返回值
* 4) 方法有返回值,可以接收,也可以不接收
* A : 无返回值
* A1 无返回值无参数
* 对象名.方法名();
* A2 无返回值有参数
* 对象名.方法名(实参);
* B : 有返回值
* B1 有返回值无参数
* [数据类型 变量名 = (括号里的可写可不写)] 对象名.方法名();
* B2 有返回值有参数
* [数据类型 变量名 = (括号里的可写可不写)] 对象名.方法名(实参);
*/
// 创建对象
Student student = new Student();
// 获得属性值
Integer age = student.age;
String name = student.name;
String schoolName = student.schoolName;
String stuNo = student.stuNo;
System.out.println("name : " + name);
System.out.println("age : " + age);
System.out.println("schoolName : " + schoolName);
System.out.println("stuNo : " + stuNo);
// 属性赋值
student.name = "张三";
student.age = 123;
student.schoolName = "清华大学";
student.stuNo = "20171892";
System.out.println("name : " + student.name);
System.out.println("age : " + student.age);
System.out.println("schoolName : " + student.schoolName);
System.out.println("stuNo : " + student.stuNo);
// A1 无返回值无参数
student.eat();
// A2 无返回值有参数
student.sleep("张安");
// B1 有返回值无参数
String result = student.youXi();
System.out.println("玩游戏结果 : " + result);
// B2 有返回值有参数
String result1 = student.study("<java从入门到成才>", "钢笔");
System.out.println(result1);
}
}
一个类创建多个对象,以及内存图展示
代码
package com.zhiyou100.oop;
public class TestOOP2 {
public static void main(String[] args) {
/*
* 一个类可以创建多个对象,每个对象都有自己的属性和方法
*/
Student s1 = new Student();
Student s2 = new Student();
Student s3 = new Student();
Student s4 = new Student();
s1.name = "zhangsan";
//结果为空
System.out.println(s2.name);
}
}
图解
两个引用指向一个对象
代码
package com.zhiyou100.oop;
public class TestOOP3 {
public static void main(String[] args) {
/*
* 两个引用指向一个对象
* s1 是对象名,也是变量,也可以叫做引用
* s1引用的是内存中堆中的对象的地址值
* Student s2 = s1;
* 将引用赋值给s2.
* s1 和 s2 操作的是内存中的同一个对象
*/
Student s1 = new Student();
Student s2 = s1;
s1.name = "刘备";
System.out.println(s2.name);
}
}
图解
方法是对象如何调用
package com.zhiyou100.oop;
public class TestOOP4 {
public static void main(String[] args) {
Student student = new Student();
Student s1 = test1(student);
System.out.println(s1);
}
public static Student test1(Student s){
return s;
}
}