1.面向对象和面向过程的理解:
- 面向过程属于单个事情的操作,按照顺序一步一步的执行;
- 面向对象属于对复杂事情的处理,比如说造汽车,就需要面向对象的思路去思考,需要玻璃,轮胎...等部件,然后这些部件怎么制作出来,就需要面向过程一步一步去思考了;
- 面向对象和面向过程是相辅相成的!
2.对象演变过程的理解:
-数据无管理时代:比如只是做简单的加减乘除(或者是刚创业的公司,没有很明确的分工);
-数组管理和企业部门制:随着数据量的不断增多,会引起质变,比如我需要把某些参数放到一起,数组的概念随之出现;
-对象和企业项目制:这个可以理解为企业下有多个部门,分别做不同的业务,单独成立!
3.对象和类的理解:
对象是程序运行过程中通过类创建出来的;抽象类指的是把相同的,相似的属性或方法抽取出来,当做一个抽象类;
4.内存:
java虚拟机内存分为:栈(stack),堆(heap),方法区(method area),其实方法区也在堆里边
栈的特点如下:
- 栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量,操作数,方法出口等)
- JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数,局部变量等)
- 栈属于线程私有,不能实现线程间的共享!
- 栈的存储特性是“先进后出,后进先出”(比如方法的嵌套调用,A方法里边调用B方法,那么A就会先创建一个栈帧,分配内存,然后是B,执行的时候先执行B,回收B,再执行A,回收A)
- 栈是由系统自动分配,速度快!栈是一个连续的内存空间!
- 方法执行完之后会自动删除分配的栈帧!
堆的特点如下: - 堆用于存储创建好的对象和数组(数组也是对象);
- JVM只有一个堆,被所有的线程共享
- 堆是一个不连续的内存空间,分配灵活,速度慢!
方法区的特点如下: - JVM只有一个方法区,被所有线程共享!虚拟机启动时加载类信息!
- 方法区实际也是堆,只是用于存储类,常量相关的信息!
- 用来存储程序中永远不变或唯一的内容(类信息,class对象,静态变量,字符串常量等)
this关键字为何不能用于静态方法中:
拿图纸和汽车来说,你要造成汽车肯定需要图纸,但是你有图纸,却不一定会有汽车,图纸相当于是类信息,汽车就是对象
image.png
5.参数传值机制
java中,方法中所有的参数都是“值传递”,也就是"传递的是值的副本"。也就是说我们得到的是“原参数的复印件,而不是原件”。因此,复印件的改变不会影响原件。
基本数据类型参数的传值:
传递的是值的副本,副本改变不会影响原件
引用类型参数的传值:
传递的是值的副本,但是引用类型指的是“对象的地址”。因此,副本和原参数都指向了同一个“地址”,改变“副本指向地址对象的值,也意味着原参数指向对象的值也发生了改变”。
6.静态初始化块和构造方法
A继承B,A和B里边都有静态代码块和构造方法;代码在执行的时候,静态代码块和构造方法都会先执行父类里边的代码,最后再执行子类里边的代码;(追溯过程:子类--父类--object);注意,默认子类在创建构造方法时,都会默认实现父类的构造方法,super...这也解释了上述的原因;
7.向上转型和向下转型的理解
- 先拿多态来说,什么是多态,多态指的是多种形态,比如动物的叫声,可以有猫叫,狗叫,鸟叫;继承和接口的实现其实都是多态的实现;在实际业务场景里边,对于向上转型和向下转型的使用也是一致的,大概描述举例:有动物类Animal,Dog继承了Animal,重写了叫声,也有自己特有的方法行为,比如看门;Cat也继承了Animal,重写了叫声;那么狗和猫向上转型后都是Animal类型,Animal a = new Cat();Animal b = new Dog();,都有叫声的方法,调用叫声方法时候,其实还是各自叫声方法的调用;狗此时还调用不了看门的方法,因为父类里边没有该方法;如果想要调用的话,需要再向下转型 Dog d = (Dog)b;转换成子类再调用;需要注意一个特殊的场景,Dog d = (Dog)a;a此时也可以向下转型成Dog,编译期不会报错,jvm在运行期才会判断具体是哪个类型实现;如果此时d调用看门方法时候,就会报错,因为其实质类型是猫,猫并没有看门的方法,运行期会被识别出来;
8.数组
- 数组也是对象,里边的值可以看成对象的成员变量;
9.多继承
java中的类没有多继承,接口可以多继承;
public interface SingService extends DanceService,SleepService {
int NUM =1;
void sing();
}
public class Person implements SingService,DanceService,SleepService{
@Override
public void dance() {
System.out.println("我会唱歌!");
}
@Override
public void sing() {
int aa = SingService.NUM;
System.out.println("我会跳舞!");
}
@Override
public void sleep() {
System.out.println("睡觉!");
}
}
接口实现多继承和子类实现多个接口,效果是一样的,都要重写接口所有的方法,类的继承,如果不是抽象方法的时候,可以不用重写,但是接口的继承里边都是抽象方法,所以都需要重写!
接口里边各自定义的变量,因为是静态常量,所以可以直接调用;名称相同的情况下,接口.NUM获取
10.接口
接口中的方法默认都是抽象方法,里边的变量默认都是final修饰的;
public interface AA{
/** public static final**/int MAX_AGE = 9;
/** public abstract **/void aa();
}
11.匿名内部类的理解
匿名内部类,一般用于接口,但是没有具体的实现;所以不需要名字,只使用一次那种;直接在使用的时候重写方法就行;
public class Test{
public static void bb(AA a){
a.aa();
}
public static void main(String args[]){
Test.bb(new AA(){
@Override
public void aa(){
System.out.println("212111");
}
})
}
interface AA{
void aa();
}
}