所谓的面向对象是一种编程思想,通过这种思想可以把生活中复杂的事情变得简单,也可以让我们从执行者变为指挥者。面向对象是相对面向过程而言的。面向对象的英文是Object Oriented Programming
面向过程强调的是过程,如“把大象装进冰箱需要分几步?”:
①打开冰箱
②把大象放进去
③关上冰箱
面向对象强调结果,如:我们饿了就去饿了么平台点餐,这个点餐的动作就是面向对象。我们并没有去菜市场买菜,也没有洗菜,更加没有自己烧菜,但是我们依旧吃上了饭。
封装————————把相关的数据封装成一个”类“组件。 继承————————指的是子类自动共享父类的属性和方法,这是类之间的一种关系。 多态————————增强软件的灵活性和复用性
Java语言最基本单位就是类,类似于类型
类是一类事物的抽象
可以理解成模板或者设计蓝图
每个对象具有三个特点:对象的状态、对象的行为和对象的标识。
对象的状态用来描述对象的基本特征。
对象的行为用来描述对象的功能。
对象的标识是指对象在内存中都有一个唯一的地址用来和其他对象区分开来。
类是一类事物的抽象,对象是具体的实现
计算机语言是用来描述现实世界事物的,属性+行为。
怎么通过java语言描述呢?通过类来描述事物,把事物的属性当作是成员变量,把行为当作成员方法。
eg:分析手机事物
属性:品牌、颜色、尺寸、价格… …
行为:打电话、发短信、听音乐… …
类:手机类,抽取相同的属性和行为。
对象:可以按照模板生产很多个手机,比如1号手机对象,包含特有的成员变量和成员方法。
练习一:类的创建和使用
package cn.tedu.day07; /** * 创建汽车类,用来描述汽车 * @author Administrator * */ public class Car { String brand; double length; double width; public void start() {} public void run() {} public void stop() {} }
package cn.tedu.day07; public class Test_Car { public static void main(String[] args) { Car car = new Car(); car.brand = "比亚迪"; car.length=3.5; car.width=2.1; car.start(); car.run(); car.stop(); } }
Java把内存分成方法区、虚拟机栈、本地方法栈、堆和程序计数器五个部分,我们重点关注栈和堆。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lurcuTJ-1625835461307)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210707222219280.png)]
①一般来说局部变量存在栈中,方法执行完毕内存就被释
②对象存在堆中,对象不再被使用时,内存才会被释放
③每个堆内存的元素都有地址值
④对象中的属性都是有默认值的。
创建对象时,内存的变化是怎么样的?
①在栈内存中开辟空间,存放引用类型的变量x
②在堆内存中开辟空间,存放对象
③完成对象的初始化,赋予对应类型的默认值
④给对象分配唯一的标识————内存地址值
⑤将地址值赋予引用类型变量x
练习二:封装学生类
private封装属性后需要提供公共的get、set方法。
private封装方法后需要在公共方法中调用该私有方法。
package cn.tedu.day07; public class Test_Student { public static void main(String[] args) { Student s = new Student(); s.sleep(); s.setId(1); s.setName("李四"); s.setAge(15); System.out.println(s.getId()); System.out.println(s.getName()); System.out.println(s.getAge()); } } class Student{ private int id; private String name; private int age; private void study() { System.out.println("好好学习天天向上"); } public void sleep() { study(); System.out.println("好好睡觉"); } 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 int getAge() { return age; } public void setAge(int age) { this.age = age; } }
构造方法是一种特殊的方法,它是一个与类同名且返回值类型为同名类类型的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的创建或者对象的初始化。当类实例化一个对象时就会自动调用构造方法。构造方法和其他方法一样也可以重载。
修饰符 类名(参数【参数可有可无】){ 代码... ... }
练习一:构造方法创建对象
package cn.tedu.day08; public class Test1_Constructor { public static void main(String[] args) { Person p = new Person(); } } class Person{ public Person() { System.out.println("无参构造"); } }
练习二:构造方法的重载
package cn.tedu.day08; public class Test1_Constructor { public static void main(String[] args) { Person p1 = new Person(); Person p2 = new Person(1); Person p3 = new Person("袁成杰"); Person p4 = new Person(18,"戚薇"); } } class Person{ String name; public Person() { System.out.println("无参构造"); } //无参构造的重载 public Person(int n) { System.out.println("含参构造"+n); } public Person(String a) { System.out.println("含参构造"+a); } public Person(int n,String a) { //构造方法给成员变量赋值 name = a; System.out.println("含参构造"+a+n); } }
总结
①构造方法的作用是用来创建对象
②构造方法的出发节点是:new时/实例化时
③默认只存在一个无参构造
④构造方法可以给变量赋值
注意
当我们创建了含参构造时,默认存在的无参构造就不存在了,需要我们手动创建。
构造代码块
形式
{ 代码 }
分类
构造代码块
位置:类里方法外 触发时机:new时/实例化时
局部代码块
位置:方法里 触发时机:调用方法时
构造代码块
1.在类的内部,方法外部的代码块 2.通常用于抽取构造方法中的共性特征/代码 3.每次调用构造方法前都会调用构造代码块 4.优先于构造方法加载
案例一:先于构造方法加载
package cn.tedu.day08; public class Test2_Block { public static void main(String[] args) { new Demo(); } } class Demo{ { System.out.println("构造代码块"); } public Demo() { System.out.println("无参构造方法"); } }
案例二:提取构造方法中的共性
package cn.tedu.day08; public class Test3_Block { public static void main(String[] args) { new C(); new C(1); } } class C{ String country; { country = "中国"; } public C() { System.out.println("一号选手来自:"+country); } public C(int a) { System.out.println("二号选手来自:"+country); } }
局部代码块
1.在方法里的代码块 2.通常用于控制变量范围,除了括号就失效 3.变量的范围越小越好,因为成员变量会有线程安全问题 4.构造代码块是最优先的,局部代码块顺序执行