面向对象Day01
一、名词解释
-
OO:面向对象(Oriented Object)
定义:是一种以对象为导向,围绕对象来开发应用程序的软件开发方法。
-
OOA: 面向对象分析
-
OOD:面向对象设计
-
OOAD: 面向对象的分析与设计
-
OOP:面向对象编程 ----------你们所参与的
二、现实世界中的类和对象
- 先要明确一件事先有现实世界中的事和物,才有计算机中的类和对象
- 生活中的对象是实实在在存在的事物,是人们在思考或者行动时作为目标的实物 物质
- 我们认识世界会将相同的行为或者特征的事物进行分类,形成了类,类:是一种脑子中形成的概念 意识
- 抽象
- 定义:抽象是从具体的实物中抽出共同的特征(属性)和行为(方法)的过程
- 程序设计的核心机制
- 面向对象四大特征之一(面向对象三大特征:封装继承多态, 抽象)
问题:先有类还是先有对象
现实世界一定是先有了对象, 然后根据对象抽象出了类的概念
三、计算机中的类和对象
-
定义
- 类:类是对具有相同属性和方法的实物的抽象。
- 类中包括
- 属性:事物拥有的静态特征
- 方法:事物拥有的行为
- 对象:对象是类的具体体现,是类的实体/实例;
-
类和对象的关系
- 类是对象的模板,对象是类的实例(抽象与具体的关系)
- 一个类为它的全部对象给出了一个统一的定义,而它的每个对象则是符合这个定义的实体,因此类的对象关系就是抽象与具体的关系
- 类是多个对象进行综合抽象的结果,是实体对象的概念模型,而一个对象是一个类的实例
- 类是对象的模板,对象是类的实例(抽象与具体的关系)
-
如何定义一个类
- 定义类名
类名遵循帕斯卡命名规则(大驼峰命名规则),每一个单词的首字母都大写,如类名Student;
public class 类名{ }
- 定义类的属性
通过留在类的主体中定义变量来描述类所具有的静态特征(属性),这些变量称为类的成员变量。
- 定义类的方法
通过在类中定义方法描述类所具有的行为,这些方法称为类的成员方法
-
创建对象
类是一种数据类型,用这个类型创建的变量也叫对象。
因为类是引用数据类型,所以创建对象需要使用new关键字
类名 对象名 = new 类名(); Student st = new Student();
-
对象调用属性和方法
对象名.属性; 对象名.方法名(); st.name = "张三"; st.eat();
封装
一、成员变量和局部变量
区别 成员变量 局部变量 定义范围 定义在类中,成员变量也叫实例变量,全局变量。 也叫属性 定义在方法或者语句中 作用范围 作用在整个类中 作用在对应的方法或者语句中 内存位置 存储在堆内存,并且在堆内存中被赋予初始值 存储在栈内存中,而且没有默认值,需要手动赋值 生命周期 在对象被创建的时候创建,在对象被销毁的时候销毁 在方法或者语句执行的时候被创建,方法或者语句执行完毕就被销毁
二、匿名对象
-
所谓的匿名对象就是指没有名字的对象
-
注意事项
- 因为匿名对象没有名字,所以只能在创建的时候使用一次
- 匿名对象可以作为参数进行传递
- 匿名对象如果没有作为参数传递,那么在占内存中是没有引用的
-
代码示例
package com.oracle.object2;
public class StudentDemo {
public static void main(String[] args) {
// 这个对象的名字是s1
Student s1 = new Student();
s1.name = "张三";
s1.study("Java");
s1.play();
//创建了一个Student对象
//注意:像这种没有名字的对象称之为匿名对象
new Student().study("Phon");
new Student().play();
new Student();
//new几次就会创建几个对象,每一个对象的地址都是不一样的
//System.out.println(new Student());
//System.out.println(new Student());
//System.out.println(new Student());
//匿名对象可以作为参数传递
printName(new Student());
}
public static void printName(Student st){
System.out.println(st.name);
}
}
三、构造方法
-
构造方法:在类中 方法名与类名一致,没有返回值,连void也灭有的方法
-
构造方法也叫构造函数,也叫构造器
-
作用
- 创建对象, 创建对象就是调用该类的构造方法。
- 对属性进行初始化
-
如果在类中没有手动给定构造方法,那么在编译的时候会自动添加一个默认的无参构造函数
-
如果在类中手动添加了构造函数,那么在编译的时候就不会再默认提供无参构造
-
构造方法虽然没有返回值类型但是依然可以使用return,使用return的作用是为了避免一些不合理的数据被赋值给属性
-
构造方法可以被重载
package com.oracle.object2; /** * 司机类 */ public class Driver { String name; int age; char gender; //性别 String no; // 驾驶证号 /** * 无参构造 * 用于创建对象 */ public Driver() { } public Driver(String a, int b, char c, String d) { name = a; if (b < 18 || b >= 70) { System.out.println("年龄不合适,司机最小年龄18,最大年龄69"); return; } age = b; gender = c; no = d; } public void driver(){ System.out.println(name+"今年"+age+"岁了,正在开车"); } }
四、this关键字
-
因为在Java中所有的非静态方法和属性只能通过对象来调用,而在本类中如果先要调用本类中的方法或者属性,并没有本类的对象,所以需要使用this关键字来表示当前对象,调用属性和方法。
-
this代表笨重中对象的引用,可以认为是一个虚拟的对象,用于在类内调用本类中非静态的方法和非静态的属性
-
this语句表示在本类的构造方法中调用其他形式的构造方法。this语句必须放在构造方法的第一行。
package com.oracle.object4; /** * 司机类 */ public class Driver { String name; int age; char gender; //性别 String no; // 驾驶证号 /** * 无参构造 * 用于创建对象 */ public Driver() { } public Driver(String name) { this.name = name; } public Driver(String name,int age){ this.name = name; this.age = age; } public Driver(String name ,int age,char gender){ this(name,age); this.gender = gender; } public Driver(String name ,int age,char gender,String no){ //自动调用本类中符合形式的构造方法 //this(String,int,char) ---> Strudent(String ,int ,char) //this语句必须放在构造方法的第一行 this(name,age,gender); this.no = no; } }
五、代码块
-
构造代码块
-
所谓的构造代码块是指定义在类中的{} 包裹起来的代码,也称为初始化代码块
-
无论调用哪个构造方法,构造代码块都会执行
-
构造代码块是在创建对象的时候先于构造方法执行的
package com.oracle.object4; /** * 婴儿类 */ public class Baby { String name; /** * 在类中用{}括起来的代码成这位构造代码块/初始化代码块 * 无论调用哪个构造方法,这个代码块都会执行 * 构造代码块是先于构造方法执行的 */ { this.cry(); this.eat(); } public Baby(){ System.out.println("~~~~~~"); // this.eat(); // this.cry(); } public Baby(String name){ this.name = name; // this.cry(); // this.eat(); } public void cry(){ System.out.println("这个婴儿在哭"); } public void eat(){ System.out.println("这个婴儿在吃奶"); } }局部代码块
-
2.局部代码块
-
所谓局部代码块,是指定义在方法中的{} 抱起来的代码
-
作用是限制变量的生命周期从而提高栈内存的利用率
package com.oracle.object4; /** * 局部代码块 */ public class LocalCodeDemo { public static void main(String[] args) { System.out.println("Hello"); { //限制了变量的使用范围,缩短了生命周期 int i = 5; int j = 7; System.out.println(i + j); } System.out.println("~~~~"); } }
六、面向对象的三大特征
- 封装
- 继承
- 多态
- 抽象(部分承认)
七、封装
-
private : 私有的, 被private修饰的属性和方法只能在本类中使用,在其他任意类中都不可以使用。
-
封装是面向对象方法的重要原则,就是把对象的属性和方法结合为一个整体,并尽可能隐藏对象内部的实现细节。封装是一种信息隐藏技术。
-
形式
-
方法:方法其实就是封装的一种行间形式,通过将某段常用的代码提出而形成的一种新的形式
-
属性私有化,方法公开化 创建一个类,将类中的属性由private修饰,并且提供可以对外访问的方法, setXXX, getXXX
setXXX用于设置属性值, getXXX用于获取属性值
-
内部类,内部类作为一种封装的形式,是为了让我们的代码结构更加紧凑。
-
-
作用:
- 提高了代码的复用性(降低了代码的冗余),安全性,使代码更加紧凑
- 使属性私有化 ------- 信息隐藏,更加安全
- 良好的封装能降低耦合度。
-
练习:封装一个学生类, 成员变量: 学号,姓名,性别,家庭住址 并测试1
八、一个标准的JavaBean
一个标准的JavaBean包含
-
私有化的属性
-
无参构造
-
全参构造
-
get方法
-
set方法
package com.oracle.object5; /** * 学生类, 一个标准的JavaBean */ public class Student { private String no; private String name; private char gender; private String address; public Student() { } public Student(String no, String name, char gender, String address) { this.no = no; this.name = name; this.gender = gender; this.address = address; } public String getNo() { return no; } public void setNo(String no) { this.no = no; } public String getName() { return name; } public void setName(String name) { this.name = name; } public char getGender() { return gender; } public void setGender(char gender) { this.gender = gender; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }