一:面向对象相对于面向过程
面向过程:注重过程中的行为; 冰箱打开,储存,关闭。 面向对象:找出过程中的相关关系,抽象为一种事物; 冰箱(含有打开,存储,关闭)*动作的执行者变动作的调用者
二:
1.找对象用对象2.没有对象创建对象3.维护对象间的关系类和对象的关系:
- 类就是对事物的描述
- 对象是这类事物存在的个体。
唯物的看法:先有类后有对象
三:
对象的创建和实例化
四:
内存模型:
五:
成员变量和局部变量
-成员变量: - 作用域位于类中所有地方
- 在堆空间中
- 随着对象的创建而存在,随着对象的消失而消失。
- 有默认值初始化。
-局部变量: - 作用域位于语句处(范围比成员变量小)
- 在栈空间中
-
随着方法的调用而存在,随着方法的调用完毕而消失。
- 没有默认值初始化,必须定义,赋值,然后才能使用。
成员变量和局部变量:名称一样,在方法中使用的时候,采用的是就近原则。
六:
匿名对象 car c = new car(); c.number = 5; new car().number = 5; new car().color="blue"; new car().run;*匿名对象可以作为实际参数传递
七:封装:
封装:指的是隐藏对象的属性与方法。
八:构造函数
//1.构造函数中不需要定义返回类型(void是无需返回值的意思,请注意区分两者),且构造函数的名称与所在的类名完全一致,其余的与函数的特性相同,可以带有参数列表,可以存在函数的重载现象。
//2.1) 创建对象。任何一个对象创建时,都需要初始化才能使用,所以任何类想要创建实例对象就必须具有构造函数。
2) 对象初始化。构造函数可以对对象进行初始化,并且是给与之格式(参数列表)相符合的对象初始化,是具有一定针对性的初始化函数。
//3.构造函数的格式
了解了构造函数的基本概念,现在来写一个构造函数,希望大家可以了解、记忆其格式,通过实例发现其与普通函数的不同之处。public class Demo{02 private int num=0;03 //无参构造函数04 Demo()05 {06 System.out.println("constractor_run");07 }08 //有参构造函数09 Demo(int num)10 {11 System.out.println("constractor_args_run");12 }13 //普通成员函数14 public void demoFunction()15 {16 System.out.println("function_run");17 }18 } 在这里要说明一点,如果在类中我们不声明构造函数,JVM会帮我们默认生成一个空参数的构造函数;如果在类中我们声明了带参数列表的构造函数,JVM就不会帮我们默认生成一个空参数的构造函数,我们想要使用空参数的构造函数就必须自己去显式的声明一个空参的构造函数。
4.构造函数与普通函数的区别 下面来详细的分析下构造函数与普通函数的区别,通过两者的一个对比,希望可以加深对构造函数的概念的理解。 1) 格式不同: 构造函数不存在返回类型,函数名与所在类的类名一致; 普通函数有返回类型,函数名可以根据需求进行命名。 2)调用时期不同 构造函数在类的对象创建时就运行; 普通函数在对象调用时才会执行。 3)执行次数不同 一个对象创建后,其构造函数只执行一次,就是创建时执行; 一个对象创建后,其普通函数可以执行多次,取决于对象的调用次数。
5.构造函数是对新对象进行初始化,那么当开发中分析事物的时候,发现事物一出现就具备了某些特征时,就可以将其定义在构造函数中,这样方便快捷,也符合面向对象的编程思想。
6.构造函数在继承中的特点 1) 子类会不会调用父类的函数? 子类继承父类,子类对象初始化时父类的构造函数也会执行,因为子类需要使用父类中的属性,子类需要知道是如何初始化的,所以子类初始化必然会调用父类的构造函数(除非父类没有属性,那么这个类的描述也太差了点,或者没有必要去创建这个类了)。 2) 子类的构造函数与父类的构造函数有什么关系? 子类的构造函数中默认的第一行有一条隐式语句super(),该语句会访问父类中的空参数构造函数,除非父类中没有空参数的构造函数,那么子类构造函数的第一行必须显式调用父类的构造函数,即super(int x,…) 。 3) 子类的构造函数需要注意些什么问题呢? 子类的构造函数中,super()语句代表调用了父类的构造函数;this()语句代表调用了子类自身的构造函数。需要注意的是,如果这两条语句显式写出来必须放在构造方法的第一行,而且这两条语句不能共存,一个构造函数中的第一行要么是this()要么是super()。 4)为什么在第一行?因为需要首先进行初始化。 为什么不能共存?因为this()代表的本类的其他构造函数,也会去调用super(),出现了this()就没有必要再出现super()了,重复调用没有意义。换言之,子类中至少有一个构造函数的开头为super(),当然可以隐式存在;也就是说至少有一个构造函数的开头不是this()。 *5*) 所有的类都有构造函数么?构造函数可以被私有化么? 既然构造函数用于创建对象并且初始化对象,那么当一个类不需要创建对象时,就不需要定义构造函数,但是在java中,所有的类都拥有构造函数,只是有些类的构造函数对开发人员来说是隐藏不可见的,这一点与我们的预期并不相同,不过换个角度这也很好理解,因为java是面向对象的,我们创建类的目的就是为了创建对象或者创建其子类对象,所以没有构造函数的类(无法创建对象的类)并没有什么意义。 而对于第二个问题,一个类不想要外界创建其对象时,就可以将其构造函数私有化,本类中提供返回对象的方法,并且多数情况下提供的对象是唯一的,单例设计模式就是一个很好的例子,而当我们开发中需要保证对象唯一性的时候,往往就采取这种做法。 *6*) 构造代码块与构造函数有什么相似和不同? 构造代码块用一对“{}”表示,代码块位置没有具体的要求,但必须与类的成员同等级别,在括号的区域内,可以对所有该类的对象进行初始化,也就是说该类对象创建时都会执行到该代码块,并且其优先于构造函数执行。构造函数如前面提到的是具有针对性的,而构造代码块是作用于所有本类对象的。
7.this关键字指对象本身。 测试类中: Person p = new Person(); Person p1 = new Person(); p.setName="leo"//此时Person类中this代表p p1.setName="xican"//此时Person类中this代表p1 Person类中: public void setName(String name){ this.name = name; }
8.单例设计模式: - 解决一个类在内存中只存在一个对象。 为了保证对象唯一。 1.为了避免其它程序过多建立该类对象。先禁止其他程序建立该类对象; 2.为使得其他程序访问该对象,只好在本类自定义对象; 3.为了方方便其他程序对自定义对象的访问,可以对外提供一些方式 这三步怎么使用代码实现呢? 1.将构造函数私有化 2.在类中创建一个本类对象 3.提供一个方法可以获取到该对象