面向过程
按照事务的发展顺序,考虑问题
面向对象
事物中存在那些对象
在建立对象与对象的关系(万事万物皆对象)
对象
现实生活中的含义:真实存在的事物;
代码中的对象:描述生活中的对象;
类
现实生活中的含义:一个抽象的概念
代码中的类:对象的设计图
一个类可以创建无数个对象
类与对象的关系
生活中:先有对象后有类
生产或者代码中:先有类后有对象
如何创建一个类
语法:
class 类名{
}
eg:
class Person{
}
类中有什么
class Person{
名字
性别
年龄
肤色
//静态的称之为属性
吃
喝
打游戏
//动态的称之为方法
}
属性
对象静态的事物
定义位置:类中,方法以外
语法:数据类型 变量名;
方法
对象动态的事物
定义的位置:类中方法以外
语法:
访问权限修饰符(可以不写,有默认值) 修饰符(一般情况不写) 返回值类型 方法名(形参列表){
方法体
return 返回值;
}
构造函数
语法:
访问权限修饰符 类名(形参列表){
}
作用:创建本类对象时调用
注意:
1.一个类中如果没有构造函数,系统会帮其生产一个无参构造函数
2.构造函数是一个特殊的方法
3.构造函数的类名是和创建的类一致的
如何创建一个对象
语法:
数据类型 对象名=new 类名/构造函数名(实参列表);
如何使用对象调用属性或方法
属性
设置
对象名.属性名=值;
获取
对象名.属性名
this
作用:1.当局部变量和属性名相同时,用来区分属性和局部变量的
2.在当前类中调用,当前类的其他属性方法,可以忽略this不写
3.在构造函数里调用其他构造函数,在第一行用this();
this的意义:
谁调用this所在的方法,this就代表谁,[对象名.方法=this.方法]
对象的创建过程
类名 对象名=new 类名(实参列表)
步骤:
1.在堆内存中开辟空间
2.给属性赋初始默认值(基本数据类型为0,引用类型为null)
3.执行调用构造函数的代码
4.将堆内存的地址给栈内存中对象的引用
面向对象的三大特征
继承
封装
多态
继承
特点:
1.子类将继承父类的所以属性和方法,但是构造函数不能继承
2.只能单继承,只能有一个父类(直接父类)
3.一个类没有写明继承关系,默认继承与object
代码中的继承:
多个类抽取其共同点形成的概念,该类就是多个类的父类(基类,超类)
继承的优点:
1.节省代码
2.提高代码的可读性
3.提高代码的复用率
语法:
访问权限修饰符 class 子类名 extends 父类名{
}
super:
1.在子类构造函数中调用父类的构造函数,如果不写,默认调用无参构造(只能写在第一行)[语法:super(形参列表); ]
2.如果子类父类都有相同的属性名或方法名时,用来区分子类还是父类的属性,和this用法一样(super.name)
封装
作用:将东西进行包装
优点:
1.降低代码耦合度
2.保护内部
3.方便使用
Java的任何一处都体现着封装性
作用域:变量和方法的使用范围
访问权限修饰符:
作用:限定使用范围
public 公共的 整个项目中
protected 受保护的 当前包中或者继承关系中
默认的 默认的 当前包中
private 私有的 当前类中
属性修饰(尽量private,私有化):
eg:
类{
private 属性
提供两个构造函数,一个无参,一个全参,使用public修饰
给所有属性提供get和set方法(快捷键:alt+shift+s)
get:public String getName() {
return name;
}
set:public void setName(String name) {
this.name = name;
}
重写toString方法
}
多态
意义:一个事物多态的多种展现形态
事的多态:重写与重载
物的多态:
子类对象转父类对象:没有风险自动转换
父类名 对象名=子类对象;
父类对象转子类对象:有风险,需强转
子类名 对象名=(子类名)父类对象;
注意:子类对象转换为父类对象,调用重写后的方法,还是执行子类重写的方法
instanceof:判断对象是否属于该类
语法:对象名 instanceof 类名
包装类
意义:8个基本数据类型对应的类
基本数据类型 包装类
byte Byte
short Short
int Interger
long Long
float Float
double Double
char Character
boolean Boolean
将基本数据类型转换为其对应的包装类对象称之为自动装箱
将包装类对象转换为对应的基本数据类型称之为自动拆箱