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,在方法名前面不声明方法类型。
构造方法不能作用是完成对象的初始化工作,他能够把定义对象时的参数传递给对象的域。
构造方法不能由编程人员调用,而要系统调用。
构造方法可以重载,以参数的个数,类型,或排序顺序区分。
具体用法,代码实现
- ①单个构造函数方法
等
待
上
传
- ②多个构造函数方法(例子为;带参数与不带参数)
等
待
上
传
- ③关于继承类的构造方法的调用
等
待
上
传