面试2——java基础2

时间:2022-09-12 16:30:31

11、MVC设计模型

mvc设计模型是一种使用model-view-controller(模型-视图-控制器)设计创建web应用程序的模式。是一种开发模式,好处是可以将界面和业务逻辑分离。

model:是程序的主体,主要包含业务数据和业务逻辑。是应用程序中处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

view:视图层,就是UI界面,用于跟用户进行交互。一般所有的JSP、Html等页面就是View层。是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的

controller:是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据


12.什么是反射

在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意方法和属性。

class Test{
public void f(){
System.out.println("base");
}
}
class Sub extends Test{
public void f(){
System.out.println("sub");
}
}
public class Test2{
public static void main(String[] args) {
try {
        //其中一种获得类的方法。
Class c = Class.forName("Sub");
Sub v = (Sub) c.newInstance();
v.f();
}catch (Exception e){
e.printStackTrace();
}
}
}

反射能做什么?

在运行时判断任意一个对象所属的类

在运行时构造任意一个类的对象

在运行时判断任意一个类所具有的成员变量和方法。

在运行时调用任意一个对象的方法

生成动态代理

反射机制获取类的三种方法:

//第一种方式:
Classc1 = Class.forName("Employee");
//第二种方式:
//java中每个类型都有class 属性.
Classc2 = Employee.class; //第三种方式:
//java语言中任何一个java对象都有getClass 方法
Employeee = new Employee();
Class c3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
// 创建对象:获取类以后我们来创建它的对象,利用newInstance Class c =Class.forName("Employee"); //创建此Class 对象所表示的类的一个新实例
Object o = c.newInstance(); //调用了Employee的无参数构造方法.

13.java中的内部类和外部类

外部类:包含内部类的类称为外部类,外部类的修饰符只能是public,abstract,final。

内部类:内部类主要包括静态内部类,成员内部类,局部内部类和匿名内部类。内部类可以是静态static的,也可用public,default,protected和private修饰

静态内部类就是被声明为static的内部类,它可以不依赖于外部类实例而被实例化,静态内部类不能与外部类具有相同的名称,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法。 

public class Test1 {
static double a = 1.333d;
int b;
static class Test{// 静态内部类
public static void main(String args[]){
System.out.println(a);
System.out.println(b); //访问外部非静态成员变量报错
}
}
}

成员内部类:即普通内部类,静态内部类去掉static关键字就是成员内部类,它可以*的访问外部类的所有成员变量和方法(静态,非静态都可),只有外部类被实例化之后,这个类才能被实例化,需要注意的一点就是:非静态内部类中,不能有静态成员变量和静态方法。

public class Test1 {
static double a = 1.333d;
int b = 3;
public class Test2{//成员内部类
// static int aa;//成员内部类不能声明静态成员变量和静态方法。
public void sum(){
System.out.println(a+b);
}
}
public static void main(String[] args) {
Test1 test1 = new Test1();
test1.new Test2().sum(); //外部类调用成员内部类中的方法。
}
}

局部内部类:指定义在一个方法代码块中的类,作用范围仅是所在的代码块,是内部类中最少使用的一种类型。局部内部类像局部变量一样,不能被public,protected,private以及static修饰,只能访问方法中定义为final类型的局部变量

public class Test1 {
static double a = 1.333d;
int b = 3;
private String out = "this in outer"; public static void main(String[] args) {
Test1 test1 = new Test1();
// test1.new Test2().sum(); //外部类调用成员内部类中的方法。
//test1.Test3();
test1.Test3();
} public void Test3(){
final int c = 12;
final double d = 33.333d;
class innerclass{
private String out = "this is inner";
public void method(){
System.out.println(d+c);//内部类访问外部方法的变量,需要有final进行修饰。
System.out.println(a);
System.out.println(out);//局部内部类可以直接访问外部类的变量,即使是私有的
System.out.println(Test1.this.out);//访问外部类中相同名称的变量
}
}
innerclass innerclass = new innerclass();//在代码块中对局部内部类进行实例化。
innerclass.method();
}
}

匿名内部类:是一种没有类名的内部类,不使用关键字class,extends,implements,没有构造函数,他必须继承其他类或者其他接口,

  • 匿名内部类不能有构造函数
  • 匿名内部类不能定义静态成员/方法和类
  • 匿名内部类不能是public,protected,privated,static
  • 只能创建匿名内部类的一个实例
  • 一个匿名内部类一定是在new的后面,这个匿名类必须继承一个父类或实现一个接口
  • 因匿名内部类属局部内部类,所有局部内部类的所有限制都对其生效。
public class OuterClass {
public InnerClass getInnerClass(final int num,String str2){
return new InnerClass(){
int number = num + 3;
public int getNumber(){
return number;
}
}; /* 注意:分号不能省 */
}
public static void main(String[] args) {
OuterClass out = new OuterClass();
InnerClass inner = out.getInnerClass(2, "chenssy");
System.out.println(inner.getNumber());
}
}
interface InnerClass {
int getNumber();
}

