Java面试系列05(static、JVM内存模、final、abstract、interface)

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

原文地址:https://www.cnblogs.com/mcmx/p/11341046.html