目录
一、面向对象概述
1.1、面向过程和面向对象的区别
-面向过程:主要关注的点是,实现的具体过程,因果关系
优点:对于业务逻辑比较简单的程序,可以达到快速开发,前期投入成本较低;
缺点:采用面向过程的方式开发很难解决非常复杂的业务逻辑,面向过程方式开发的软件元素之间的“耦合度”非常高,软件的扩展能力差,没有独立体的概念,无法达到组件复用;
-面向对象:主要关注对象的(独立体)能完成那些功能
优点:耦合度低,扩展能力强,更容易解决现实中比较复杂的业务逻辑,组件复用性强;
缺点:前期投入成本高,需要进行独立体的抽取,大量的系统分析与设计;
-C语言是纯面向过程的,C++半面向对象,java纯面向对象;
-面向对象更符合人的思维方式;
1.2、面向对象的三大特征
-封装
-继承
-多态
采用面向对象的方式开发一个软件,生命周期当中:
-面向对象的分析:OOA;
-面向对象的设计:OOD;
-面向对象的编程:OOP;
二、类和对象的概念
2.1、类:
1、类代表的是一类事物。
2、在现实社会中,对象A和B之间的具有相同的特征,进行抽象总结出来的模板,这个模板就是类;
3、java语言中所有的class都属于引用数据类型
2.2、对象
-对象是现实世界中实际存在的个体;
2.3、总结:
1、对象又被称为实例(instance)
2、类 转化成 对象 称为 实例化
类-----【实例化】---->对象
3、对象 转化为 类 叫抽象
对象---【抽象】--->类
4、类描述的是对象的共同特征 例如:身高特征
5、一个类主要描述的信息:状态+动作
状态信息:名字、身高、体重...一个类的属性
动作信息:吃,走路,跑步 ... 一个类的方法
三、类的定义
3.1、语法结构
【修饰符列表】 class 类名 {
属性;
方法;
}
类体=属性+方法;
例如:学生类
属性有:学号,姓名,性别,年龄
动作信息有:吃饭,睡觉,学习,
代码如下:
/**
* @Auther 张同学
* @Date 2022/4/19
*
* 学生类,
* public(权限修饰符)
* Student(类名)
*/
public class Student {
//学号属性
int number=111;
//姓名属性
String name="zhangsan";
//性别属性
boolean sex=true;
//年龄属性
int age=22;
/**
* 吃饭的方法
*/
public void eat(){
System.out.println("张三在吃饭");
}
/**
* 睡觉的方法
*/
public void sleep(){
System.out.println("张三在睡觉");
}
/**
* 学习的方法
*/
public void stydy(){
System.out.println("张三在学习");
}
}
四、对象的创建和使用
4.1、实例
1、以上学生类中都有属性,属性定义在方法之外,类体之中,这种变量称为成员变量;
2、这些属性信息(变量)没有用static修饰,没有办法通过类直接访问,所以这种变量称为:实例变量
3、对象又被称为实例,实例变量又被称为对象变量,
4、例如以上的student类,如果想要访问到学号,姓名等信息必须要创建变量(实例化对象)
5、一个类可以实例化N个对象
6、实例化对象的语法 new 类名();
7、new是java中的一个运算符
8、例如上面的student类实例化对象:
Student stu=new Student();
stu就是对象
9、通过对象来获取实例变量的信息
public class Student {
//学号属性
int number=111;
//姓名属性
String name="zhangsan";
//性别属性
boolean sex=true;
public static void main(String[] args) {
//实例化Student对象
Student stu=new Student();
//通过对象访问实例变量
System.out.println("学号:"+stu.number);
System.out.println("姓名:"+stu.name);
System.out.println("性别:"+(stu.sex?"男":"女"));
}
}
运行结果:
4.2、静态变量
1、用static修饰的是静态变量,同样用static修饰的方法是静态方法
例如:
public class Student {
//学号属性
static int number=111;
//姓名属性
static String name="zhangsan";
//性别属性
static boolean sex=true;
//年龄属性
static int age=22;
/**
* 吃饭的方法
*/
public static void eat(){
System.out.println("张三在吃饭");
}
/**
* 睡觉的方法
*/
public static void sleep(){
System.out.println("张三在睡觉");
}
/**
* 学习的方法
*/
public static void stydy(){
System.out.println("张三在学习");
}
}
2、静态方法,静态变量的调用不用创建对象 直接 类名.方法名(变量名)如:
public static void main(String[] args) {
//调用静态变量
System.out.println("学号"+Student.number);
System.out.println("姓名"+Student.name);
//调用静态方法
Student.eat();
Student.stydy();
Student.sleep();
}
五、空指针异常
例如:
public static void main(String[] args) {
//创建学生对象
Student stu=new Student();
//给对象赋值null
stu=null;
//在调用该对象
System.out.println(stu.name);
//异常:NullPointerException
//编译可以通过,语法正常
//运行时出现空指针异常
//空引用访问实例相关的数据一定会出现空指针异常
}
六、面向对象的封装性
6.1、封装的好处
1、封装之后,对于那个事务来说,看不到这个事务复杂的那一面,只能看到简单的那一面
2、复杂封装,对外提供简单的操作入口
3、封装之后才会形成真正的对象,真正的独立体
4、封装之后就意味着可以重复使用
5、封装之后对于事务本身提高了安全性
6.2、封装的步骤
1、所有的属性私有化,使用private关键字进行修饰,private表示私有的,修饰的数据只能在本类中访问;
2、对外提供简单的操作入口
-set方法和get方法
-想要修改属性调用set方法
-想要获取属性调用get方法
3、set和get方法命名规范
public void set(get)+属性名首字母大写(形参){
}
例如:
public class Student {
//学号属性
private int number=111;
//get方法
public int getNumber() {
return number;
}
//set方法
public void setNumber(int number) {
this.number = number;
}
}
注意:set和get方法没有static关键字;
有static关键字调用方法 :类名.方法名(实参);
没有static关键字调用方法:引用.方法名(实参);