14. 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

定义一个基本的数据类型,一个对象的引用,函数调用的现场保存都使用内存中的栈空间;而通过关键字new和构造器创建的对象放在堆里;程序中的字变量(literal)如直接书写的100,hello和常量都是放在静态区中。

String str = new String("hello")  str存放在栈上,用new创建出来的字符串对象放在堆上,而“hello”这个字面量放在静态区


15. 获取数组的长度的方法为数组名.length;获取字符串的长度为length();二者不能混淆。


16. String、StringBuffer和StringBulider的区别?

它们都是final类,都不允许继承

public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence public final class StringBuffer
extends Object
implements Serializable, CharSequence public final class StringBuilder
extends Object
implements Serializable, CharSequence

String长度不可以变,StringBuffer、StringBuilder长度可变

String长度不可变的原理(

 private final char value[];
//用final修饰的对象值可变,但是引用不变,即:value指向不可变,但是value[]数组的值可变,但因为有private关键字对其进行封装达到value[]数组值也不可变的目的

),StringBuffer和StringBulider是长度可变的。

StringBuffer是线程安全的,

StringBuilder不是线程安全的,StringBuffer在StringBuilder的方法之上添加了synchronized修饰,保证线程安全。

StringBuilder拥有更好的性能

如果一个String类型的字符串,在编译时就可以确定一个字符串常量。此时,String的性能比StringBuilder更好


17. Java内存分配位置

a:基础数据类型直接在栈空间分配。

b:方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收。

c:引用数据类型,需要new来创建的,现在栈空间分配一个地址空间,实际的类变量的值放在堆空间中。

d:方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收。

e:局部变量new出来时,在栈空间和堆空间中都分配空间,当局部变量生命周期结束后,栈空间立即被回收,堆空间区域等待GC回收。

f:方法调用时传入的实际参数,先在栈空间分配,在方法调用完成后从栈空间释放。

g:字符串常量在DATA区域分配,this在堆空间分配。

h:创建的数组在栈空间分配数组名称,在堆空间分配数组实际的大小。

类中的成员变量,存放在堆区;方法中的局部变量,存放在栈区


18:static关键字的用法:

“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”————《Java编程思想》

1) static方法

用static进行修饰方法的方法一般称为静态方法,静态方法不依赖任何对象就可以进行访问。在静态方法中不可以访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。但是要注意的是在非静态成员方法中是可以访问静态成员方法/变量的。

public class T1 {
static int aaa = 111;
int b = 19;
public static void name1() {
System.out.println("这是一个静态方法");
System.out.println(aaa);
//System.out.println(b);//报错,不能访问非静态变量
}
public void name() {
System.out.println("这不是一个静态方法");
System.out.println(b);
System.out.println(aaa);
//T1.name1();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//T1.name1();//直接可以通过类名.方法名访问
//int a = 10;
T1 t1 = new T1();
//t1.name(a);
t1.name();//访问非静态方法必须通过实例化对象,进行访问。
}
}

2)static变量

static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。static成员变量的初始化顺序按照定义的顺序进行初始化。

3)static代码块

static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。


19.Java执行顺序

public class Parent {
static int t = parentstaticmethod();//父类静态成员变量
{
System.out.println("父类非静态方法代码块");
}
static{
System.out.println("父类静态方法代码块");
}
public Parent(){
System.out.println("父类构造方法");
}
public static int parentstaticmethod(){
System.out.println("父类静态方法");
return 19;
}
public static void main(String[] args) {
Child child = new Child();
}
}
class Child extends Parent{
{
System.out.println("子类非静态方法代码块");
}
static{
System.out.println("子类静态方法代码块");
}
public Child(){
System.out.println("子类构造方法");
}
public static int childstaticmethod(){
System.out.println("子类静态方法");
return 19;
}
}

结果

父类静态方法
父类静态方法代码块
子类静态方法代码块
父类非静态方法代码块
父类构造方法
子类非静态方法代码块
子类构造方法

20.序列化和反序列化

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

序列化:把java对象转换为字节序列的过程

反序列化:把字节序列恢复为java对象的过程

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.MessageFormat; public class TestObjSerializeAndDeserialize {
static String pathname = "d:/Person.txt";
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
SerializePerson();
Person person =deSerializePerson();
String pattern ="name={0},age={1},sex={2}";
Object[] arguments = {person.getName(),person.getAge(),person.getSex()};
System.out.println(MessageFormat.format(pattern, arguments)); }
private static void SerializePerson() throws FileNotFoundException,IOException{
Person person = new Person();
person.setAge(25);
person.setName("nana");
person.setSex("女");
ObjectOutputStream oo = new ObjectOutputStream
(new FileOutputStream(new File(pathname)));
oo.writeObject(person);
System.out.println("对象序列化成功!");
oo.close();
}
public static Person deSerializePerson() throws Exception,IOException{
ObjectInputStream oiStream = new ObjectInputStream
(new FileInputStream(new File(pathname)));
Person person = (Person) oiStream.readObject();
System.out.println("反序列号成功");
return person;
}
}

