static:
static修饰的变量和方法是属于类的,且只有一份,虽然所有方法都是只有一份,不过变量不是啊。
静态方法和静态代码块里都不可以使用this、super
静态方法:
必须被实现;不能被重写(因为是属于类的,而不是对象)(可以被继承)
字父类中不可以存在:子父类有同命名方法,一个为静态一个为非静态。
静态方法只允许访问静态变量和静态方法
静态代码块中定义的变量是局部变量,只能访问静态成员(看一下我多态的那篇文章就很容易理解了)。
只执行一次,在创建对象之前执行,main函数之后。
JVM:
1.栈
程序执行的位置,每一个线程会拥有一个虚拟机栈,
方法对应栈中的栈帧,方法之间的调用也就是栈帧的存取关系。
默认分配内存1M,栈帧中存储的是方法中定义的值类型和引用类型,值类型对应的内存中放的它的值,引用类型对应的内存放的在堆内建的对象或数字的地址(引用类型指向对象和数组),所有的新建的对象和数组都在堆里放的。(方法区里也有对象)
2.堆:对象实例(所有新建的对象实例以及数组都要在堆上分配)
3.方法区
运行时常量池:常量,编译期生成的各种字符面量和符号引用,这部分内容将在类加载后存放在常量池中。
:存储已被虚拟机加载的类信息,字段信息,方法信息,静态变量,类classloader的引用,类Class的引用,即时编译器编译后的代码等数据。
在方法区中,每个类型都对应一个常量池,存放该类型所用到的所有常量。
这里暂且只认为 常量池 = final修饰的变量 + ""String的值。(”“String存在,是因为,String的构造函数,创建空String 的时候会用到)
4.本地方法栈为虚拟机使用到的native方法服务.
5.程序计数器:当前线程所执行字节码的行号指示器。
静态导入: import static 包.静态属性或静态方法
final修饰符:(不可以修饰抽象类和抽象成员方法)
final修饰类,该类不能被继承,没有子类。
final修饰方法,该方法不能被覆盖。
final修饰变量,该变量是常量(放在该类型的常量池中)(只能被显示赋值一次)
private类型的方法默认是final类型的,final不能修饰构造方法
final修饰的非静态成员变量必须要被赋值,并且只能在声明的同时赋值,匿名代码块内赋值,类的构造器内赋值
final修饰static静态的成员变量可以在声明的同时赋值,static代码块内赋值
final可以修饰任何变量、final修饰的变量必须赋初值、final修饰的变量被一次赋值之后不能更改
abstract修饰符。(抽象类)
abstract可以修饰类、方法,修饰类表示抽象类、修饰方法表示抽象方法且不能有方法体
interface,是抽象到机制的抽象类。接口内部不能有任何形式的代码块。
interface中的方法默认被public abstract修饰,变量被public static final 修饰,抽象方法和常量
接口支持多实现。。
接口相当于是一个标准吧,别人给你一套你可以用的东西,但是你前提要达到人家的要求才可以用。
什么时候用接口什么时候用抽象类
接口侧重于方法,如果抽象出来没有属性就用接口。
抽象类侧重于属性,抽象出来有属性就可以使用抽象类
在面向对象了理解抽象的时候:可以使用抽象类的地方就可以使用接口,使用接口的地方也可以使用抽象类。
面向接口编程:
优点:接口和实现分离了,适于团队的协作开发。主要为了实现松散耦合的系统,便于以后升级,扩展。
缺点: 设计难,在没有写实现的时候,就得想好接口,接口一变,全部乱套,这就是所谓的设计比实现难。
接口和抽象类对比
1. 相同点:
a. 都不能被实例化;
b. 都能包含抽象方法;
2. 不同点;
a. 抽象类中可以为部分方法提供默认的实现,从而避免子类中重复实现它们,提高代码的可重用性,而接口中只能包含抽象方法;
b. 一个类只能继承一个直接的父类,这个父类有可能是抽象类;但一个类可以实现多个接口,这是接口的优势所在。
内部类看另一个博客吧,很详细https://www.cnblogs.com/mcmx/p/11335291.html