封装:将数据封装在一起,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的get,set方法来访问该对象。
方法的重载(overload):方法名相同,参数列表不同可构成重载(参数列表不同指参数类型不同或参数个数不同)
方法的重写(方法的覆盖 override):若父类中的方法对子类来说不适用,子类可以对父类中的方法进行重写。
*方法重写的规则
前提:子类继承父类
1.方法名与参数列表必须相同
2.子类重写方法的访问控制修饰符不能小于父类被重写方法的访问控制修饰符
this关键字,使用在本类中,代表当前对象的引用,可以调用属性,方法,构造器。
super关键字,使用在子类中,代表父类对象的引用。使用方式和this一样。
构造器的作用:
1.创建(实例化)对象
2.为对象进行初始化
细节:1.构造器的名称必须与类名一致
2.若一个类中没有显示的提供任何构造器时,系统会默认的提供一个无参构造器
3.若一个类中显示的提供了任何构造器,系统默认无参构造器将不再提供
4.构造器只能调用一次,并且是在创建对象的时候调用。
5.构造器之间可以构成重载。
数组排序
导包 import java.util.Arrays;
Arrays.sort(数组名); 底层使用的快速排序
可变参数
例:public static void add(int... args){}
当调用这个方法时可以传0个或多个int类型的参数。可变参数底层为数组,参数列表中只能有一个可变参数,并且写在参数末尾。
继承:关键字:extends ---扩展,子类是父类的扩展
例如:class a extends b{}
子类:a 父类(超类,基类):b
*通过继承,子类可以继承父类中的所有属性和方法。(构造器除外)
*继承细节:1.不能为了简化代码,获取某功能而继承,若要继承两个类之间必须满足一定的所属关系。
2.JAVA只支持单继承(一个父类可以有多个子类,但一个子类只能有一个父类)。
3.JAVA支持多层继承。
*继承中构造器的特点
1.当子类继承父类后,子类所有构造器中,第一行第一句有一个隐式的super()
super()作用:调用父类的无参构造器
super()目的:当子类继承父类后,子类需要知道父类是如何为对象进行初始化的
2.若父类没有提供无参构造器,子类所有构造器中都需要显式调用父类的有参构造
多态:父类的引用指向子类的对象
*向上转型:子类转父类,系统自动完成
向下转型:父类转子类,需要使用强转符
例:Person p=new Man(); --多态,向上转型
Man man=(Man)p; --向下转型
本态:本类的引用指向本类的对象
例:Man man=new Man();
*java程序的运行分为2种状态:
在多态的情况下,编译时:看左边,看的是父类的引用(而父类中不具备子类特有的方法)
运行时:看右边,看的是子类的对象(实际运行的是子类重写父类的方法)
*属性不具有多态性
instanceof 运算符:例:p instanceof Man :判断p引用指向的对象,是不是man的父类子类类型。
Object类:java.lang.object类是所有类的父类,若一个类没有显式的继承任何类时,默认继承object类。因此object类中的内容是最具共性的。
*所有类从object类中继承的方法有:
*equals(object obj)方法:用于比较2个对象是否相等
1.在java.lang.object类中,是jdk默认的包,不需要导包
2.只能比较两个引用数据类型是否相等,不能比较基本数据类型
3.object类中的equals方法只能比较2个对象的地址值是否相等,通过查看源码就是用==完成的
4.若object类中的equals对我们不适用,可以对其进行重写,比如string类重写了equals方法,比较的是2个字符串的内容是否相等
*==运算符:
1.用于比较2个基本数据类型的值是否相等
2.比较2个引用数据类型的地址值是否相等
static关键字:代表静态的,可用于修饰属性,方法,代码块,内部类
1. static修饰的属性(静态变量或类变量)
*随着类的加载而加载,随着类的消失而消失,(生命周期最长)
*static修饰的属性被该类的所有对象所共享(static修饰的属性会加载到方法区)
*一旦某一个对象修改了该属性值,其他对象的该属性值也会随之改变
*静态变量的存在是优先于对象的(随着类的加载而加载)
*可以通过类名.类变量的方式使用
扩展*静态变量与实例变量的区别:
1.生命周期不同(静态变量是随着类的加载而加载,实例变量是对象实例化创建的)
2.内存中的位置不同(jdk1.8之后静态变量也被分配到了堆中,但功能,作用没变)
2. static修饰的方法(静态方法或类变量)
*随着类的加载而加载,随着类的消失而消失,(生命周期最长)
*静态方法的存在是优先于对象的(随着类的加载而加载)
*可以通过类名.类变量的方式调用
*静态方法中不能使用非静态成员,非静态方法中可以使用静态成员
*静态方法中不能使用this和super
非静态代码块(初始化块):
格式:类中的一对{}
1.在每次创建对象时执行
2.非静态代码块的执行优先于构造器
3.用于对对象进行初始化的(通常为多个构造器中的共性内容进行初始化)
静态代码块 ---随着类的加载而加载,并且只加载一次
格式:static{}
*静态代码块的执行优先于构造器,不能使用this和super
*单例设计模式---饿汉式*
类中只允许有一个实例,不允许创建实例对象,要使外部不能实例化对象,需要将默认的无参构造器私有化,在类的内部实例化一个对象,然后提供一个公共的get方法用于访问,由于普通的方法需要实例化对象后才能调用,所以需要变成静态方法,随着类的加载而加载,通过类名.方法名的方法调用。
例子:
*单例设计模式---懒汉式*
懒汉式存在多线程安全问题(解决方法见多线程篇章)
饿汉式是先上来直接创建对象
懒汉式是对象什么时候用什么时候在创建
示例:
final关键字:代表最终的,可用于修饰变量,方法,类
1. final修饰的类不能被继承
2. final修饰的方法不能被重写
3. final修饰的变量叫常量,一旦被赋值不能改变
抽象类:JAVA中允许父类中只提供一个方法的声明,不提供具体的实现(没有方法体)具体的实现交给子类完成,该方法称为抽象方法,拥有一个或多个抽象方法的类称为抽象类。
1.使用abstract修饰的类称为抽象类
格式:访问修饰符 abstract class 类名{}
2.使用abstract修饰的方法称为抽象方法
格式:访问修饰符 abstract 返回值类型 方法名 (参数列表); ---没有方法体
*抽象类不能创建实例
abstract不能和final关键字同时使用,也不能和static以及private同时使用。
模板方法设计模式:一部分功能是确定的,一部分功能是不确定的,吧不确定的那部分暴露出去,交给子类去重写完成,提供具体的实现。
接口:可以定义多个不相关事物的相同功能,接口可以多实现,解决了JAVA中单继承的局限性。
关键字:interface
*1.可以吧接口理解为特殊的抽象类,接口中只能有全局静态常量和抽象方法
2.接口中不能有变量,代码块,构造器
3.接口不能创建实例,就是用来被实现的。
4. jdk1.8接口中可以声明默认方法(default修饰)和静态方法。
*若一个接口定义了默认方法,而另一个父类中声明了一个同名的方法时,采用类优先原则。
*若某个类同时实现了2个接口,并且2接口中有相同的默认方法时,实现类必须选择一个实现,语法为:接口名.super.默认方法
软件开发3阶段:
1.业务需求功能代码编写阶段
2.设计模式针对代码优化(低耦合,高内聚)
3.数据结构和算法针对性能优化
成员内部类:
1.是类的成员之一。类的成员有(属性,方法,构造器,代码块,内部类)
2.成员内部类,可以使用4中访问控制修饰符
3.可以使用static,final修饰
4.与外部类有相同的特性。
//创建静态内部类对象
new外部类名.内部类名();
//创建非静态内部类对象
1.先创建外部类对象
2.外部类实例对象.new内部类名();
局部内部类:在方法中声名的类
匿名内部类