面试2——java基础2的更多相关文章

  1. 一份最贴近真实面试的Java基础面试题

    这是一份Java基础知识的面试题.在网上的关于Java的面试题数不胜数,但认真看过感觉大多数都没有实用性,有很多是面试官根本就不会问到的,那些已经脱离了实际开发的技术问题.而这份资料来源自一份个人觉得 ...

  2. 【Java面试】java基础篇

    总结个人的面试经历以及一些网上的的面试题,以供以后面试与巩固java基础. 1.String.StringBuilder和StringBuffer的区别 String用于存储不可变字符串的类,Stri ...

  3. 【JavaEE】企业面试问题-Java基础

    1. Java基础部分   1.1 Java中的方法覆盖(Overwrite)和方法重载(Overloading)是什么意思? 重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的 ...

  4. Java面试17&vert;Java基础

    Linux上配置Java基础环境: https://www.cnblogs.com/kerrycode/archive/2015/08/27/4762921.html 1.final相关 (1)fin ...

  5. Java面试系列--java基础

    Java基础总结 JAVA中的几种基本数据类型是什么,各自占用多少字节. 八大基本数据类型,byte:8位,short:16位,int:32位,long:64位,float:32位,double:64 ...

  6. &lbrack;Java面试二&rsqb;Java基础知识精华部分&period;

    一:java概述(快速浏览): 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒.PDA等的微处理器: 1994年将Oak语言更名 ...

  7. Java面试之Java基础问题答案口述整理

    Java面试之基础问题答案口述整理 面向对象的理解 面向对象思想就是在计算机程序设计过程中,把具体事物的属性特性和行为特征抽象出来,描述成计算机事件的设计思想.它区别于面向过程的思想,强调的是通过调用 ...

  8. 面试2——java基础1

    1.int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象 ...

  9. 【面试】-Java基础知识

    1.Java的工作原理 1) Java源程序(.java)须要通过编译器编译成字节码(.class)文件; 2) Java程序的跨平台主要指字节码能够在不论什么具有Java虚拟机的设备上运行: 3) ...

随机推荐

  1. LINUX 根目录说明

    linux目录:/bin      bin是Binary的缩写.这个目录存放着最经常使用的命令./boot 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件./data / ...

  2. javascript中关于深复制与浅复制的问题

    在javascript中,变量的类型分为基本类型和引用类型. 对于基本类型的变量来说,值的复制以及作为函数参数实参传递的过程都是值的复制传递,换句话说,是会在内存中开辟出一个新空间用于存放新的值的.这 ...

  3. Project Serve 2013部署方法

    在线版Project2013部署手册 服务器环境要求 系统:windows server 2008r2.windows server2012x64 Sharepoint 2013 内存至少16GB,最 ...

  4. IIS 处理请求 原理

    有时候我们会发现当我们访问一个IIS网站时,使用网址可以正常访问,但是使用IP却不行,这是什么原因呢? 原来IIS可以使用一个IP地址和端口绑定多个网站,这些网站的IP地址与端口都一样,因此在客户端或 ...

  5. CSS 垂直居中的5种实现方法

    利用 CSS 来实现对象的垂直居中有许多不同的方法,比较难的是选择那个正确的方法.我下面说明一下我看到的好的方法和怎么来创建一个好的居中网站.         使用 CSS 实现垂直居中并不容易.有些 ...

  6. windows server 2012显示桌面图标

    windows server 2012安装后是没有桌面图标的,可以通过下面方式显示出来: 打开powershell rundll32.exe shell32.dll,Control_RunDLL de ...

  7. Online Procurement Auctions for Resource Pooling in Client-Assisted Cloud Storage Systems---INFOCOM 2015

    [标题] [作者] [来源] [对本文评价] [why] 存在的问题 [how] [不足] assumption future work [相关方法或论文] [重点提示] [其它]

  8. python 实现注册程序

    本文介绍用python实现一个模拟注册的程序,详细需求如下: # 写一个注册的程序,输入username,密码,密码确认,输入的账号和密码不能为空,两次输入密码必须一致,用户名不能重复,错误次数4次# ...

  9. iOS SDWebImage知识点

    1.clear 和 clean clear 先把之前的缓存文件夹删除掉,然后新建一个文件夹 clean 先删除过期的文件,然后计算剩余缓存文件的大小 currentSize > maxSize, ...

  10. Log4j 2X 日志文件路径问题

    关于路径问题网上说啥的都有,但是也不能说人家错,只能说不适合你这个. 一开始,我用的   ${webapp.root} <RollingFile name="rollingFileSy ...