Java码农进阶之路~面向对象之对象和类

一 类和对象的概念

1.对象

在Java中,对象具有属性和方法.属性为对象的一般特征(抽象描述),方法为对象的一些行为.(对象是由类创建出来的具体的事物)

例如用对象描述一个程序员

属性: 姓名 性别 年龄

方法(行为): 吃饭,睡觉,敲代码

2.类

java中最基本的单位就是类.类是一堆抽象事物的描述(模板).也可以说类是具有相同属性和方法(行为)的一组对象的集合.当然,类也具有属性和方法.

3.类与对象的关系

可以说类是一组具体事物的相同特征(属性)和行为(方法)的抽象描述,而对象即为类中的每一个具体事物.

二 面向对象概念以及好处

1.面向过程

说面向对象之前先大致理解下面向过程.见名知意,面向过程的重点就在过程中,比如说在过程中做什么,也可以说是事务的执行者

例如挑选一个电脑

这个过程中,我们就要挑他的CPU,主板,显示器等并执行.

2.面向对象

由名称也可看出其重点在对象.就如做什么事,我们考虑的是找谁做.由事务的执行者变成了指挥者.

就如上个买电脑的例子.买电脑,我们不需要挑电脑的软硬件,而是仅仅需要找一个懂电脑的人帮我们去买就可以了.

可以说面向对象是一个贴近与人的思维(懒人思维).

3.面向对象的好处:

①将复杂问题简单化

②从事务的执行者 转化为 事务的指挥者

③更贴近于人的思维(懒人思维)

三 创建一个类(为力量创建一个抽象类的具体对象)

例如创建一个学生类

class Student{
	//属性书写位置(成员变量 实例变量) 
	//书写位置:类中方法外
	//行为(方法 函数) 跟函数一样 就static先不写
	//书写位置:类中
	String name;
	int age;
	String gender;
	
	//成员方法/实例方法
	public void eat() {
		System.out.println("吃饭");
	}
	public void sleep() {
		System.out.println("睡觉");
	}
	public void play(String game) {
		System.out.println("打游戏" + game);
	}
	//介绍自己的方法(行为):
	public void sayHi() {
		System.out.println("姓名:" + name);
		System.out.println("年龄:" + age);
		System.out.println("性别:" + gender);
	}
}

而创建类都是为了创建一个对象

public static void main(String[] args) {
	//创建一个学生类的对象出来
	//类型名 对象名 = 初值;
	//成员变量会随对象一起进入堆中
	//new 一次,就会在堆中开辟一块内存空间
	//Student stu 对象的引用(保存的是对象的地址)
	Student stu = new Student(); 
       	//使用 对象名.属性名 进行赋值和取值
	stu.name = "fas";
	stu.name = "fa";
	stu.age = 24;
	stu.gender = "男";
	//调用成员方法 对象名.方法名
	stu.eat();
	stu.play("英雄联盟");
	//那个对象调用该方法,打印的就是那个对象的属性
	stu.sayHi();
	//不new没有开辟一个新的空间,对同一个进行数据操作
	Student stu1 = stu;
	stu1.name = "fasf";
	stu.sayHi();
}


而上述所说的成员变量和局部变量可看这个例子

package com.lanou3g;
/*
 * 车类:
 * 车名 排气量 颜色
 * 开车
 * 停车
 */
class car{
	//声明成员变量的时候 可以给初值
	String name = "法拉利";//车名
	String displacement = "8.0T";//排气量 
	String color = "红色";//车颜色
	
	public void startcar(int a) {//方法上
		//在方法中的变量,是局部变量
		//在方法上的变量,是局部变量
		int num = 0;
		//就近原则
		String color = "红色";
		System.out.println(color);
		System.out.println("开车");
	}
	public void stopcar() {
		System.out.println("停车");
	}
	public void sayHi() {
		System.out.println("名字:" + name);
		System.out.println("排气量:" + displacement);
		System.out.println("车颜色:" + color);
	}
}

成员变量和局部变量的区别

1.书写位置

成员变量:类中方法外

局部变量:方法中或方法上

2.在内存中的表现

成员变量:堆内存

局部变量:栈内存

3.生命周期

成员变量:随着对象进入堆内存中创建,随着对象的销毁而销毁

局部变量:随着方法的调用入栈,随着方法的结束而销毁

4.作用域

成员变量:整个类中

局部变量:方法中

5.初始值

成员变量:跟堆内存一样,有默认初始值

局部变量:不给初值,直接编译报错


在创建对象的时候,如若创建不同包下下的同名类的对象,需要指定完整的包名来创建对象

而创建不同包下的不同名类的对象,

四 创建对象时参数的引用
public class Demo04 {
	//参数是基本数据类型
	public static void fun1(int a) {
		System.out.println(a);
		a = 10;
	}
	//参数是引用数据类型
	//要什么类型 就给什么类型
	public static void fun2(Person p) {
		p.name = "文武";
		p.age = 24;
	}

	public static void main(String[] args) {
		int a = 100;
		fun1(a);
		System.out.println(a);
		
		Person p1 = new Person();
		p1.name = "雨竹";
		p1.age = 28;
		fun2(p1);
		p1.sayHi();
	}
}	

