Day06--面向对象1(封装+构造方法)

Day06–面向对象1(封装+构造方法)

一、类和对象的创建和使用

1.概述
  • 类是抽象的,可以理解成一个图纸一个模板
  • 对象是具体的,可以用来描述类里的信息
  • 类里有 成员变量和方法
2.创建
  • 类通过关键字class创建
  • 对象通过过关键字new创建–数组是对象
3.面向对象的三大特征

1、 封装性,把相关的数据封装成一个“类”组件

2、 继承性,是子类自动共享父类属性和方法,这是类之间的一种关系

3、 多态,增强软件的灵活性和重用性

4.类和对象的图示关系




5.测试
1)汽车类
package cn.tedu.oop;
//测试  创建对象/创建类
//一个.java文件中,可以有多个类,但是只能能有一个类被public修饰,而且这个public的类名就是.java文件名


public class Test03_New {
	public static void main(String[] args) {
		//2.创建对象测试
		new Car();//匿名对象--一次就干一个活儿
		Car car = new Car();//有名字的对象,名字叫做car  类型为模板类型
		//3.调用模板里规定好的方法
		car.forword();
		car.back();
		car.fly();
		//4.调用模板里规定好的属性
		//设置值
		car.color="黑色";
		car.brand="奥迪";
		car.price=6300;
		//获取值
		System.out.println(car.color);//获取值null->黑色
		System.out.println(car.brand);//null->奥迪
		System.out.println(car.price);//0.0->6300.0
	}
}

//1.创建汽车类,用来描述生活中的汽车事物
class Car{
	//属性->成员变量::在类里方法外::引用类型的默认值都是null
	String color;//颜色
	String brand;//品牌
	double price;//价格
	
	//行为->方法::修饰符 返回值 方法名(参数列表){ 方法体 }
	public void forword() {//前进
		System.out.println("汽车在前进");
	}
	public void back() {//后退
		System.out.println("汽车在后退");
	}
	public void fly() {//飞
		System.out.println("汽车在飞");
	}
}
2)手机类
package cn.tedu.oop;
//测试  手机类
public class Test04_Phone {
	public static void main(String[] args) {
		//创建对象
		Phone p = new Phone();
		//调用模板里的方法
		p.voice();
		p.boom();
		p.video();
		//调用模板里的属性
		p.color="黑色";
		p.brand="华为";
		p.price=6300;
		System.out.println(p.color);
		System.out.println(p.brand);
		System.out.println(p.price);
	}
}
//创建手机类
class Phone {
	String brand;
	String color;
	double price;

	public void voice() {
		System.out.println("手机在响铃");
	}
	public void boom() {
		System.out.println("手机爆炸了");
	}
	public void video() {
		System.out.println("手机在播放视频");
	}
}
3)电脑类
package cn.tedu.oop;

public class Test06_Conputer {
	public static void main(String[] args) {
		Computer c = new Computer();
		c.brand="微星";
		c.color="黑色";
		c.post="游戏本";
		c.price=12800;
		
		System.out.println(c.brand);
		System.out.println(c.color);
		System.out.println(c.post);
		System.out.println(c.price);

		c.game();
		c.code();
		c.video();
	}
}

class Computer{
	String brand;
	String color;
	int price;
	String post;
	
	public void game() {
		System.out.println("正在打游戏");
	}
	public void code() {
		System.out.println("正在敲代码");
	}
	public void video() {
		System.out.println("正在看视频");
	}
}
6.单一对象的内存图

在这里插入图片描述


二、多个对象的使用

1.测试
package cn.tedu.oop;
//测试  多个对象的单一对象的内存图ic void main(String[] args) {
		//创建对象测试
		Person p = new Person();
		p.name="张三";
		p.sex=true;
		p.eat();
		System.out.println(p.name);
		System.out.println(p.sex);
		System.out.println();
		
		Person p2 = new Person();
		p2.name="李四";
		p2.sex=false;
		p2.eat();
		System.out.println(p2.name);
		System.out.println(p2.sex);
	}
}

class Person{
	String name;
	boolean sex;
	public void eat() {
		System.out.println("吃饭");
	}
}
2.多个对象的内存图

在这里插入图片描述


三、封装

1.概述
  • 封装是指隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式。

  • 两点好处:

    • 复用性提高了
    • 安全性提高了
  • 通过关键字private实现,

  • 只要被private修饰后,资源只能在本类中访问

2.测试
package cn.tedu.oop;
//测试  封装

/*
 * 总结
 * 1.封装主要使用private关键字来实现
 * 2.被封装的资源,提高了安全性,只能在本类中访问,别的类都访问不了
 * 3.如果其他类非要访问私有资源,只能提供公共的方法访问
 * 4.当方法被私有后,外界无法直接访问,只能间接访问
 * 5.当属性被私有后,外界无法直接访问,只能访问set()设置值,get()获取值
 * */
