1.类、对象、属性、方法
(1)类和对象:
*类是对一类事物的描述,是抽象的、概念上的定义
*对象是实际存在的该类事物的每个个体,因而也称为实例
*面向对象程序设计的重点是类的设计
*类的设计,其实就是类的成员的设计
(2)属性和方法:
*属 性:对应类中的成员变量
*行 为:对应类中的成员方法
2.方法的重载
*重载的概念:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
*重载的特点:与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
3.可变个数形参的方法
1. 声明格式:方法名(参数的类型名 ...参数名)
2. 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
3. 可变个数形参的方法与同名的方法之间,彼此构成重载
4. 可变参数方法的使用与方法参数部分使用数组是一致的
5. 方法的参数部分有可变形参,需要放在形参声明的最后
6. 在一个方法的形参位置,最多只能声明一个可变个数形参
4.形参和实参
*形参:方法声明时的参数
*实参:方法调用时实际传给形参的参数值
*基本数据类型实参赋给形参的是实参真是存储的数据值
*引用数据类型实参赋给形参的是实参存储数据的地址值
5.封装性
*高内聚 :类的内部数据操作细节自己完成,不允许外部干涉
低耦合 :仅对外暴露少量的方法用于使用
*封装性的设计思想:隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性
*Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节;
使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
便于修改,增强代码的可维护性;
6.四种权限修饰
*4种权限可以用来修饰类及类的内部结构:属性、方法、构造器、内部类
*对于class的权限修饰只可以用public和default(缺省)。
public类可以在任意地方被访问。
default类只可以被同一个包内部的类访问。
7.UML类图
8.this
(1)this调用属性和方法:
*它在方法内部使用,即这个方法所属对象的引用;
*它在构造器内部使用,表示该构造器正在初始化的对象。
(2)this调用构造器:
9.MVC设计模式
10.继承性
(1)继承性的理解:
*继承:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。
*类继承语法规则:class Subclass extends SuperClass{ }
*作用:
继承的出现减少了代码冗余,提高了代码的复用性。
继承的出现,更有利于功能的扩展。
继承的出现让类与类之间产生了关系,提供了多态的前提。
(2)继承性的使用:
*子类继承了父类,就继承了父类的方法和属性。
*在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。
*在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。
*所有的java类(除java.lang.Object类之外)都直接或间接的继承于java.lang.Object类
11.方法重写
*定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
*要求:
1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
2. 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
3. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限;子类不能重写父类中声明为private权限的方法
4. 子类方法抛出的异常不能大于父类被重写方法的异常
*注意:
子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。
12.super
(1)super调用属性和方法
*在Java类中使用super来调用父类中的指定操作:
super可用于访问父类中定义的属性
super可用于调用父类中定义的成员方法
super可用于在子类构造器中调用父类的构造器
*注意:
尤其当子父类出现同名成员时,可以用super表明调用的是父类中的成员
super的追溯不仅限于直接父类
super和this的用法相像,this代表本类对象的引用,super代表父类的内存空间的标识
(2)super调用构造器:
*子类中所有的构造器默认都会访问父类中空参数的构造器
*当父类中没有空参数的构造器时,子类的构造器必须通过this(参
数列表)或者super(参数列表)语句指定调用本类或者父类中相应的
构造器。同时,只能”二选一”,且必须放在构造器的首行
*如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错
13.多态性
*对象的多态性:父类的引用指向子类的对象
可以直接应用在抽象类和接口上
*Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简称:编译时,看左边;运行时,看右边。
*若编译时类型和运行时类型不一致,就出现了对象的多态性
*多态情况下:
“看左边”:看的是父类的引用(父类中不具备子类特有的方法)
“看右边”: 看的是子类的对象(实际运行的是子类重写父类的方法)
14.向下转型
*使用强转时,可能出现ClassCastException的异常(类型转换异常)
*a instanceof A:判断对象a是否是类A的实例,如果是,返回true,否则返回false
*为了避免在向下转型时出现ClassCastException异常,在向下转型之前,先进性instanceof的判断,返回true则向下转型,否则不向下转型
15.Object类
*Object类是所有Java类的根父类
*如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
*Object clone() 方法用于创建并返回一个对象的拷贝。clone 方法是浅拷贝,对象内属性引用的对象只会拷贝引用地址,而不会将引用的对象重新分配内存
*Object finalize() 方法用于实例被垃圾回收器回收的时触发的操作。当 GC (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法。
*Object getClass() 方法用于获取对象的运行时对象的类。
16.包装类
17.static
*static可以用来修饰属性、方法、代码块、内部类
(1)static修饰属性:
*使用static修饰属性:静态变量
使用static修饰的属性称为静态属性(静态变量/类变量),不使用static修饰的属性称为非静态属性(实例变量)
*static修饰属性的其他说明:
静态变量随着类的加载而加载
静态变量的加载早于对象的创建
由于类值加载一次,则静态变量在内存中也只存在一份:存在方法区的静态域中
(2)static修饰方法:
*使用static修饰方法:静态方法
随着类的加载而加载,通过类.静态方法的方式调用
静态方法中只能调用静态方法或属性
非静态方法中既可以调用静态方法或属性,也可以调用非静态方法或属性
静态方法内,不能使用this关键字、super关键字
18.设计模式与单例设计模式
*设计模式:设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。
*单例设计模式:采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。如果要让类在一个虚拟机中只能产生一个对象,首先必须将类的构造器的访问权限设置为private,这样,就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象。因为在类的外部开始还无法得到类的对象,只能调用该类的某个静态方法以返回类内部创建的对象,静态方法只能访问类中的静态成员变量,所以,指向类内部产生的该类对象的变量也必须定义成静态的。
*单例的饿汉式实现:
*单例的懒汉式实现
*饿汉式和懒汉式的对比
饿汉式坏处:对象加载时间过长
好处:线程安全
懒汉式坏处:线程不安全
好处:延迟对象的创建
*单例模式的使用场景:
19.内部类
*java中允许将一个类声明在另一个类中
*内部类的分类:成员内部类、局部内部类
*成员内部类:
*作为外部类的成员,可以调用外部类的结构,可以用static修饰,可以被四种权限修饰
*作为一个类,可以定义属性、方法、构造器等,可以用final、static、abstract修饰
*如何实例化成员内部类: