一、什么是面向对象
面向对象编程OOP 面向对象OO
1、面向对象的本质
以类的方式组织代码 ,以对象的方式封装数据
2、面向对象的核心思想
抽象,即对事物剥离抽取共同点,变成一个类
3、面向对象的三大特性
封装:
封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
继承:
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法, 或子类从父类继承方法,使得子类具有父类相同的行为。
多态:
多态性是对象多种表现形式的体现。
现实中,比如我们按下 F1 键这个动作:
-
如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
-
如果当前在 Word 下弹出的就是 Word 帮助;
-
在 Windows 下弹出的就是 Windows 帮助和支持。
同一个事件发生在不同的对象上会产生不同的结果。
4、对象与类
-
认识论角度: 先有对象后有类, 对象是具体的事物,类是抽象的,对对象的抽象
-
代码运行角度:先有类后有对象。类是对象的模板
二、类与对象的关系
1、类是一种抽象的数据模型
它是对某一类事物的整体描述定义。但是并不能代表某一个具体的事物。
例如:Person类、Pet类、Car类
这些类都是用来妙手或者定义某一具体事物应该具备的特点和行为
2、对象是抽象概念的具体实例
例如:张三是人的一个具体实例
张三家的狗旺财是狗的一个具体实例
能够体现出特点,展现出功能的是具体的事例,而不是一个抽象的概念
三、创建与初始化对象
1、使用new关键字创建对象
-
为对象分配内存空间
-
对创建好的对象进行默认的初始化
-
调用类中的构造器
2、类中的构造器也称为构造方法,是在创建对象时必须调用的方法
构造器特点:方法名称和类名相同;没有返回值 也不能写void
//学生类 public class Student { //属性:字段;成员变量 String name;//默认null int age;//默认0 //方法 public void study() { System.out.println(this.name + "在学习"); } }
public class Application { public static void main(String[] args) { //使用new关键字实例化Student类,类实例化后会返回一个自己的对象 Student student1 = new Student(); Student student2 = new Student(); //分别输出两个对象的name与age 此时对象有默认值 System.out.println(student1.name);//null System.out.println(student1.age);//0 System.out.println(student2.name);//null System.out.println(student2.age);//0 //利用.属性给对象的属性附具体的值 student1.name = "zhangdi"; student1.age = 21; student2.name = "qinbowen"; student2.age = 23; //输出赋值后的对象的属性值 System.out.println(student1.name);//zhangdi System.out.println(student1.age);//21 System.out.println(student2.name);//qinbowen System.out.println(student2.age);//23 } }
四、构造器详解
1、作用
-
new的本质是在调用构造方法
-
当一个对象被创建时候,构造方法用来初始化该对象, 通常给一个类的实例变量赋初值
2、特点
-
构造方法和它所在类的名字相同;
-
构造方法没有返回值。
3、分类
-
有参构造
-
无参构造
4、注意
-
不管你是否自定义构造方法,所有的类都有构造方法。Java 自动提供了一个默认构造方法即无参构造方法。
-
一旦你定义了自己的构造方法即有参构造方法,默认构造方法就会失效
如果想使用无参构造,就必须显示的定义一个无参构造。
IDEA中构造器快捷键:alt+insert
实例
//一个类即使什么都不写,也存在一个无参构造方法 public class Person { String name; int age; //无参构造方法,默认存在 public Person() { } //有参构造方法,无参构造的重载 public Person(String name) { this.name = name; } //定义了有参构造后,无参构造不再默认存在 //一旦定义了有参构造,必须显示定义一个无参构造 //还可以定义一个多参数构造方法 public Person(String name, int age) { this.name = name; this.age = age; } }
public class Application { public static void main(String[] args) { //编译器根据输入的参数自动选择调用哪个构造方法 Person person1 = new Person("zhangdi"); System.out.println(person1.name); Person person2 = new Person("qinbowen", 23); System.out.println(person2.name); System.out.println(person2.age); } }
五、创建对象内存分析
public class Pet { //属性 String name; int age; //方法 public void shout() { System.out.println("叫了一声"); } }
public class Application { public static void main(String[] args) { Pet dog = new Pet(); dog.name = "旺财"; dog.age = 3; dog.shout(); System.out.println(dog.name); System.out.println(dog.age); Pet cat = new Pet(); } }
-
step1:加载Application类
-
step2:执行main方法
-
step3:加载Pet类到
-
step4:在堆内存生成一个具体对象dog
-
step5:给dog赋值