基础知识
1、面向对象三大特点:封装、继承、多态。
2、Java规范:包==文件夹,所有单词字母均小写,规则:<域名反转>.<团队名>.<项目名>。同一个包下,不能建同类名的文件;不同包可以建通类名文件。com.youceedu.wms.order
3、类:所有单词首字母大写。TestYouceedu
4、方法:第一个单词首字母小写,之后每个单词首字母大写。getInfo()
5、属性:第一个单词首字母小写,之后每个单词首字母大写。int testType
6、常量:所有单词的字母都大写。final float PI = (float)3.1415926
7、工程名,一个工程就是一个项目,命名:英文字母纯小写
8、类的定义:
class 类名称{
数据类型属性;
public 返回值数据类型 方法名称(参数类型 参数1,参数类型 参数2){
代码语句;
return 表达式;
}
}
9、对象的创建和使用
类名 对象名称 = new 类名();----->创建并实例化对象
对象名称.类中的属性 对象名称.类中的方法() -------->类中属性和方法的调用
封装 private
1、封装用private,属性封装后要想调用需要使用 set/get方法;构造方法。
2、构造方法特性:
构造方法名称必须和类名称一致;
构造方法的声明处不能有任何返回值类型的声明;
构造方法不能有return返回值,本身构造方法就是为了调用私有属性,赋值用的,所以不能有return返回值;
类中有了构造方法后,程序编译的时候就不再自动生成默认构造方法(无参构造方法)了,即一个类中至少有一个构造方法;
构造方法的参数类型或者参数个数互不相同;
构造方法重载:构造方法实例化时需要满足其中一个构造方法
构造方法重载:无返回值,方法名相同,入参类型及个数不能相同
普通方法重载:不关注是否有返回值,方法名相同,入参类型及个数不能相同
3、构造方法私有化解决方法。(单例模式==不管有多少个对象,实际上只有一个实例。)
(构造方法私有化适用于有参的构造方法吗???)
3.1 在类内部先实例化一个对象
3.2 在类内部增加一个public方法做桥梁,增加setter/getter方法。
4、static 关键字
static声明属性----->全局属性,又叫静态属性,存放在全局数据区;
static声明方法----->类方法,可以由类名直接调用,格式:类名.方法名。
非static声明的方法,叫普通方法。调用方法是先实例化对象,通过对象调用。同 基础知识 内的9。
5、java程序运行过程:.java文件通过编译器编译字节码文件,呈现.class文件,.class文件再通过类加载器把文件放到JVM(堆内存、栈内存、全局数据区、全局代码区)。
6、JVM
堆内存:保存每个对象的具体属性内容和new的数据;
栈内存:保存所有对象名称(即堆内存空间的引用址);
全局数据区:JVM在加载class文件时,若发现有static定义的属性,会直接存放到全局数据区,即jvm静态分配;以及保存定义的常量。多个对象共享1个全局数据区域,节省堆内存。
全局代码区:JVM加载class文件时,将构造方法、普通方法、类方法都存入全局代码区,即jvm静态分配;以及保存所有方法的二进制代码,多个对象共享一个代码空间区域。
总结:堆内存和栈内存的分配是程序运行中动态分配的,全局数据区和全局代码区是静态分配的。
7、面试题 两行代码区别
private string type = "学生";
private static string type = "学生";
7.1、普通属性和全局属性;
7.2、普通属性随着实例化每实例化一次就在堆中生成一次,全局属性存放在全局数据区,可以让多个对象共用这一个属性,节省堆内存空间;
8、static方法不能调用普通方法,但是普通方法可以调用static方法。
第一个原因是 static方法(类方法)可以直接通过类名.类方法名调用,调用时,如果static方法内有普通方法,就跳过了普通方法实例化对象的过程。即堆内存没有赋值,没有堆内存空间,所以会报错。第二个普通方法可以调用static方法是因为static方法存放在全局代码区。
构造方法和普通方法调用只能通过类实例化对象,然后通过对象调用。方法是:类名 实例化对象名 = new 类名()
9、一个类中尽量不要同时有类方法和普通方法。特别是尽量少有类方法,static
10、匿名对象
没有给出明确的对象,一般只使用一次;
匿名对象只在堆内存开辟空间,不存在栈内存的引用。eg:new Person("youceedu",10)
11、this关键字
11.1 表示本类中的属性;
11.2 可以使用this调用本类中的构造方法;
11.3 this调用构造方法时必须放到构造方法的首行,因为构造方法在实例化对象时被自动调用,即构造方法优先调用;
11.4this调用构造方法时,一定要留一个构造方法作为出口,即程序中至少存在一个构造方法是不使用this调用其他构造方法的。
12、内部类
内部类可以访问外部类中的私有属性;
static内部类不能访问外部类中非static属性和方法;
调用内部类方法:外部类.内部类 内部类对象 = 外部类实例.new 内部类(); ====>内部类对象.内部类方法名()。其中外部类实例来源=====外部类 外部类实例 = new 外部类名()。
13、代码块
主类:静态代码块优先于主方法;
普通类:静态代码块 > 构造块({……}) > 构造方法块 > 普通方法块
静态代码块不管实例几次,只执行一次,构造块实例n次,执行n次。
继承 extends
1、子类可以继承父类非封装private的属性和方法;子类可以定义自己的属性和方法;子类只允许多层继承,不能同时继承多个父类。
2、子类实例化过程
子类实例化之前先调用父类中的构造方法(对父类中的属性初始化);
再调用子类自己的构造方法;
剩下的父类和子类的普通方法,由子类实例对象决定调用哪个。
3、子类覆写 @override
子类覆写父类方法。当父类方法代码不适合子类使用时,子类通过在自己内部定义和父类同名的方法重新实现方法的过程。注意子类覆写的方法不能拥有比父类方法更严格的访问权限。当方法被覆写后,子类对象调用的方法是覆写后的方法。
子类覆写父类的属性。===子类不能覆写父类属性,父类属性都是被封装的。
4、super关键字可以从子类中调用父类中的构造方法、普通方法和属性。调用过程中只能调用父类非封装的方法和属性。super调用父类中指定的构造方法是,必须放在子类构造方法的首行。
5、this和super的区别
从属性访问上看,this访问本类中的属性,本类中没有此属性,则从父类中查找;super直接访问父类中的属性;
从方法调用上看,this访问本类中的方法,本类中没有此方法,则从父类中查找;super直接访问父类中的方法;
从构造方法中使用中看,this调用本类构造方法,必须放在构造方法的首行;super调用父类构造方法,必须放在子类构造方法的首行。super和this调用构造方法时,不能同时出现在一个构造方法内。
6、重载和覆写的区别
重载:Overload;覆写:override
重载类中方法名称相同,参数类型或者个数不同,对权限没要求;覆写子类和父类方法名称、参数类型、返回值类型全部相同,并且子类中覆写的方法不能拥有比父类更严格的权限。
重载发生在一个类中;覆写发生在继承类中。
7、抽象类 abstract,包含一个抽象方法的类必须是抽象类。
抽象类方法只需要声明,不需要实现(声明不能用private,否则子类不能实现);
抽象类至少有一个抽象方法,可以有普通方法;
抽象类可以有抽象类的构造方法;
抽象类必须被子类继承,子类必须重写抽象类中的全部抽象方法;
抽象类专门当作父类,作用类似“模版”;
子类调用方法时都是调用的覆写后的方法。
8、子类覆写父类的方法是override,子类重写抽象父类的抽象方法是implement实现
9、子类构造方法实例化前需要先调父类构造方法,父类构造方法需要传参,需要在子类中加参数通过super方法调用父类构造方法。
10、接口
接口是Java中一种特殊的类,由全局常量和公共抽象方法组成。
接口只能继承接口,类只能实现接口。
11、接口继承多个接口
接口可以一次继承多个接口,但类一次只能继承一个父类;
一个子类可以同时实现多个接口,子类要覆写接口内的所有抽象方法;
一个子类可以同时实现多个接口,摆脱java单继承局限。接口和抽象类优先使用接口。
12、子类继承普通类/抽象类 并实现接口
class 子类名称 extends普通类/抽象类 implements 接口A,接口B{
}
13、抽象类实现接口 / 普通类实现接口
凡是类都是实现接口,类和类之间是继承关系。
抽象类可以实现接口,但接口不允许继承抽象类(抽象类内可能存在普通方法,继承抽象类后不符合接口规范),允许一个接口继承多个接口。
14、抽象类和接口的区别
抽象类是包含一个抽象方法的类,接口是抽象方法和全局常量的集合;
抽象类由构造方法、抽象方法、普通方法、常量、变量组成,接口由抽象方法和全局常量组成;
子类继承抽象类,子类实现接口;
抽象类可以实现多个接口,借口不嫩继承抽象类,但是允许继承多个接口;
抽象类有单继承的局限,接口没有此局限;
如果抽象类和接口都可以使用,则优先使用接口,避免单继承局限。
抽象类和接口都是通过对象的多态性产生实例化对象。
多态
1、多态的表现形式:方法的重载和覆写;对象的多态性。
2、对象的多态性
向上转型和向下转型。
3、向上转型:父类 父类对象名称 = new 子类名();
3.1 可以对抽象类进行实例化(好处==?)
实例对象调用的抽象方法是被子类覆写过的方法,同时不是抽象类下的抽象方法不能调用,即不能调用子类的方法。
3.2 可以对接口进行实例化(好处==?)
实例对象调用的抽象方法是被子类覆写过的方法,同时不是抽象类下的抽象方法不能调用,即不能调用子类的方法。
3.3 代码扩展方便,且耦合度低(代码量变小了)
类B和类C同时继承了类A,B类和C类都对类A中同一个方法进行了覆写,在类B和类C中都有调类A中被覆写的方法的场景,你可以写两个相同的方法分别进行调A中的方法(方法的重载),为了减少代码你也可以利用向上转型,直接写一个方法,实例化A类的对象,执行A类中被覆写的方法,B转的就调B中覆写的方法,C转的就调C中覆写的方法。
总之:对象向上转型后,对象调用的方法一定是被子类覆写过的方法或者自身的方法。
4、向下转型
A a = new B();
B b = (B)a