面向对象

面向对象: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("---------------------");
		}
	}
}
posted @ 2022-05-18 18:39  夜色哪里都是美  阅读(37)  评论(0)    收藏  举报