面向对象
- 面向对象编程(Object-Oriented Programming,OOP)
- 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
- 抽象
- 三大特性
- 封装
- 继承
- 多态
- 从认识角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象
- 从代码运行角度考虑是先有类后有对象。类是对象的模板。
创建与初始化对象
-
使用new关键字创建对象
-
使用new关键字创建时,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用
-
类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。构造器有以下俩个特点:
- 必须和类的名字相同
- 必须没有返回类型,也不能写void
-
构造器必须掌握
package com.oop.demo02; public class Person { //一个类什么都不写,它也会存在一个方法 //显示的定义构造器 String name; int age; //实例化初始值 //1.使用new关键字,必须要有构造器(本质是在调用构造器) public Person(){ } //有参构造:一旦定义了有参构造,无参构造就必须显示定义否则无效 // (定义有参构造后,就把无参构造为空,什么都不用干 public Person(){}) public Person(String name){ this.name = name; } public Person(String name,int age){ this.name = name; this.age = age; } } /* public static void main(String[] args) { Person person = new Person("zhangyi"); System.out.println(person.name);// } 构造器: 1.和类名相同 2.没有返回值 作用: 1.new 本质在调用构造方法 2.初始化对象的值 注意点: 1.定义有参构造后,如果想使用无参构造,显示的定义一个无参的构造(定义有参构造后,就会把系统默认的无参构造器给覆盖掉。如果想使用无参构造器,那就得自己写出来,即显示的定义无参构造器) */
创建对象内存分析
package com.oop.demo03;
public class Pet {
public String name;
public 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);
}
}
封装
- 遵循“高内聚,低耦合”。高内聚:就是类的内部数据操作细节自己完成,不允许干涉;低耦合:仅暴露少量的方法给外部使用
- 封装(信息隐藏),禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏
- 属性私有 get/set
继承
- 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模
- extends。子类是父类的扩展
- Java中只有单继承,没有多继承(可以通过接口实现伪多继承)
- 继承是类与类之间的关系。除此外还有依赖、组合、聚合。
- 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends。
- 子类与父类之间,具有“is a”的关系
多态
- 即同一个方法可以根据发送对象的不同而采用多种不同的行为方式
- 一个对象的实际类型是确定的,但可以指向对象的引用类型有很多
- 多态存在的条件:
- 有继承关系
- 子类重写父类的方法
- 父类引用指向子类对象
- 多态是方法的多态,属性没有多态性
接口
- 普通类:只有具体实现
- 抽象类:具体实现和规范(抽象方法)都有
- 接口:只有规范
- 声明类的关键字是class,声明接口的关键字是interface
内部类
内部类就是在一个类里面定义一个类,比如A类中定义了一个B类,那么B类相当于A类来说就是内部类,而A类相对于B类来说就是外部类
- 成员内部类
- 静态内部类
- 局部内部类
- 匿名内部类