编译型语言:
需要编译,把源码编译成为机器语言的文件。运行时不需要重新翻译,直接使用编译的结果就行了。
解释型语言:
编译型语言域解释型语言更快:
就好比现场翻译比书面翻译更快。
解释器是儿子,编译器是女儿
(解释器是一条一条的解释执行源语言。比如php,postscritp,javascript就是典型的解释性语言。
编译器是把源代码整个编译成目标代码,执行时不在需要编译器,直接在支持目标代码的平台上运行,这样执行效率比解释执行快很多。比如C语言代码被编译成二进制代码(exe程序),在windows平台上执行。)
封装:
类、对象、方法、属性:
创建类(其中包含类的属性、方法)—实例化对象(实例化一个对象,输出属性值、调用对象的方法)
类:抽象概念(猫)
对象:类的具体体现(田园猫)
方法:能做什么(跑,叫)
属性:毛色,年龄,品种
(属性不加任何修饰符时默认伟default,即只能跟这个类在同一个包中的类来访问)
方法重载:
1、同一类中
2、相同方法名,不同参数列表(顺序,个数,类型)
3、不限制返回值和访问修饰符
4、只关注传入参数的类型,与属性名无关。
方法重载:
外壳不变,核心重写。
1、有继承关系的子类中
2、相同方法名,参数列表相同(参数类型、个数、顺序),返回值相同
3、访问修饰符
4、与方法传入的参数名无关
单一职责原则(单一功能原则):
面向对象的原则,一个类中有且只有一个功能。
一个类的承载功能越多,耦合性越高,复用性越低。
尽量把不同的职责放在不同的类中。
实例化对象的过程:Cat one = new Cat();
声明对象 Cat one (在栈中)
实例化对象 new Cat() (在堆中)
两个不同的内存区域如何关联:
= 用赋值符号 ,将声明的对象指向具体的实例化空间.
堆和栈的区别:
1、堆栈空间分配
栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
2、堆栈缓存方式
栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
3、效率比较
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
4、存储内容
栈: 在函数调用时,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向函数的返回地址,也就是主函数中的下一条指令的地址,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排
构造方法:
只能在对象实例化时使用
无返回值,构造方法名域类名相同,必须与NEW同时使用
没有显示定义构造方法的时候,系统对自动生成构造方法
(可在方法前加修饰符)
可有多个构造函数
默认构造方法的访问修饰符和类的访问修饰符相同(类为 public,构造函数也为 public;类改为 protected,构造函数也改为 protected)。
this关键字:
避免就近原则,指向当前对象
封装:
1、修改属性的可见性。(类内隐藏)
private限定只能在类内进行访问。
2、设置共有的get()、set()方法(完成对外的开放接口)
3、在get\set方法中添加对属性的限定。
static
有静态方法(类方法),静态属性(类属性)
静态属性的赋值:
对象名.属性名 或 类名.属性名
静态方法的调用:
对象名.方法名 或 类名.方法名
静态方法中不能访问非静态成员,只能访问静态成员(包括静态方法和静态属性)
如果要在静态方法中访问其他非静态属性和方法,可以通过实例化对象,然后用对象访问的方式。
静态方法中 不能使用this
static不能修饰普通类,但可以修饰内部类
父类static方法无法被子类重写。
内部类:将一个类定义在另一个给类里面或者方法里面,这样的类就被称为内部类
静态内部类对象的创建一般是外部类.内部类 类名 = new 外部类.内部类();
static不能修饰方法内的局部变量
而局部变量的作用域只能在他所属的{}之内。不可能是属于类或对象的。所以矛盾,故static不能修饰局部变量
代码块:(一个作用空间,代码块内的局部变量会在代码块结束后被回收)
普通代码块:
在方法中定义;可有多个;输出顺序和出现顺序一致;
public void run(){
{System.out.println(“我是普通代码块”)
}}
构造代码块:
在类中定义;对象创建被调用,调用在构造方法之前;可有多个;
静态代码块:
构造代码块前加static;可用多个;调用在构造代码块之前;
在实例化多个对象时:
静态代码块执行一次(类加载时执行一次),构造代码块执行多次(一次实例化执行一次)
构造代码块可以给成员属性赋值;静态代码块只能给静态属性赋值;如果需要给成员属性赋值,需要先实例化,再用对象进行赋值。
静态代码块>构造代码块>构造方法
继承:( A is a B)
访问修饰符:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zkwzP0FS-1631933541514)(C:\Users\zhangyn\AppData\Roaming\Typora\typora-user-images\image-20210707143210329.png)]
继承对象初始化过程:
父类静态成员–》父类静态代码块–》子类静态成员–》子类静态代码块(静态成员按出现顺序加载)
–》子类构造方法–》父类构造方法–》
父类属性–》父类构造代码块–》父类构造方法–》
子类属性–》子类构造代码块–》子类无参构造
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sDSC9YWr-1631933541518)(C:\Users\zhangyn\AppData\Roaming\Typora\typora-user-images\image-20210707165717709.png)]
父类静态成员—》子类静态成员—》父类对象构造—》子类对象构造
super
1、子类的构造过程中必须调用父类的构造方法。
2、子类若的构造方法中,没有显式指定调用父类的构造方法,则系统默认调用父类的无参构造方法。
3、如果子类的构造方法中,既没有显式调用父类的构造方法,父类又没有无参构造方法,编译器报错。
4、使用super调用父类的指定构造的方法,必须在子类构造方法的第一行。
this和super:
this:
1、访问当前类的成员方法 this.getName();
2、访问当前类的成员属性 this.name;
3、访问当前类的构造方法 this();
4、不能在静态方法中使用
super:
1、访问父类的成员方法 super.getName()
2、访问父类的成员属性super.name
3、访问父类的构造方法super()
4、不能在静态方法中使用
设计模式:
针对常见问题的效果较好的一般通用解决方式。
设计模式分类:
关注对象创建过程的模式:创建型模式
关注类和对象组合的模式:结构型模式
关注对象间的通信过程:行为型模式
单例模式:
要点:
1、类有且只有一个实例对象
2、类中必须自行创建实例
3、必须自行向整个系统提供这个实例
实现:
1、只提供私有构造方法(保证无法在类外实例化)
2、含有一个该类的静态私有对象(static)
3、提供一个静态的共有方法用于创建、获取静态私有对象
适用场景:
1、创建对象占用资源过多,但同时又需要用到该对象
2、对系统内资源要求统一读写 ,(如:读写配置信息)
3、多个实例存在时会引起程序错误(如:理财产品序列号)
多态:
分类:
编译时多态(设计时多态):方法重载
运行时多态
必要条件:
1、继承关系
2、父类引用指向子类对象
向上转型:
向下转型:
instanceof:
abstract:
abstract类:
父类要限制*子类必须要具有的能力*,不关心子类实现是可以建立抽象类。
不允许实例化;只能被继承;
可以通过引用指向子类实例
abstract方法:
抽象方法必须被子类重写,当子类没有重写父类抽象方法时,子类也必须是抽象类。
抽象方法创建时不允许有方法体。
包含抽象方法的类必须是抽象类;
抽象类中可以没有抽象方法。
- private,static,final 不能与abstract连用
JAVA的反射机制:
运行状态中对于任意的类都能知道它的属性和方法,对于任意一个对象,都能调用他的任意方法和属性。
反射机制的作用:
用来编写一些性能较高的代码、通用性很高的代码
反射常用对象:
Class:
Constructor:
Filed:
Method: