面向对象
面向对象:OOP ,围绕对象进行设计,建立对象模型,围绕着问题域中的对象进行设计。
1、什么是对象、类
万物皆为对象
类是一组具有相同属性行为的对象的集合
类是对象的抽象(模板),对象是类的实例
2、如何编写类
public class Chair {
//把名称特征称为属性
//使用变量表示类的属性(类的成员变量)
String color;
double height;
//把功能特征成为行为,使用方法表示
public void sitChair() {
System.out.println("坐的功能");
}
}
//练习:编写一个人类
//属性:名字,年龄,身高,体重,身份证号码
//方法:吃饭,睡觉,打豆豆
public class Human {
//把名称特征称为属性
//使用变量表示类的属性(类的成员变量)
String name;
int age;
boolean gender
double height;
double weight;
String selfID;
//把功能特征成为行为,使用方法表示
public void eatMeal() {
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public void heatDouDou(){
System.out.println("打豆豆");
}
}
3、设计对象并使用
类也是一种数据类型,引用数据类型
类:是共同特征的描述(设计图)
对象:真实存在的具体实例
如何设计类:

定义类的几个补充注意事项:
(1)类名首字母建议大写,满足驼峰,不能用关键字
(2)一个Java文件可以定义多个class,但只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。注意:实际开发还是建议一个代码文件只定义一个类
(3)成员变量的完整定义格式是:修饰符 数据类型 变量名 = 初始化值;
一般不指定初始值,存在默认值
4、对象内存图
(1)JAVA中的内存机制:
JVM中分为 堆(heap)----存放所有JAVA对象 和 栈(stack)----存放基本类型的数据和对象的引用 和 方法区-----存放方法,调用后调到栈中执行
声明一个基本类型的变量时,会在栈中为该变量分配一块内存,当对其初始化和赋值时,可以简单的理解为将值存储在这块内存中。
方法区存放一个类模板,类模板只加载一次。

类中的方法是根据地址找到方法区的方法后调到栈中执行,执行完后退出
(2)两个变量指向同一个对象内存图

(3)垃圾回收
当堆内存中的对象没有被任何变量引用时,就会被判定为内存中的 ‘‘垃圾’’
Java中存在自动垃圾回收器,会定期清理。
5、构造器
一般的构造方法都是public的,设置为private后外部就不能通过new调用
可以设置static方法
public class Student{
private Student(){
this(1);
}
//可以使用this可以在构造方法种调用其他构造方法
//但是this();只能出现在第一行
//有参构造支持重载
public Student(int a){
syso("int有参构造方法");
test()
}
//设置static 成员方法
public static Student newStudent(){
return new Student();
}
//可以在构造方法中调用成员方法
//但是成员方法不能调用构造方法
public void test(){
syso("这是一个test");
}
}
作用:初始化类的对象,并返回对象的地址
分类:有参数、无参数构造器
定义在类中,可以用于初始化一个类的对象,并返回对象的地址。

注意事项:
(1)无参数构造器默认存在,构造方法不属于成员方法,成员方法是可以通过 对象名.方法名 访问。
(2)一旦定义了有参数构造器(可以重载),无参数构造器就没了,使用无参构造器需要再写
6、this关键字
可以出现在构造器、方法中,代表当前对象的地址。
作用:用于指定访问当前对象的成员变量、成员方法。
//在参数构造器中的用法
public class Car{
String name;
double price;
public Car(String name ,double price){
this.name = name;
this.price = price;
}
// public Car(String name ,double price){
// name = name;
// price = price;//没有this会就近为局部的price赋值,会出错
// }
}
//在成员方法中的用法
public class Car{
String name;
double price;
public Car(String name ,double price){
this.name = name;
this.price = price;
}
public void goWith(String name){
System.out.println(this.name +"正在和"+name+"比赛~~");
}
}

7、封装
面向对象的三大特征:封装、继承、多态
封装:正确设计对象的属性和方法。将成员变量隐藏在对象内部,提高了代码的有效性
对象的原则:**对象代表什么,就得封装对应的数据,并提供数据对应的行为 **
eg:人画圆: 画圆在圆这个类中
人关门:关门在门这个类中
如何更好的封装:一般建议对成员变量使用private关键字修饰,再为每个成员变量提供配套public修饰的getter、setter方法暴露其取值和赋值
public class Student{
//1、成员变量用private修饰
private int age;
//2、提供成套的getter、setter方法
public void setAge(int age){
if(age>=0&&age<==200){
this.age = age;
}else
System.out.println("你的年龄数据有问题!");
}
public int getAge(){
return age;
}
}
8、标准JavaBean:也可称为实体类
其对象可以用于在程序中封装数据
标准 JavaBean 的书写要求:
1.成员变量使用private修饰
2.提供成员变量对应的setter/getter方法(eclipse在source中)
3.必须提供一个无参构造器;有参构造器可写可不写
9、补充知识:成员变量(属于对象)

作用域:局部变量在所属的大括号,成员变量调用就有效
成员变量:可以使用访问修饰符 局部变量:不能使用访问修饰符
10、面向对象项目

package com.itheima.createobject;
public class Movie {
//1、成员变量
private String name;
private double score;
private String actor;
//3、构造器
public Movie() {
}
public Movie(String name, double score, String actor) {
super();
this.name = name;
this.score = score;
this.actor = actor;
}
//2、getter+setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
}
package com.itheima.createobject;
public class MovieTest {
public static void main(String[] args) {
//1、设计电影类
//2、创建3个电影对象,封装电影信息
Movie m1 = new Movie("《长津湖》",9.7,"吴京");
//Movie m2 = new Movie("《我和我的父辈》",9.6,"吴京");
//Movie m3 = new Movie("《扑水少年》",9.5,"王川");
//3、定义一个电影类型的数组,存储3部电影对象
Movie[] movies = new Movie[3];
movies[0] = m1;
movies[1] = new Movie("《我和我的父辈》",9.6,"吴京");
movies[2] = new Movie("《扑水少年》",9.5,"王川");
//4、遍历数组的每个电影对象,然后获取他的信息
for(int i =0;i<movies.length;i++) {
Movie m = movies[i];
System.out.println("电影名"+m.getName());
System.out.println("评分"+m.getScore());
System.out.println("演员"+m.getActor());
System.out.println("---------------------");
}
}
}

浙公网安备 33010602011771号