数据的操作过程为


所以打印出来的是

五 匿名对象

匿名对象(没有名字的对象):

1.在方法传参数的时候使用

2.只调用一下方法(不赋值的情况下)

public class Demo05 {
	public static void setNameAndAge(Person p, String name, int age) {
		p.name = name;
		p.age = age;
		p.sayHi();
	}
	public static void main(String[] args) {
		//创建两个person对象 并赋值
		//将重复代码 抽成一个方法
		Person p1 = new Person();
		p1.name = "wanglong";
		p1.age = 16;
		p1.sayHi();
		
		Person p2 = new Person();
		setNameAndAge(p2, "menglong", 8);
		
		//使用匿名对象 当方法参数
		//好处:减少代码量 使用方便
		setNameAndAge(new Person(), "kun", 20);
		//匿名对象也是对象,也可以赋值属性,调用同样的方法
		new Person().name = "xin";//xin 0
		new Person().age = 30;// null 30
		new Person().sayHi();// null 0
		//new 在堆内存中开辟空间,所以打印了三个空间
		//只调用方法可以使用匿名对象-----测试方法时,可能会使用
		new Person().fun();
	}
}

所以其打印的结果为



六 封装

写方法就是封装的一种,相当于隐藏代码的实现和属性 不能随意修改

需要开放访问方式(方法) 获取 修改

好处:

1.提高代码的复用性

2.提高代码的安全性

关键字(权限修饰符)

private 私有的

被private修饰的属性 只能本类中访问

public class Demo06 {
	public static void main(String[] args) {
		Phone phone = new Phone();
		//测试 set get方法
		phone.setPhoneName("vivo");
		phone.setColor("红色");
		System.out.println(phone.getPhoneName());
		System.out.println(phone.getColor());
		phone.sayHi();
	}
}
class Phone{
	//java bean 对象(java 实体类创建出来的对象)
	//1.声明成员变量 都需要 私有化
	//2.给每一个成员变量提供 set/get方法
	//3.必须提供 无参的构造方法
	private String phoneName;
	private String color;
	
	//对外开放 访问方式
	//获取方法    get
	//命名规范 
	//	获取 get + 成员变量名(首字母大写)
	//	修改 set + 成员变量名(首字母大写)
	//	标准写法 set方法 没有返回值的
	public String getPhoneName() {
		return phoneName;
	}
	public String getColor() {
		return color;
	}
	//修改方法(设置方法)	set
	public void setPhoneName(String name) {
		phoneName = name;
	}
	public void setColor(String color) {
		//就近原则
		//关键字 this 代表的诗 本类的对象
		//this.成员变量  =  获取 本类的 成员变量
		//this.成员变量 = "哈啊哈";给本类的成员变量赋值
		//this.成员方法  调用本类的成员方法
		//谁调用了这个方法,谁就是这个this
		this.color = color;
		
	}
	
	public void sayHi() {
		System.out.println(phoneName + " " + color);
	}
} 

打印结果

七 有无参数的构造方法
/*
 * 构造方法:对 对象的成员变量进行初始化
 * 写法:
 * 1.没有返回值类型位置(连void都不写)
 * 2.构造方法方法名 要与 类名 完全一致
 */
public class Demo07 {
	public static void main(String[] args) {
		//创建一个pen对象
		//构造方法 是系统帮你调的
		//只要你创建对象 系统就会帮你调用构造方法
		//构造方法 只会执行一遍
		Pen pen = new Pen();
		pen.sayHi();
	/*	pen.setName("作弊笔");
		pen.setColor("红色");
		System.out.println(pen.getName());
		System.out.println(pen.getColor());*/
		
		//测试有参的构造方法
		//传参数 系统就会去找你有参的构造方法调用
		Pen pen2 = new Pen("钢笔", "绿色");
		pen2.sayHi();
		
		/*
		 * 类中写什么?
		 * 成员变量
		 * 无参构造方法
		 * 有参构造方法
		 * 成员方法
		 * set/get方法
		 */
	}
}

class Pen{
	/*
	 * 类中的书写顺序
	 * 1.成员变量
	 * 2.构造方法
	 * 3.成员方法
	 * 4.set/get
	 */
	private String name;
	private String color;
	
	//构造方法(无参)
	public Pen() {
		//初始化成员变量(给成员拜变量赋值)
		this.name = "圆珠笔";
		this.color = "绿色";
		System.out.println("我是pen类的无参构造方法");
	}
	//有参的构造方法(构造方法的重载)
	//为了再创建对象的同时 给成员变量赋值
	public Pen(String name,String color) {
		this.name = name;
		this.color = color;
		System.out.println("我是有参的构造方法");
	}
	
		
	//介绍自己的方法
	public void sayHi() {
		//使用this可以区分 成员变量 和 局部变量
		System.out.println(this.name + " " + this.color);
	}
	//set/get方法
	public void setName(String na) {
		name = na;
	}
	public void setColor(String col) {
		color = col;
	}
	public String getName() {
		return name;
	}
	public String getColor() {
		return color;
	}
	
}

打印结果为


猜你喜欢

转载自blog.csdn.net/t_kuuga/article/details/80244643