一、面向对象概念
面向对象编程: OOP(Object Oriented Programming)
C语言: 面向过程编程语言
C++语言: 半面向过程半面向对象
Java语言: 完全面向对象编程
什么是面向
是指针对,关于的意思
什么面向过程
针对过程设计代码
- 举例: 玩五子棋游戏,吃饭
- 设计棋盘,设计规则,设计棋手,判断胜负
- 面粉,和面,做面条,做羊肉,下锅,放料,吃
什么是面向对象
针对对象设计代码
- 设计棋盘对象, 设计棋手对象
- 设计厨师对象
总结
面向对象编程:针对对象设计代码,不去过多的考虑细节
面向对象最后,肯定是有面向过程的
二、如何面向对象编程
用类
类的概念
class
- 类是一个统称,是一系列具有相同特征和行为的对象的集合
- 人类,手机类
类的特征: 即属性
- 属性就是描述类的
- 人类的特征(属性)
- 姓名 性别 身高 体重 年龄 国籍 肤色
- 手机类的特征(属性)
- 品牌 价格 颜色 内存 电池容量
类的行为: 即动作
- 动作就是功能,即函数.方法
- 人类的方法(功能,动作)
- 吃饭,睡觉,工作,学习
- 手机类的方法(功能,动作)
- 打电话,发短信,玩游戏,砸核头
对象:
- 是类的具体体现
- 人类的对象
- 现在的同桌
- 手机类的对象
- 手里的手机
类,属性,方法,对象 之间的关系
- 类里面有属性和方法
- 对象是类创建出来的
- 对象中拥有具体的属性,能执行的方法
三、创建一个类: 人类
创建一个空类
- 类名 见名知意
- 首字母大写,不要特殊符号,数字不要放开头
public class People{
//空类
}
创建类中的属性和方法
- 属性,就是变量,使用 数据类型 属性名;
- 位置: 放在类中,方法外
- 方法,就是之前的方法(返回值,方法名,参数)
public class People{
int age;// 年龄属性
String name;// 姓名属性
// 吃饭的方法
public void eat(String food){
System.out.println("吃"+food);
}
}
四、如何创建对象并使用
有了类如何创建对象呢?
创建一个对象
语法
- 类名 对象名 = new 类名();
public class Test1OOP {
// 执行代码
public static void main(String[] args) {
// 创建对象的语法
// 类名 对象名 = new 类名();
People people = new People( );
}
}
为什么创建对象?
- 因为类是模板,无法使用,需要创建出对象,才能具体体现出属性,以及执行方法
- 即创建对象的目的是为了使用属性和方法
如何使用对象中的属性和方法
使用属性
/**
* 对象属性操作,
* 1) 取出属性值
* 对象名.属性
* 2) 给属性赋值
* 对象名.属性 = 值;
* -------------------
* 刚刚新建的对象,属性也是有值的,是默认值
*/
// 属性取值
String name = people.name;
int age = people.age;
String sex = people.sex;
System.out.println("name = " + name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
// 属性赋值
people.name = "刘备";
people.age = 38;
people.sex = "男";
// 再次取值查看属性
System.out.println(people.name);
System.out.println(people.age);
System.out.println(people.sex);
使用方法
/**
* 对象可以使用方法,即调用方法
* 数据类型 变量 = 对象名.方法(参数);
*/
people.eat("烩面");
String result = people.sleep( );
System.out.println("睡得如何? " + result );
完整代码
public class Test1OOP {
// 执行代码
public static void main(String[] args) {
// 创建对象的语法
// 类名 对象名 = new 类名();
People people = new People( );
/**
* 创建出对象,就可以使用属性和方法
*/
//==============================================
/**
* 对象属性操作,
* 1) 取出属性值
* 对象名.属性
* 2) 给属性赋值
* 对象名.属性 = 值;
* -------------------
* 刚刚新建的对象,属性也是有值的,是默认值
*/
// 属性取值
String name = people.name;
int age = people.age;
String sex = people.sex;
System.out.println("name = " + name);
System.out.println("age = " + age);
System.out.println("sex = " + sex);
// 属性赋值
people.name = "刘备";
people.age = 38;
people.sex = "男";
// 再次取值查看属性
System.out.println(people.name);
System.out.println(people.age);
System.out.println(people.sex);
//==============================================
/**
* 对象可以使用方法,即调用方法
* 数据类型 变量 = 对象名.方法(参数);
*/
people.eat("烩面");
String result = people.sleep( );
System.out.println("睡得如何? " + result );
}
}
类可以创建多个对象
- 一个类是可以创建多个对象
- 由类创建出的每个对象中都有属于自己的属性和方法
- 对象和对象之间的属性和方法互不影响
public static void main(String[] args) {
People p1 = new People( );
p1.name = "刘备";
System.out.println(p1.name );// 刘备
People p2 = new People( );
System.out.println(p2.name );// null
p2.age = 40;
People p3 = new People( );
System.out.println(p3.name );// null
System.out.println(p3.age );// 0
}
内存图
多个引用指向同一对象
引用其实就是地址值
通过地址值引用内存中的对象
通过引用传递,将引用地址值赋值给了另外一个变量p2
即p1和p2指向同一个对象
public static void main(String[] args) {
People p1 = new People( );
p1.name = "刘皇叔";
People p2 = p1;
System.out.println(p2.name);// 皇叔
p2.age = 40;
System.out.println(p1.age );// 40
}
五、内存图
创建一个对象的内存图
- 方法执行进栈
- 每次new都会进堆,开辟空间,分配地址值
创建对象时,属性会初始化
创建多个对象图
- 一个类是可以创建多个对象
- 由类创建出的每个对象中都有属于自己的属性和方法
- 对象和对象之间的属性和方法互不影响
多个引用指向同一个对象
六、成员变量和局部变量
成员变量 | 局部变量 | |
---|---|---|
位置 | 类中方法外 | 方法内 |
使用范围 | 类中所有方法都可使用 | 只能在当前方法内使用 |
初始值 | 在new的时候自动赋默认值 | 手动主动赋值 |
内存位置 | 在堆中 | 在栈中的方法栈帧中 |
生命周期 | 随着创建对象出现在堆中 随着使用引用被垃圾回收而消失 | 随着方法被调用而进栈出现 随着方法执行完弹栈而消失 |
特殊情况: 成员变量和局部变量会重名
- 允许成员变量和局部变量重名
- 重名时默认使用局部变量, (就近原则)
- 因为成员变量在堆中,局部变量在方法栈帧,方便调用
- 当重名时,可以使用this.属性来特指调用成员变量
七、构造方法
什么是构造方法?
构造方法,又称构造函数,又称构造器(constructor)
作用:
- 用来构造/创建对象
- 属性赋初始值
- 无参构造属性初始化默认值
- 有参构造属性初始化指定值
怎么写?
构造方法,虽然是方法,但是与之前的方法有些区别
构造方法没有返回值,连void也没有
方法名必须是当前类的类名
public class People{ // 构造方法 public People(){ } // 普通方法 public void eat(){ } }
如何用?
构造方法的作用是创建对象,当然要在创建对象时使用
语法
- 类名 对象名 = new 类名();
- 类名 对象名 = new
构造方法();
- 类名 对象名 = new
构造方法(参数1,参数2);
构造方法特点
- 每个类默认都有一个无参构造方法,默认是隐藏的
- 也可以显式的写出
- 但是,显式的写出任何一个构造方法,默认的构造方法不再提供
有参构造
但是现在有个问题,通过构造方法创建出的对象的属性都是默认初始值,后续还要自己再单独给属性赋上指定值; 那么能不能像创建数组一样,在创建对象时,直接指定属性,即创建出来的对象属性就有指定值
—> 当然可以,那就是 有参构造方法
有参构造就是有参数的构造方法,目的就是在创建对象时可以指定属性
语法
public People(int age){ this.age = age; }
有参无参构造的区别
有参构造,无参构造都是为了创建对象
- 无参构造创建出的对象,属性值是默认值
- 有参构造创建出的对象,属性值是指定的
八、重载
重载,overload
什么是重载
重载就是在同一类内,方法名一样,参数列表不一样的多个方法
参数列表一样是指,参数的个数,类型,顺序任意不一样都是
重载和返回值没有关系
public class Test2OOP {
public static void main(String[] args) {
/**
* 以下这几个方法就是重载
* 方法名一样,参数列表不一样
* 好处/作用:
* 同一方法名,传入不同的参数,都能执行
* 使用方便
*根据传入的参数类型,自动找到对应的方法执行
*/
System.out.println( );
System.out.println(1);
System.out.println(1.1);
System.out.println("A");
System.out.println(new People( ));
System.out.println(new int[3]);
// =========多个构造方法也是重载关系============
new People( );
new People(19, "关羽");
new People(19);
new People("黄盖");
new People("黄盖",50);
}
/**
* 以下几个都是重载
* 他们的方法名一样,参数的个数,类型,顺序任意不一样都是重载
* 与返回值类没有关系
*/
public static void test() {
}
public static void test(int a) {
}
public static void test(String a) {
}
public static void test(int b, String a) {
}
public static void test(String a, int b) {
}
}
最后
如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