面向过程:
强调的是过程,
面向对象:
强调的是结果,只需要关注结果就好。
面向对象的三大特征:
- 封装: 把相关的数据封装成一个“类”组件
- 继承: 是子类自动共享父类属性和方法,这是类之间的一种关系
- 多态: 增强软件的灵活性和重用性
类:
- Java语言最基本单位就是类,相当于类型。
- 类是一类事物抽取共同属性与功能形成的。
- 可以理解为模板或者设计图纸。
注意:类在现实世界并不存在,它只是一种对象的数据类型
对象:
每个对象具有三个特点:对象的属性,对象的功能和对象的标识。
- 对象的属性用来描述对象的基本特征。
- 对象的功能用来描述对象的可以完成的操作。
- 对象的标识是指每个对象在内存中都有一个唯一的地址值用于与其他对象进行区分,类似于我们的身份证号
类和对象的关系
- 我们先创建类,再通过类创建出对象
- 我们可以通过一个类创建出多个对象
- 类是抽象的,对象是具体的
对象在内存中的存储
Java把内存分成5大区域,我们重点关注栈和堆。
一般来讲局部变量存在栈中,方法执行完毕内存就被释放
对象(new出来的东西)存在堆中,对象不再被使用时,内存才会被释放
每个堆内存的元素都有地址值
对象中的属性都是成员变量,是有默认值的
TIPS: 栈与队列指的是一种数据的结构。
栈:先进后出(FILO – First In Last Out)----比如 手枪子弹
队列:先进先出(FIFO – First In First Out)—比如 排队打饭
对象创建过程分析
Phone p = new Phone(); 这句代码,再内存中会发生什么呢?
1.在栈内存中开辟一块空间,存放引用类型Phone类型的变量p
2.在堆内存中开辟一块空间,存放Phone类型的对象
3.要给这个对象进行初始化,比如:String brand = null;
4.当对象准备好以后,会生成一个唯一的地址值,然后将此地址值交给引用类型的变量p来保存
5.如果以后想要操作此对象的各种资源,可以通过p变量保存的地址值找到该对象,比如:p.call(); p.price = 66.6;
封装
- 封装是隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式,比如类和方法
好处:
-
提高安全性
-
提高重用性
-
private关键字
是一个权限修饰符 ,可以用来修饰成员变量和成员方法.被私有化的成员只能在本类中访问
- TIPS:如何封装?封装后的资源如何访问?
我们可以使用private关键字来封装成员变量与方法
如何访问私有资源?
关于成员变量:
setXxx – 对外提供公共的设置值方式
getXxx – 对外提供公共的获取值方式
关于成员方法:
把私有方法放在公共方法里供外界调用即可
访问控制符
用来控制一个类,或者类中的成员的访问范围。
TIPS:default是表示不写修饰符,默认,如果写default单词来修饰会报错
匿名对象
没有名字的对象,是对象的简化表示形式。
使用场景:
当被调用的对象只调用一次时(多次会创建多个对象浪费内存)
Demo d = new Demo();
d.sleep();
d.game();
//这个d就是对象的名字。
也可以写成:
new Demo().show();//创建了一个对象调方法
new Demo().game();//又创建了一个对象调方法
今日案例
案例一
package cn.tedu.oop;
/**本类用作面向对象oop入门案例
* 设计手机这一类事物
* 分析属性:品牌 价格 尺寸 颜色
* 分析功能:打电话 发短信 看直播*/
/*在一个Java文件中可以写多个class 但是被public修饰的class只能有一个 并且要求这个公共类的名字必须与文件名一致*/
public class TestCreateClass {
public static void main(String[] args) {
//4.创建手机类的对象
/**我们使用new关键字创建对应类的对象*/
new Phone();//新建phone类的一个对象 但是还没起名字 是匿名对象 在堆内存里
Phone p1 = new Phone();//给新建的对象起一个名字 前后类必须一致 所以p1是引用类型 在栈内存里
//5.通过手机类的对象p1 调用手机类的功能---方法
p1.call();
p1.message();
p1.video();
//6.通过手机类的对象p1 打印查看对象的属性---成员变量
System.out.println(p1.brand);
System.out.println(p1.color);
System.out.println(p1.price);
System.out.println(p1.size);
//7.创建手机类的第二个对象
Phone p2 = new Phone();
//8.通过p2对象 调用手机类的三个功能方法
p2.call();
p2.message();
p2.video();
//9.通过手机类的对象p2,给四个属性赋值并查看
p2.brand="华为";
p2.color="中国红";
p2.price=8888.88;
p2.size=5.6;
System.out.println(p2.brand);
System.out.println(p2.color);
System.out.println(p2.price);
System.out.println(p2.size);
System.out.println(p1);
System.out.println(p2);
}
}
//1.通过class关键字 创建一个手机类 ----用来描述手机这一类事物
class Phone{
//2.定义手机类的属性---用成员变量来描述---位置:类里方法外
double price;//价格
String brand;//品牌
double size;//尺寸
String color;//颜色
//3.定义手机类的功能--用方法来描述--修饰符 返回值类型 方法名(参数列表){方法体}
public void call(){
System.out.println("正在打电话~");
}
public void message(){
System.out.println("正在发短信~");
}
public void video(){
System.out.println("正在看直播~");
}
}
案例二
package cn.tedu.oop;
public class TestPhoneClass {
public static void main(String[] args) {
//新建一个Phone类的对象 此时对象是匿名对象
new Phone2();
//给新建的对象起名 保存对象的地址值
Phone2 p2 = new Phone2();
//调用手机类功能
p2.call();
p2.message();
p2.vedio();
//调用手机属性并赋值输出 华为手机 星辰银 6.1寸 5888.88元
p2.brand="华为手机";
p2.color="星辰银";
p2.size=6.1;
p2.price=5888.88;
System.out.println(p2.brand);
System.out.println(p2.color);
System.out.println(p2.size);
System.out.println(p2.price);
}
}
//创建手机类
class Phone2{
//创建手机类的属性--成员变量
double price;
double size;
String brand;
String color;
//创建手机类的功能--方法
public void call(){
System.out.println("正在打电话~~");
}
public void message(){
System.out.println("正在发短信~~");
}
public void vedio(){
System.out.println("正在看直播~~");
}
}
案例三
package cn.tedu.oop;
/**本类用于测试封装的必要性*/
public class TestPrivate1 {
public static void main(String[] args) {
//3.创建用户类对象
User u = new User();
//4.修改对象的属性值
//u.name="李逵";
u.setName("李逵");
System.out.println(u.getName());
/*需要封装属性,如果不封装的话,就可以直接修改这个属性的值,不安全*/
// u.money=1000000000; 封装以后显示错误:'money' has private access in 'cn.tedu.oop.User' 钱是私有权限
//5.查看属性
// System.out.println(u.money); 封装以后显示错误
//6.4调用操作money的方法
u.setMoney(2000);
System.out.println(u.getMoney());
}
}
//1.创建用户类User
class User{
//2.定义用户类的属性
private String name;//7.1封装name属性
/*空白行右键-->Generate-->Getter and Setter-->CTRL+A 全选所有属性,回车*/
//6.1封装属性--通过private关键字修饰属性即可---因为money是不能让随便修改的 所以需要封装private
private double money = 1000;
//6.2因为属性封装了不能用 需要提供公共的方法让外界使用 1:查询当前账户余额
public double getMoney() {//查询
/*后续可以在这个位置添加权限校验的代码*/
return money;
}
//6.3因为属性封装了不能用 需要提供公共的方法让外界使用 2:修改当前账户余额
public void setMoney(double money) {
/*后续可以在这个位置添加权限校验的代码*/
/*当本类的成员变量与局部变量同名时,可以使用this关键字指定本类的成员变量*/
this.money = money;
}
public String getName() {//有返回值 获取姓名
return name;
}
public void setName(String name) {//设置姓名 得有参数
this.name = name;
}
}
案例四
package cn.tedu.oop;
/**本类用于练习oop的第一大特性:封装*/
public class TestPrivate2 {
public static void main(String[] args) {
//4.创建学生类对象s1
Student s1=new Student();
//4.1 学号10 名字 海绵宝宝 科目 洗碗
s1.sno=10;
//s1.name="海绵宝宝"; 没封装前
// s1.subject="洗碗"; 没封装前
/*6 封装后*/
s1.setName("海绵宝宝");
s1.setSubject("洗碗");
//4.2 查看修改后的s1对象属性
System.out.println(s1.sno);
// System.out.println(s1.name);
// System.out.println(s1.subject);
/*6 封装后*/
System.out.println(s1.getName());
System.out.println(s1.getSubject());
//创建学生类对象s2 并调用学生类对象三个功能方法
Student s2=new Student();
s2.study();
s2.eat();
s2.sleep();
//7.使用对应的get set方法 将s2对象name subject 修改为 派大星 跳草裙舞
s2.setName("派大星");
s2.setSubject("跳草裙舞");
System.out.println(s2.getName());
System.out.println(s2.getSubject());
}
}
//1.定义学生类型
class Student{
//2.属性:学号 sno 姓名 name 科目 subject
//6.封装name subject属性
int sno;
private String name;
private String subject;
//6.1 右键空白行->Generate->Getter and Setter->按住shift选择属性->OK
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
//3.
public void study(){
System.out.println("正在学习~~~~");
}
public void eat(){
System.out.println("正在吃饭~~~~");
}
public void sleep(){
System.out.println("我一点也不想睡觉,就想学习Java");
}
}
案例五
package cn.tedu.oop;
/**本类用于练习方法的封装*/
public class TestPrivate3 {
public static void main(String[] args) {
//4.创建苹果类对象a1并调用两个功能
Apple a1 = new Apple();
a1.clean();
// a1.eat(); 没封装前
}
}
//1.创建苹果类
class Apple{
//2.定义方法1
public void clean(){
System.out.println("苹果要先洗一下~");
//6.当eat()方法被封装,外部其他的类是无法直接使用的 所以我们可以在本类Apple类中的clean()里直接调用eat()
eat();
}
//3.定义方法2 public void eat(){}
//5.使用private 修饰eat()
/*private是一个修饰符,被private修饰的资源是私有资源,只能在本类中使用*/
private void eat(){
System.out.println("可以吃苹果了~");
}
}
案例六
package cn.tedu.oop;
/**苯类用于oop巩固练习*/
public class TestCar {
public static void main(String[] args) {
//4.1创建汽车对象c1,属性: 宝马 五彩斑斓的黑 100.1 666 4 查看对象的属性 调用汽车类型的方法
//4.2 创建c2 特斯拉 黑不溜秋的白 120.5 34 2 查看对象的属性 调用汽车类型的方法
Car c=new Car();
c.start();//调用启动方法
c.stop();//调用停止方法
//给汽车属性赋值
c.brand="BMW-M4 power 雷霆版 v8 双涡轮";
c.color="银色";
c.id=1314521;
c.speed=420;
c.load=4;
System.out.println(c.brand);
System.out.println(c.color);
System.out.println(c.id);
System.out.println(c.speed);
System.out.println(c.load);
//4.1
Car c1=new Car();
c1.start();
c1.brand="宝马";
c1.color="五彩斑斓的黑";
c1.id=666;
c1.speed=100.1;
c1.load=4;
System.out.println(c1.brand);
System.out.println(c1.color);
System.out.println(c1.id);
System.out.println(c1.speed);
System.out.println(c1.load);
c1.stop();
//4.2
Car c2=new Car();
c2.start();
c2.brand="特斯拉";
c2.color="黑不溜秋的白";
c2.id=34;
c2.speed=120.5;
c2.load=2;
System.out.println(c2.brand);
System.out.println(c2.color);
System.out.println(c2.id);
System.out.println(c2.speed);
System.out.println(c2.load);
c2.stop();
}
}
//1.定义汽车类型Car
//2.定义汽车各种属性
//品牌brand 颜色color 速度speed 编号id 载客量load
class Car{
//属性
String brand;
String color;
double speed;
int id;
int load;
//3.定义汽车类的启动功能start(),打印 我的小车车启动了~~
//定义汽车类的停止功能stop(),打印 哎呀妈呀熄火了~~
public void start(){
System.out.println("我的小车车启动了~~");
}
public void stop(){
System.out.println("哎呀妈呀熄火了~~");
}
}
案例七
package cn.tedu.oop;
public class TestDemo {
public static void main(String[] args) {
User2 u=new User2();
u.setName("张三");
u.setPrice(1999);
u.setId(66);
System.out.println(u.getName());
System.out.println(u.getPrice());
System.out.println(u.getId());
}
}
class User2{
private String name;
private double price;
private int id;
/*空白行右键-->Generate-->Getter and Setter-->CTRL+A 全选所有属性,回车*/
// public String getName() {
// return name;
// }
//
// public void setName(String name) {
// this.name = name;
// }
//
// public double getPrice() {
// return price;
// }
//
// public void setPrice(double price) {
// this.price = price;
// }
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public double getPrice() {
return price;
}
public void setPrice(double price){
this.price=price;
}
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
}