二十、面向对象
面向对象的引入
为了更好的了解面向对象思想,我们可以先了解一下面向过程.
面向过程是一种编程思想,顾名思义,面向过程注重的是过程,它在完成一些事的是时候,都需要亲力亲为.
面向对象也是一种编程思想,但是面向对象更符合我们现实生活中的思考,它把我们从执行者变成了指挥者,让处理问题变得更简洁
比如:
(1)把大象放入冰箱这件事
用面向过程思想解决:注重过程;怎么解决
分为三步
第一步:把冰箱门打开
第二步:把大象放进去
第三步:把冰箱门关上
但是面向对象思想:注重结果;谁去解决
谁负责把对象装进去
此时不难看出,使用面向对象思想以后,我们干这件事的时候身份有执行者变成了指挥者,干这件事的主体并不是我们自己了.
(2)洗衣服这件事,
用面向过程思想:
需要思考过程:
第一步:把脏衣服脱下来
第二步:打开洗衣机
第三步:把衣服放进去
第四步:放入洗涤剂
第五步:关闭冰箱门
用面向对象思想:只需要找到一个对象,让她负责把脏衣服洗干净即可
可以看的出来:面向对象思想完成事件的时候,更简洁
什么是面向对象
综上所述,那么什么是面向对象呢?面试官要是问起来要怎么回答呢?
答:面向对象是一种编程思想,又叫oop,全称:Object Oriented Programming.它比较符合我们现实生活中的思考方法,让我们的身份从执行者转变成了指挥者,也让事物变得更简洁了,比如,洗衣服,运用面向对象思想时,就不需要考虑具体应该怎么洗了,而是考虑由谁去洗.再比如,吃饭点菜的时候不需要考虑菜是怎么做的,只需要点想吃的菜即可,这些都是面向对象.
面向对象的三大特征
封装、继承、多态
类和对象
什么是类
1.类是java中最基本的单元,是描述一组事物的属性和行为的的集合.
2.类和事物是一一对应的;
3.类在现实中并不存在,它只是现实事物中的一种抽象的表示
类中的成员
类中的成员有:
成员变量
构造方法
成员方法(我们一般说的成员方法都是非静态的)
对象
对象是具体的类
通过代码体现:
类名 对象名 = new 类名();
对象名.成员变量 = 赋值;
......
对象名.成员方法();
.......
例如:现在有一个学生类
//学生类
class Student{
//成员变量
String name ;
int age ;
//成员方法
public void study(){
System.out.println("学生应该好好学习");
}
}
这时需要一个测试类
class Test{
//编写一个主方法
public static void main(String] args){
//创建一个学生对象
Student student = new Student() ;
//给对象成员赋值
student.name = "张三" ;
student.age = 17 ;
//调用成员方法
student.study() ;
}
}
类和对象的关系
类和对象是相辅相成的
我们先创建类,再通过类创建对象
我们可以通过类来创建多个对象
类是抽象的,对象是具体的
练习:类的创建和使用
一个手机,它的属性有品牌,价格,颜色,内存;方法有打电话,发短信,打游戏,
创建类和对象
手机类:
/*
*手机有品牌(brand),价格,颜色,内存等属性,
* 手机可以打电话,发短信,打游戏等行为,
* 请使用面向对象的方式描述手机并且进行测试
* */
public class Phone {
//定义成员变量
String brand ; //品牌
int price ; //价格
String color ; //颜色
String memory ; //手机内存
//定义成员方法
//打电话方法
public void callPhone(String name){
System.out.println("用" + brand +"打电话给" + name);
}
//发短信的方法
public void sendMsg(String name) {
System.out.println("发短信给" + name);
}
//玩游戏的方法
public void playGame(String game) {
System.out.println(brand + "打" + game + "很流畅");
}
}
测试类:
package com.qf.oop;
public class phoneTest {
//编写一个主方法
public static void main(String[] args) {
Phone phone = new Phone() ;
//给成员变量赋值
phone.brand = "荣耀V20" ;
phone.price = 1599 ;
phone.color = "黑色" ;
phone.memory = "258G" ;
System.out.println(phone.brand + "----" + phone.price + "----" + phone.color +"----" + phone.memory);
//调用Phone的方法
phone.callPhone("贾玲");
phone.sendMsg("贾宝玉");
phone.playGame("王者荣耀");
}
}
对象在内存中的储存
例如:Student s = new Student();
1.在方法区中生成.class文件和main方法
2.然后main方法进栈,在栈内存中开辟空间
3.在栈内存中为s开辟空间
4.在堆内存中为new Student()开辟空间
5.给Student()中的成员分配初始化值,并生成地址值
6.Student()中的地址值赋值给Student s
7.s会指向Student()的地址值
成员变量和局部变量的区别
区别一:
书写位置不同:
成员变量:写在类中方法外
局部变量:写在方法的定义或方法的声明中
区别二:
内存中的位置不同:
成员变量:储存在堆内存中
局部变量:储存在栈内存中
区别三:
生命周期不同:
成员变量:随着对象的创建而产生,随着对象的创建完毕,等待垃圾回收器的回收而消失("不会马上消失");
局部变量:随着方法的调用而产生,随着方法的调用结束而消失
区别四:
初始化值不同:
成员变量:存在系统默认初始值,可以赋值,也可以不赋值;
一般是通过对象名.成员变量 = 赋值;来完成赋值操作
局部变量:在使用前必须赋值:否则会报错"可能尚未初始化";
方法中的形式参数问题(面试题)
一、方法中的形式参数如果是基本数据类型
如果是基本数据类型,形式参数的改变不会影响实际参数
二、方法中的形式参数如果是引用数据类型(数组,类,接口)
如果是引用数据类型,形式参数的改变会影响实际参数,因为它们传递的是空间地址值
三、方法中的形式参数如果是String类型的参数,
String作为引用数据类型,是一种特殊的引用类型
它作为形式参数的效果个基本类型是一致的,形式参数的改变不会影响实际参数
四、方法中的形式参数如果是类
如果当前形式参数是类,调用方法时实际参数需要传递的是当前类的具体的对象(即;new一个类的方法出来,当类的实际参数)
匿名对象
匿名对象即没有名字的对象
我们常见的格式是:类名 对象名 = new 类名;//有名字的对象
匿名对象的格式:
new 类名();
匿名对象的好处:
1.匿名对象可以节省空间,因为没有栈内存中的变量指向堆内存的地址
2.匿名对象可以作为参数传递
注意事项:
在实际开发中,匿名对象不要多次使用,使用一次就好,
使用完毕后会马上被垃圾回收器回收;因为没有栈内存中的变量指向堆内存的地址
封装
封装是指隐藏对象的属性和实现方法,保证它的安全性
然后提供对外的公共访问类set成员变量()和get成员变量();
封装的好处:
提高重用性,提高安全性
private关键字
private关键字是一个权限修饰符
用于修饰成员变量和成员方法
被private关键字修饰的成员只能在本类中使用
this关键字
this关键字代表了当前类对象的地址值的引用
即:代表了当前类的成员(成员方法或者成员变量)
作用:就是当成员变量和局部变量一致时,为了区分,在成员变量前加this.;
格式:
this.变量名(成员变量名);
this.方法名()[当前类的成员方法]
构造方法
构造方法是一种方法,是一种特殊的方法
它的特殊包括以下三点:
1.构造方法的方法名和类名相同
2.没有具体的返回值类型,没有void
3.可以有形式参数
构造方法可以重载
即:同一个类中,方法名一致,但是形式参数不同的方法
方法重载与返回值类型和访问修饰符无关
构造方法的目的:
目的就是给成员变量赋值的
构造方法注意事项
1.构造方法没有返回值类型,也没有void,不能随意定义构造方法
2.当我们的事物类中没有写任何构造方法时,系统会默认给我们提供一个构造方法
但是,如果我们写了有参的构造方法以后,系统不会再提供构造方法,这时再使用无参构造创建对象的时候,会报错,因此,学过构造参数以后,无参构造就要一直定义
给成员变量初始化
给成员变量初始化的方法有两种
第一种:
通过无参构造方法,通过new对象,然后给setxxx赋值,最后通过getxxx()获取值
第二种:
通过有参构造方法,通过new对象直接给赋值,然后通过getxxx()获取值
练习:封装的使用
一个手机,它的属性有品牌,价格,颜色,内存;方法有打电话,发短信,打游戏,把手机类私有化封装起来
创建类和对象
创建一个手机类
public class Phone {
//定义成员方法
private String brand ; //品牌
private int price ; //价格
private String color ; //颜色
private String memory ; //内存
//构造无参方法
public Phone() {
}
//构造有参方法
public Phone(String brand, int price, String color, String memory) {
this.brand = brand;
this.price = price;
this.color = color;
this.memory = memory;
}
//给品牌赋值
public void setBrand