一、面向对象编程
1、定义
方法是对重复使用的代码的封装,类是对功能性质相近的方法的封装,所谓的对象则是类的实例化形式,是具有一定功能的独立个体,面向对象的思想相较于面向过程的思想更符合人类的思想习惯,将复杂的事情简单化。
2、特点:抽象、封装、继承与多态
3、类的使用
一个事物我们对于它往往从两个方面描述:属性与行为。对于一个类,Java中使用成员变量与成员方法进行描述。
4、对象
- 对象是类的实例化表现形式。
- 创建对象:通过new关键字创建新对象:类名 对象名 = new 类名()。
- 对象中成员的调用:对象名.变量名,对象名.方法名()。
- 对象中属性的值:如果我们在定义类的时候赋值了那么初始化对象的时候就有值,否则,JVM会给我们一个默认值,这和动态创建数组的时候是一样的。
- 对象和类的内存问题:类加载之后,存在于方法区内,只有一份;但是对象创建之后存在于堆区,有多个对象就有多份空间存储对象。
5、成员变量和局部变量区别:
- 在类中的位置不同。成员变量在类中方法外,局部变量定义在方法中或者方法声明上。
- 在内存中的位置不同。成员变量在堆内存,局部变量在栈内存。因为成员变量属于对象,对象进堆内存,而局部变量属于方法,方法进栈内存。
- 生命周期不同。成员变量随着对象的创建而存在,随着对象的消亡而消亡。局部变量随着方法的调用而存在,随着方法的结束而消亡。
- 初始化值不同。成员变量有默认值,是在对象创建的过程中JVM设置的默认值。局部变量没有默认值,必须在使用之前赋值。
6、匿名对象:匿名对象是指只使用依次的对象,没有变量引用它。
7、private关键字:是一个权限修饰符,可以用来修饰成员变量与成员方法,被其修饰的成员只能在本类中使用。
8、JavaBean
- 类中的属性全部私有化
- 通过getter和setter方法获取和设置
- 提供toString方法用来描述对象
- JavaBean的主要作用是运送数据
9、this关键字
this关键字代表本类对象,用来区分重名的成员变量和局部变量。只能在本类非静态方法中使用,因为静态方法独立于对象而存在,静态方法调用的时候对象不一定存在,所以就不能调用
二、封装
1、构造方法
- 构造方法的作用是当我们使用new关键字创建对象的时候可以传入一些参数,初始化对象中的成员变量。
- 构造方法的特点:
- 方法名与类名相同
- 没有返回值类型,连void也没有
- 没有具体的返回值return
- 构造方法可以是有参的,也可以是无参的。
- 注意事项:如果没有写构造方法,编译器会帮我们自动加上一个空参的构造方法,如果我们手动补上了一个有参的构造方法,编译器就不会帮我们加上了,这时如果我们还想要空参的构造方法就需要自己写了 。
2、构造方法的重载
构造方法本质上还是一种成员方法,所以说它的重载还是和方法重载一样,方法名相同,参数列表不同。构造方法之间可以相互调用,需要使用this(),没有参数的表示调用空参构造方法,传入某个参数代表调用特定的构造方法。需要注意的是,一个构造方法中只能调用一个构造方法,并且调用语句必须位于第一行。否则编译器会报错。
3、代码块:是用花括号将一段代码括起来形成一个整体。
- 局部代码块:位于方法中,作用是限定局部变量的生命周期,及早释放,提高内存利用率;在方法中创建一个域,限制变量的作用范围。
- 构造代码块:位于类中方法外。创建对象时候优先于构造方法执行,多个构造方法中相同的代码存放到构造代码块中节省代码量,主要用于初始化成员变量。
- 静态代码块:位于类中方法外。给构造代码块加上static关键字就变成了静态代码块,用于类的初始化,在类加载的时候执行,并且只在类加载的时候执行一次,一般用于加载驱动,比如数据库连接驱动,还用于初始化静态成员变量。
- 同步代码块:作用于多线程中。
- 对象初始化顺序问题:构造方法晚于成员变量直接初始化和构造代码块,成员变量直接初始化和构造代码块是平级的,两者谁在前面先执行谁,正常开发过程中一般将成员变量写在前面。
4、静态
-
按照我的理解,一旦一个类的成员变量与成员方法加上了static关键字,这个成员变量或者成员方法就不属于依据这个类创建的对象了,而属于这个类
-
特点:随着类的加载而加载;优先于对象而存在;被类的所有对象共享,全局只存在一个;通过类名调用;优先于非静态成员;类的所有静态成员都存储于静态方法区;执行效率高;
注:其实也可以通过对象名的形式调用静态变量与静态方法,但是不建议这样做,这样做之后让人一位这个变量是属于这个对象的,事实上静态变量与静态方法不属于任何对象,而属于创建对象的类。 -
初始化顺序:静态的总是优先于非静态,因为静态的在类加载的时候就执行了,而非静态的在对象初始化的时候才执行,所以静态成员变量和静态代码块优先于其他三个,这两个之间是平级的关系,谁在前面谁就先执行,就像成员变量与构造代码块。
5、静态与非静态的关系
记住静态存在的时候非静态不一定存在,但是非静态存在的时候静态一定存在,所以有以下三点区别:
- 静态方法中不能使用this关键字,非静态可以。
- 静态方法只能访问静态的成员变量,但是非静态可以访问非静态的,也可以访问静态的。
- 静态方法只能访问静态方法,非静态方法两者都可以访问呢。
6、main方法简介
main方法是程序的入口,首先被JVM压栈,所以必须定义为公共的、静态的,同时它也没有返回值,main方法中的参数是我们使用java命令行编译文件时输入的字符串。
三、单例模式
1、 定义
单例模式指的是一个类在内存中只保持一个对象,因为频繁的创建和销毁对象会消耗系统资源,使用单例模式有助于提高性能。但是通过单例模式创建的对象不会被系统回收,创建过多的单例容易造成内存溢出。
2、创建过程
私有化构造方法,这样外部就不能通过new关键字来创建新的对象。
在类的内部创建一个该类的私有化静态对象。
在类中定义一个公共的静态的方法,返回这个对象。
3、分类
饿汉模式:在类加载的时候就创建该类的对象
public class Singleton{
private static Singleton s = new Singleton();
private Singleton(){ }
public static Singleton getInstance(){
return s;
}
}
懒汉模式:只有当第一次需要的时候才创建该类的对象
public class Singleton{
private static Singleton s;
private Singleton(){ }
public static Singleton getInstance(){
if(s==null){
s = new Singleton();
}
return s;
}
}
四、继承:指子类从父类那里拿一些方法和变量,这样有利于提高代码的复用性。在Java中使用extends关键字来实现继承,Java只允许单继承,不允许多继承.
1、优缺点
- 优点
- 子类可以获取到父类中的方法和属性
- 提高了代码的复用性和维护性
- 让类和类之间产生关系,是多态的前提
- 缺点:类的耦合性增强了。开发的原则是高内聚、低耦合。耦合是指类与类之间的关系。内聚是指独立完成工作的能力。
2、this和super关键字
this代表本类对象,super代表父类对象;this.成员 调用本对象中的成员,也可以调用父类中的成员(当子类中没有的时候),super.成员 调用父类的成员,这时符合就近原则的;this(...) 调用本对象的构造方法 super(...) 调用父对象的构造方法;在子类的一个构造方法中this()与super()不能同时出现,因为这两者都必须是子类构造方法中的第一条语句,同时使用会造成冲突。
3、子父类构造方法
子类中的所有构造方法都会默认访问父类中的无参构造方法。因为子类继承父类中的数据,可能还会使用父类中的数据,所以子类在初始化的时候要先将父类从初始化。当父类中没有空参构造的时候,子类会报错,这时我们可以采用调用父类的有参构造方法。
4、子父类成员的关系
子类无法使用父类的私有成员(成员变量和成员方法);子父类中出现了一样的成员变量,还是采用就近原则,如果子类有,就用子类的,如果子类没有,就用父类的。这不适用于使用super关键字调用父类成员的时候,这种情况是显式调用父类的,即使子类有也不会调用子类的。
5、子父类的初始化顺序
加载父类->加载子类->父类类初始化->子类类初始化->创建父类对象->创建子类对象->初始化父类->初始化子类
在这个过程中坚持的原则是:静态优先,父类优先。
6、方法重写:指的是子类重写父类的非私有方法,这样在多态的时候就可以调用子类自己的具有相同名称和参数列表的方法。
- 重写注意的问题
- 父类的静态方法,子类也必须通过静态方法重写
- 子类重写父类的方法,访问权限不能低于父类的方法,最好保持一致。
- 父类的私有方法不能被重写,因为私有方法不能被继承。
7、instanceof关键字:用来判断一个对象是否是一个类及其子类的实例。是一个关系运算符,返回的是一个boolean类型的true和false。
网友评论