Java笔试问题回顾

equals和==

==”是一个运算符。equals则是string对象的方法,可以.(点)出来。
==和equals比较两种:
1、基本数据类型比较,==和equals都比较两个值是否相等。相等为true,否则为false2、引用对象比较==和equals都是比较栈内存中的地址是否相等。相等为true否则为false

1、equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。String的equals()方法是进行内容比较(因为被重写了),而不是引用比较。;
2、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。
所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;
3、基本数据类型比较(string除外) == 和equals两者都是比较值。
4、对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。
5、 如果是基本类型比较,那么只能用 == 来比较,不能用equals,否则报错,编译不能通过equals方法。
6. 对于基本类型的包装类型,比如Boolean、Character、Byte、Shot、Integer、Long、Float、Double等的引用变量,==是比较地址的,而equals是比较内容的。

String s1,s2,s3 = "abc", s4 ="abc" ;
s1 = new String("abc");
s2 = new String("abc");
s1==s2 是 false      //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,故不相等。
s1.equals(s2)true     //两个变量的所包含的内容是abc,故相等。
//s3和s4是字符串常量所生成的变量,存放的内存地址是相等的,所以s3==s4是true


StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2) //是false
//StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类
//Object类中的equals方法是用来比较“地址”的,所以等于false.

对象识别

对于Java而言,要识别两个对象是否为同一个对象有两种方式:
一是根据内存地址识别(“==”号 识别)。
二是根据equals() 、hasCode()方法识别(默认比较内存地址)。

RTTI(Run-Time Type Information)运行时类型识别

通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。【在运行时,识别一个对象的类型
RTTI可以在有一个指向基类对象的引用时,让你找出这个对象的确切类型。
程序运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型识别。对象信息记录了每个对象所属的类,用来保存这些信息的类是Class类。
每个类都有一个Class对象,也就是说每当编译了一个新类时就会产生一个Class对象(被保存在同名的.class文件中),在运行时,如果需要生成这个类的对象时候(注意是需要),Java虚拟机(JVM)就会根据类名查找.class文件并将其载入,所以Java程序并不是一开始执行就被完全加载的。
一旦某个类的Class对象被载入内存,它就被用来创建这个类的所有对象。
类加载器
生成类的对象,需要用到JVM的“类加载器”子系统。java并非在运行之前就加载所有类的对象。他是动态加载的。当需要使用这个类:
1、类加载器首先 检查该类是Class对象是否被加载;
2、未加载,则默认的类加载器,会根据类名查找对应的.class文件,并加载。

Static 修饰

(1). Static 修饰定义一个类成员使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例
(2). 在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。可以将方法和变量都声明为static。
(3). static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static

有static关键字的变量或方法在类加载的时候就会加载到内存,是不需要创建对象调用的,想要调用它只需要通过 类名.** 就可以调用。

classpath和path

classpath属于java语言中的环境变量,是给classLoader类加载器指路的,不属于操作系统的,path环境变量是属于操作系统。

path是用来设置操作系统中软件的安装路径(例如JDK),设置了安装路径后,就不用把运行java程序的全路径写出来,直接可以在你的Java程序的工作空间输入cmd回车,javac编译,java运行

args[]

public class Demo{
  public static void main(String [] args){
    for(int i=0;i<args.length;i++)
    System.out.println(args[i]);
  }
}
编译:
  javac Test.java
运行:
  java Test a b
得到的结果是
  a
  b

args存的就是用命令行javac编译后java运行java程序时,传入的参数
注意运行时命令行为java Test a b,Test是javac编译后的字节码文件.class文件,后面的参数是a、b,分别存入args[0]、args[1]。

抽象类和抽象方法

(1)一个抽象类中可以有一个或多个抽象方法,也可以没有任何抽象方法;
(2)包含抽象方法的类必须声明成abstract,抽象类中的方法不一定是抽象的;
(3)抽象方法只需声明,而不需实现,抽象方法由抽象类的子类去具体实现;
(4)由于抽象方法是留给子类去实现的,构造方法或静态方法显然没有这方面的应用需要,所以不能有抽象构造方法或抽象静态方法。
(5)抽象类的子类必须实现所有的抽象方法才能被实例化,否则,即使这个子类实现了抽象父类中的部分抽象方法,子类也必须定义为抽象类。

abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

1 abstract是抽象的,指的是方法只有声明而没有实现,他的实现要放入声明该类的子类中实现。
2 static是静态的,是一种属于类而不属于对象的方法或者属性
3 synchronized 是同步,是一种相对线程的锁。
4 native 本地方法,这种方法和抽象方法及其类似,它也只有方法声明,没有方法实现,但是它 与抽象方法不同的是,它把具体实现移交给了本地系统的函数库,而没有通过虚拟机,可以说是Java与其它语言通讯的一种机制
5 关键字为什么不能和abstract混用。首先abstract与static,声明static说明可以直接用类名调用该方法;声明abstract说明需要子类重写该方法;如果同时声明static和abstract,用类名调用一个抽象方法肯定不行。

synchronized 是同步,然而同步是需要有具体操作才能同步的,如果像abstract只有方法声明,那同步一些什么东西就会成为一个问题了,当然抽象方法在被子类继承以后,可以添加同步

native本身就和abstract冲突,他们都是方法的声明,只是一个把方法实现移交给子类,另一个是移交给本地操作系统。如果同时出现,就相当于既把实现移交给子类,又把实现移交给本地操作系统,那到底谁来实现具体方法呢!
不能放在一起的修饰符:final和abstract,private和abstract,static和abstract,因为abstract修饰的方法是必须在其子类中实现重写,才能以多态方式调用,以上修饰符在修饰方法时期子类都覆盖不了这个方法,final是不可以重写的,private是不能够继承到子类,所以也就不能覆盖,static是可以重写的,但是在调用时会调用编译时类型的方法,因为调用的是父类的方法,而父类的方法又是抽象的方法,又不能够调用,所以上的修饰符不能放在一起。

WEB-INF和webapps的区别

1、当静态资源放在webapp下面的时候,可直接通过浏览器访问,不需要配置映射,安全性略低

2、WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。
启动服务器后,在浏览器的地址栏中输入webapp目录下的可以直接访问,而WEB_INF目录下的不能直接访问。
当静态资源放在WEB-INF下面的时候,外部是不能直接访问的,一般是在springmvc的配置文件中配置资源映射。
当处理器对请求处理完毕后,向其它资源进行跳转时,有两种跳转方式:请求转发与重定向。而根据所要跳转的资源类型,又可分为两类:跳转到页面与跳转到其它处理器。注意, 对于请求转发的页面,可以是WEB-INF中页面 ;而 重定向的页面,是不能为WEB-INF中页的 。因为重定向相当于用户再次发出一次请求,而用户是不能直接访问 WEB-INF 中资源 的。

<!-- 资源映射 -->
<mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>

程序的三种基本结构

1、顺序结构,程序中各个操作按照在源代码中的排列顺序,自上而下,依次执行;2、选择结构,根据某个特定的条件进行判断后,选择其中一支执行;3、循环结构,在程序中需要反复执行某个或某些操作,直到条件为假或为真时才停止循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值