public class Test02_Private {
	public static void main(String[] args) {
		//创建对象测试
		Student s = new Student();

		//s.eat();//2.eat()被封装了,只能在自己的类中使用
		s.show();//4.访问间接的 public方法

		//s.name="张三";//6.被封装了,只能在自己的类中使用
		//设置name并输出
		s.setName("张三");//8.调用公开的set()方法设置值
		//System.out.println(s.name);
		System.out.println(s.getName());//10.调用公开的方法getName()方法获取值
		
		//s.age=18;
		//System.out.println(s.age);
		//设置age并输出
		s.setAge(18);
		System.out.println(s.getAge());
		
		//设置gender并输出
		s.setGender('男');
		System.out.println(s.getGender());
		
		//获取score并输出
		s.setScore(66);
		System.out.println(s.getScore());
	}
}

class Student{
	private char gender;
	//右键--source--generate setters and getters...select all...ok
	public char getGender() {
		return gender;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}

	private double score;
	public void setScore(double d) {
		score=d;
	}
	public double getScore() {
		return score;
	}

	private String name;//5.被封装的资源,只能在本类中访问
	//7.当属性被封装后,需要设置值时--提供一个公开的 setXxx()方法
	public void setName(String n){//给name属性设置值
		name=n;
	}
	//9.当属性被封装后,需要获取值时--提供一个公开的 getXxx()方法
	public String getName() {
		return name;//返回name属性的值
	}

	private int age;
	public void setAge(int a) {
		age=a;
	}
	public int getAge() {
		return age;
	}

	//1.把资源提高安全性,可以使用private关键字表示封装--只能在本类中访问
	private void eat() {
		System.out.println("吃饭");
	}

	//3.在本类中,提供一个间接的方法 访问eat()的方式
	public void show() {
		eat();
	}
}

四、构造方法

1.概述
  • 是一个与类名同名的 方法
  • 通常实例化对象时,会自动触发构造方法
  • 构造方法的作用:用来创建对象 和 完成对象的初始化
2.语法
修饰符 类名([参数列表]){
    方法体
}
3.测试
package cn.tedu.oop;
//测试  构造方法
/*
 * 总结
 * 1.当你创建对象时,一定会触发 构造方法
 * 2.无参构造默认就有,但是只提供含参构造时,就真没了
 * 3.语法:
 * 		普通方法:修饰符 返回值 方法名(参数列表){方法体}
 * 		构造方法:修饰符 类名(参数列表){方法体}
 * 4.构造方法的作用是:创建对象时用,创建对象时才触发
 * 5.构造方法可以重载,可以提供好多个构造方法--方便外界使用
 * */
public class Test03_Constructor {
	public static void main(String[] args) {
		//1.当创建对象时,一定会自动触发构造方法
		Teacher t = new Teacher();//匹配无参构造
		Teacher t2= new Teacher("皮皮霞");//匹配含参构造
		Teacher t3= new Teacher("皮皮霞",19);//匹配含参构造
		Teacher t4= new Teacher(20);//匹配含参构造
		System.out.println(t4.Age);
		Teacher t5= new Teacher(20,"杨幂");//匹配含参构造
	}
}
class Teacher{
	int Age;//赋值的方式:set()+构造方法
	//TODO 修饰符 类名([参数列表]){方法体}
	//2.无参构造,默认就存在,默认就是隐藏着的--前提是:不能只提供含参构造
	public Teacher() {
		System.out.println("我会执行");
	}
	//3.提供重载的构造方法::同一个类里,方法名相同,但是参数列表不同的现象
	public Teacher(String name) {
		System.out.println(name);
	}
	public Teacher(String name,int age) {
		System.out.println(name);
		System.out.println(age);
	}
	public Teacher(int age) {
		Age=age;//TODO 完成对象的初始化
	}
	public Teacher(int age,String name) {
		System.out.println(age);
		System.out.println(name);
	}
}

拓展

1.创建对象的流程
Person p = new Person();//短短这行代码发生了很多事情

①把Person.class文件加载进内存

②在栈内存中,开辟空间,存放变量p

③在堆内存中,开辟空间,存放Person对象

④对成员变量进行默认的初始化

⑤对成员变量进行显示初始化

⑥执行构造方法(如果有构造代码块,就先执行构造代码块再执行构造方法)

⑦堆内存完成

⑧把堆内存的地址值赋值给变量p ,p就是一个引用变量,引用了Person对象的地址值

2.匿名对象
  • 没有名字的对象,是对象的简化表示形式。
    • 使用场景:
      • 当被调用的对象只调用一次时(多次会创建多个对象浪费内存)
Demo d = new Demo();
d.sleep();
d.game();
//这个d就是对象的名字。

也可以写成:

new Demo().show();//创建了一个对象调用方法
new Demo().game();//又创建了一个对象调用方法
3.在Java中的封装(private)




4.在Java中类的构造方法
  • 在创建对象的时候,对象成员可以由构造函数方法进行初始化。
new对象时,都是用构造方法进行实例化的;
例如;Test test = new Test"a");
 //Test("a");其中这个就是构造函数,“a”为构造方法的形参;

构造方法的方法名必须与类名一样。
构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
构造方法不能作用是完成对象的初始化工作,他能够把定义对象时的参数传递给对象的域。
构造方法不能由编程人员调用,而要系统调用。
构造方法可以重载,以参数的个数,类型,或排序顺序区分。

具体用法,代码实现

  • ①单个构造函数方法




  • ②多个构造函数方法(例子为;带参数与不带参数)




  • ③关于继承类的构造方法的调用




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值