面向对象概念
面向对象与面向过程都是一种思想。
面向过程强调的是过程,强调凡事亲历亲为。
面向对象强调的是结果,不关心过程,只需要指挥不需要执行。
JAVA是一种面向对象的语言。
面向对象的三大特征
- 封装:把相关的数据封装为一个“类”组件。
- 继承:继承是子类自动继承父类的属性与方法,是类之间的一种关系。
-
封装
将一类事物的功能与特征封装为一个“类”组件
-
概述
封装是隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式,比如类和方法
好处: 提高安全性
-
private关键字
属性的封装
使用private修饰属性
- 提供对应的get与set 使用方法:
- 给封装的属性设置值:setXxx()—设置值时需要传参
-
方法的封装
用private修饰方法
- 可以在同类中的公共方法里调用这个私有方法
- 这样就可以在其他类中,创建对象,调用公共方法
示例
属性封装
```java package cn.tedu.oop;
/* 用于测试封装 */
public class TestPrivate { public static void main(String[] args) { Student s = new Student(); s.setId( 2019071033); s.setName(“埼玉”); //s.subject = “Java”; s.setSubject(“Java”); System.out.println(s.getName() + “的学号是:” + s.getId() + “,最近在学” + s.getSubject()); s.study(); s.play(); } }
class Student{
//特征--成员变量
private int id;
private String name;
/*
关于方法的第四个要素:返回值类型
如果一个方法需要返回结果,那么通过return关键字返回
注意:返回值类型String必须与返回值subject的类型保持一致
*/
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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;
}
/*
属性封装--直接在属性前加private即可
private 私有的
private修饰的是私有资源
私有资源只能在本类中访问,外部无法访问。
*/
private String subject;
//功能--方法
public void study(){
System.out.println("头悬梁锥刺骨的学习时间");
}
public void play(){
System.out.println("愉快的玩耍时间");
}
}
<a name="hSpgf"></a>
#### 方法封装
```java
package cn.tedu.oop;
public class TestMethodPrivate {
public static void main(String[] args) {
Dog d = new Dog();//4.创建对象
d.eat();//5.调用两个方法
//d.play();//封装后私有方法无法直接调用
}
}
class Dog{//1.创建类
public void eat(){//2.创建公共方法
System.out.println("别看我是一只汪");
play();//在公共的本类中的方法中调用被封装的方法
}
private void play(){//3.创建私有方法
System.out.println("狗拿耗子多管闲事");
}
}
类与对象
类是抽象的,是设计图纸。
对象是具体的,是根据设计图纸设计出来的工具。
类
- Java语言最基本单位就是类,类似于类型。
- 类是一类事物的抽象。
-
对象
每个对象具有三个特点:对象的状态,对象的行为和对象的标识。
对象的状态用来描述对象的基本特征。
- 对象的行为用来描述对象的功能。
- 对象的标识是指对象在内存中都有一个唯一的地址值用来和其他对象区分开来。
- 类是一类事物的抽象,对象是具体的实现。
示例
```java package cn.tedu.oop;
/**
- 练习面向对象入门案例
- 需求:设计手机这类事物
- 特性:品牌 价格 尺寸 颜色
- 功能:打电话 发短信 看直播 */
public class TestCreateClass { public static void main(String[] args) { //通过new关键字创建对象 Phone p = new Phone(); Phone p2 = new Phone(); //使用对象.方法名调用功能 p.call(); p.message(); p.video(); p2.call(); p2.video(); p2.message(); //查看对象的属性值 System.out.println(p.brand); System.out.println(p.price); System.out.println(p.color); System.out.println(p.size); //修改成员变量的值 p2.brand = “华为”; p2.color = “素皮”; p2.price = 5999.9; p2.size = 6.54; System.out.println(p2.brand); System.out.println(p2.price); System.out.println(p2.color); System.out.println(p2.size); } }
/ 在一个Java文件中可以创建多个class,但是只能有一个由public修饰的class,并且这个class的名字就是文件名 /
//通过class关键字创建一个手机类用于描述手机这一类事物 class Phone{
//特征--类的成员变量来描述--位置为类里方法外
String brand;//品牌
double price;//价格
double size;//尺寸
String color;//颜色
//功能--类的方法来描述--修饰符 返回值类型--方法名--(参数列表){方法体}
public void call(){
System.out.println("正在打电话···");
}
public void message(){
System.out.println("正在发短信···");
}
public void video(){
System.out.println("正在看直播···");
}
对象在内存中的存储
- 一般来讲局部变量存在栈中,方法执行完毕内存就被释放对象(new出来的东西)存在堆中,对象不再被使用时,内存才会被释放
- 每个堆内存的元素都有地址值
-
栈和队列
TIPS: 栈与队列指的是一种数据的结构。
栈:先进后出(FILO – First In Last Out)
队列:先进先出(FIFO – First In First Out)创建对象时内存分析
在栈内存中开辟了一块空间,存放引用类型变量p,并把p压入栈底
- 在堆内存中开辟一块空间,存放Phone对象
- 完成对象的初始化,并赋予默认值
- 给初始化完毕的对象赋予唯一的地址值
- 把地址值交给引用类型变量p来保存
p2.brand = “HUAWEI”;就是先到栈内存中找到p2中保存的唯一的地址值
然后根据地址值找到对应的Phone对象,并对其对应的属性值进行修改
p2.eat();
也是先到栈内存中找到p2中保存的唯一的地址值
然后根据地址值找到对应Phone对象,执行Phone对象的eat()方法
普通对象
Cat c= new Cat();——创建了普通对象
- 在栈内存中开辟一块空间,存放引用类型的变量c并把c压入栈底
- 在堆内存中开辟一块空间,用于存放Cat类的对象
- 完成对象的初始化,并根据属性类型赋予对应的默认值
- 给初始化完毕后的对象生成一个唯一的地址值
- 将对象唯一的地址值交给引用类型变量c来保存
后续可以根据变量c中保存的地址值找到对应的对象,进行相关调用
匿名对象
new Cat();—创建了匿名对象
在堆内存中开辟一块空间,用于存放Cat类的对象
- 完成对象的初始化,并根据属性类型赋予对应的默认值
- 给初始化完毕后的对象生成一个唯一的地址值
- 匿名对象没有名字,只能使用一次,所以调用: new Cat0.play0
- 调用完毕,匿名对象就失去作用了,只适合只使用一次的场景