1. 大括弧作用域问题

public static void main(String[] args) {
{
int x;
{
int x;//编译错误:Duplicate local variable x
}
}
}

2.boolean值的运算

public static void main(String[] args) {
if(true && false) {}
if(true & false) {}
System.out.println(true & false);
System.out.println(true ^ false);
System.out.println(true | false);
}

false
true
true

 

3.continue label 和 break label

public static void main(String[] args) {
label:
for(int i=0; i<2; ++i){
System.out.println("i=" + i);
for(int j=0; j<3; ++j){
if(j == 1){
//continue;
//break;
//continue label;
break label;
}
System.out.println(" j=" + j);
}
}
}

  这个例子中,continue label和break具有同样的作用。

public static void main(String[] args) {
label:
for(int k=0; k<2; ++k){
System.out.println("k=" + k);
for(int i=0; i<2; ++i){
System.out.println(" i=" + i);
for(int j=0; j<3; ++j){
if(j == 1){
//break;
continue label;
}
System.out.println(" j=" + j);
}
}
}
}

  这个例子就更加直观的看到 continue label实现不一样的效果!

4.基本类型和对应对象分别做参数的函数重载

class A{
public void fun(int x){
System.out.println("int 重载");
} public void fun(Integer x){
System.out.println("Integer 重载");
}
} public class Main{ public static void main(String[] args) {
A a = new A();
int x = 1;
Integer ix = 1;
a.fun(x);
a.fun(ix);
}
}

int 重载
Integer 重载

5.获取绝对路径

  request.getSession().getServletContext() 获取的是Servlet容器对象,相当于tomcat容器了。getRealPath("/") 获取实际路径,“/”指代项目根目录,所以代码返回的是项目在容器中的实际发布运行的根路径。

  ClassLoader类的getResource(String name),getResourceAsStream(String name)等方法,使用相对于当前项目的classpath的相对路径来查找资源。

1.jsp页面
  String path = pageContext.getServletContext().getRealPath("/");

  或者 String path = request.getSession().getServletContext().getRealPath("/");  

  String realPath = path+"/WEB-INF/classes/abc.properties";

2.java 程序
  InputStream in = getClass().getClassLoader().getResourceAsStream("abc.properties"); // abc.properties放在webroot/WEB-INF/classes/目录下

    推荐使用Thread.currentThread().getContextClassLoader().getResource("")来得到当前的classpath的绝对路径的URI表示法。
  prop.load(in);
  in.close();

3.只通过Java程序操作资源文件
  InputStream in = new FileInputStream("abc.properties"); // 相对路径,项目下的路径

  OutputStream out = new FileOutputStream("abc.properties");

6.异常链

public class Main{

    public static void test2(){
throw new NullPointerException("空指针异常!");
} public static void test() throws Exception{
try{
test2();
} catch (Exception e){
//throw new Exception("自定义异常!"); //(1)
throw new Exception("自定义异常!", e);//(2)
}
} public static void main(String[] args) {
try{
test();
} catch(Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
System.out.println(sw.toString());
}
}
}

注意:(1)和(2)的输出差别

(1)java.lang.Exception: 自定义异常!
at com.hjzgg.Main.test(Main.java:28)
at com.hjzgg.Main.main(Main.java:34) (2)java.lang.Exception: 自定义异常!
at com.hjzgg.Main.test(Main.java:29)
at com.hjzgg.Main.main(Main.java:35)
Caused by: java.lang.NullPointerException: 空指针异常!
at com.hjzgg.Main.test2(Main.java:21)
at com.hjzgg.Main.test(Main.java:26)
... 1 more

7.web中一些地址信息

1).地址栏输入:http://localhost:8080/HJZGG_BLOG/pictureAction!pictureGroupJspGetAllGroups
  System.out.println(ServletActionContext.getServletContext().getRealPath("/savePath"));
  System.out.println(ServletActionContext.getRequest().getServletPath());
  System.out.println(ServletActionContext.getRequest().getRequestURL());
  System.out.println(ServletActionContext.getRequest().getRequestURI());

打印的结果如下:
  F:\eclipseEE_workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\HJZGG_BLOG\savePath
  /pictureAction!pictureGroupJspGetAllGroups
  http://localhost:8080/HJZGG_BLOG/pictureAction!pictureGroupJspGetAllGroups
  /HJZGG_BLOG/pictureAction!pictureGroupJspGetAllGroups

2).得到完整的URL请求
  访问:http://localhost:8080/HJZGG_BLOG/pictureAction!pictureGroupJspGetAllGroups
  HttpServletRequest request;
  String url = null;
  url = request.getScheme()+"://" //请求协议 http 或 https
    + request.getServerName() //服务器地址
    + ":"
    + request.getServerPort() //端口号
    + request.getContextPath() //项目名称
    + request.getServletPath() //请求页面或其他地址 ,例如:pictureAction!pictureGroupJspGetAllGroups
    + "?" + (request.getQueryString()); //参数
  System. out.println(url);
  输出:http://localhost:8080/HJZGG_BLOG/pictureAction!pictureGroupJspGetAllGroups?null

3).得到项目根目录的URL
  HttpServletRequest request = ServletActionContext.getRequest();
  String url = null;
  url = request.getScheme()+"://" //请求协议 http 或 https
    + request.getServerName() //服务器地址(可以替换成 InetAddress.getLocalHost().getHostAddress())
    + ":"
    + request.getServerPort() //端口号
    + request.getContextPath(); //项目名称
  System. out.println(url);

  输出:http://localhost:8080/HJZGG_BLOG

8.内部类和内嵌口

//如果外部类返回是  private类型的内部类,非此外部类的其他方法不能访问这个内部类
class A{
private class B{
public void fun(){}
}
public B getBInstance(){
return new B();
} public void invokeBMethod(B b){
b.fun();
} private int x;
public int getX(){
return x;
}
} //内嵌接口, 如果你不想将你的借口暴露给外部,写成如下方式,否则将内嵌接口定义成 public,或者将接口写成非内嵌接口的形式
class C{
interface E{
void gun();
}
private interface D {
void fun();
}
private class DImpl implements D{
@Override
public void fun() {}
}
public D getDImpl(){
return new DImpl();
} public void invokeDMethod(D d){
d.fun();
}
} //内部链接提供给外部
interface H{
void fun();
}
class I{
private class G implements H{
@Override
public void fun() {}
} public H getHImpl(){
return new G();
}
} class F implements C.E{
@Override
public void gun() {}
} public class Main{
public static void main(String[] args) {
A a = new A();
int x = a.getX();
//error, The type A.B is not visible
//a.getBInstance().fun();
a.invokeBMethod(a.getBInstance()); C c = new C();
//error, The type A.B is not visible
// c.getDImpl().fun();
c.invokeDMethod(c.getDImpl()); H h = new I().getHImpl();
h.fun();
}
}

9.协变类型

java中泛型是不变的,可有时需要实现逆变与协变,怎么办呢?这时,通配符?派上了用场:

  • <? extends>实现了泛型的协变,比如:
List<? extends Number> list = new ArrayList<Integer>();
  • <? super>实现了泛型的逆变,比如:
List<? super Number> list = new ArrayList<Object>();

class Parent{
public Parent getSelf(){
return new Parent();
}
} class Child extends Parent{ @Override
public Child getSelf(){
return new Child();
}
}

  在Java1.4及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
  Java5.0放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。
  注意:"协变返回(covariant return)",仅在subclass(子类)的返回类型是superclass(父类)返回类型的extension(继承)时才被容许。

10.接口内部的类

interface C{
class D{
public void fun(){
System.out.println("this is D class!");
}
}
D getDInstance();
} class E implements C{
@Override
public D getDInstance() {
return new D();
}
}

  正常情况下,不能再接口内部放置任何代码,但是嵌套类可以作为接口的一部分。你放到接口中的任何类都自动是public和static的。因为类是static的,只是将嵌套类至于接口的命名空间内,这并不违反接口的规则。你设置可以在内部类中实现外层接口。另外实现该接口的类,都可以使用该接口中的内部嵌套类,如上所示。

11.内部类的一个好处

  要求,不使用内部类的情况下,实现下面的两个接口。

接口

interface A{
void fun();
} interface B{
int fun();
}

不使用内部类,实现两个接口

//The return type is incompatible with B.fun()
class C implements A, B{
@Override
public void fun() {
}
}
class C implements A{
@Override
public void fun() {
}
} //The return types are incompatible for the inherited methods B.fun(), C.fun()
class D extends C implements B{ }

使用内部类,方式1

class C implements A{
@Override
public void fun() {}
class D implements B{
@Override
public int fun() {
return 0;
}
}
}

使用内部类,方式2

class C{
class D implements A{
@Override
public void fun() {
}
} class E implements B{
@Override
public int fun() {
return 0;
}
}
}

12.java不能使用范型数组原因

  转自:http://www.cnblogs.com/exmyth/p/4598971.html

Java 不支持泛型数组。也就是说,

  1. List<String>[] ls = new ArrayList<String>[10];

是不支持的,而

  1. List<String>[] ls = new ArrayList[10]  或者 List[] ls = new ArrayList[10] 却可以。

是我一直不清楚为什么不能够声明泛型的数组,指定类型可以让编译的时候不会出现类型安全的提示。

直到今天我看到Sun的一篇文档才清楚,里面提到了一种情况:

  1. List<String>[] lsa = new List<String>[10]; // Not really allowed.
  2. Object o = lsa;
  3. Object[] oa = (Object[]) o;
  4. List<Integer> li = new ArrayList<Integer>();
  5. li.add(new Integer(3));
  6. oa[1] = li; // Unsound, but passes run time store check
  7. String s = lsa[1].get(0); // Run-time error: ClassCastException.

这种情况下,由于JVM泛型的擦除机制,在运行时JVM是不知道泛型信息的,所以可以给oa[1]赋上一个ArrayList<Integer>而不会出现ArrayStoreException,但是在取出数据的时候却要做一次类型转换,所以就会出现ClassCastException,如果可以进行泛型数组的声明,上面说的这种情况在编译期将不会出现任何的警告和错误,只有在运行时才会出错。而对泛型数组的声明进行限制,对于这样的情况,可以在编译期提示代码有类型安全问题,比没有任何提示要强很多。

基于以上的原因,Java不支持声明泛型数组,更确切地表达是:数组的类型不可以是类型变量,除非是采用通配符的方式,看下面这个例子:

  1. List<?>[] lsa = new List<?>[10]; // OK, array of unbounded wildcard type.
  2. Object o = lsa;
  3. Object[] oa = (Object[]) o;
  4. List<Integer> li = new ArrayList<Integer>();
  5. li.add(new Integer(3));
  6. oa[1] = li; // Correct.
  7. String s = (String) lsa[1].get(0); // Run time error, but cast is explicit.

因为对于通配符的方式,最后取出数据是要做显式的类型转换的,所以并不会存在上一个例子的问题。

13.try..catch..finally中的return

public static int fun(){
int x = 1;
try{
return x;
} catch(Exception e){ } finally {
x = 2;
}
return x;
} public static int fun(){
int x = 1;
try{
return x;
} catch(Exception e){ } finally {
x = 2;
return x;
}
} public static int fun(){
int x = 1;
try{
if(x == 1)
throw new Exception("test");
} catch(Exception e){
return x;
} finally {
x = 2;
return x;
}
}

  输出 1  2  1

14.内部类继承

class Outer{
private String s; public Outer(String s){
System.out.println("Outer initial :" + s);
} public void outFun(){
System.out.println("outFun");
}
class Inner{
public void innerFun(){
System.out.print("内部类调用外部类中的方法: ");
outFun();
}
}
} class InheritInner extends Outer.Inner{
public InheritInner(Outer out){
out.super();
}
@Override
public void innerFun(){
super.innerFun();
System.out.println("InheritInner override innerFun");
}
} public class Main{ public static void main(String[] args) {
Outer out = new Outer("Outer");
InheritInner inheritInner = new InheritInner(out);
inheritInner.innerFun();
}
}
这是在《JAVA编程思想》上看到的一道例题,是关于继承inner   classes(内隐类)的。 

先把代码和书上的一些原话写出来,如下: 

由于inner   class的构造函数必须连接到一个reference指向outer   class   对象身上,所以
当你继承inner class时,事情便稍微复杂些。问题出在“指向outer class对象”的那个
神秘reference必须被初始化。但derived class之内不存在可连接的缺省对象,这个问题
的答案是,使用专用语法,明确产生该关联性: class WithInner {
class Inner{}
} public class InheritInner extends WithInner.Inner {
InheritInner(WithInner wi) {
wi.super(); //---这里不懂,wi.super()指的是什么,有什么用?
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
}

15.java自定义注解类,如何获取注解,如何反射内部类,this$0是什么意思

  http://www.cnblogs.com/hujunzheng/p/5719611.html

java注意的一些细节问题的更多相关文章

  1. JAVA面向对象-----成员内部类访问细节

    JAVA面向对象-–成员内部类访问细节 私有的成员内部类不能在其他类中直接创建内部类对象来访问. 如果内部类中包含有静态成员,那么java规定内部类必须声明为静态的访问静态内部类的形式:Outer.I ...

  2. Java中String类型细节

    Java中String类型细节 一 . String两种初始化方式 1 . String str1= “abc”;//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测”abc”是否 ...

  3. Java中的泛型 - 细节篇

    前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的泛型 - 细节篇>,希望对大家有帮助,谢谢 细心的观众朋友们可能发现了,现在的标题不再是入门篇,而是各种详细篇,细节篇: 是因为之 ...

  4. Java泛型中的细节

    Java泛型中的细节 如果没有泛型 学习Java,必不可少的一个过程就是需要掌握泛型.泛型起源于JDK1.5,为什么我们要使用泛型呢?泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一 ...

  5. Java String 字符串类细节探秘

    一. 字符串基本知识要点 字符串类型String是Java中最常用的引用类型.我们在使用Java字符串的时候,通常会采用两种初始化的方式:1. String str = "Hello Wor ...

  6. java继承使用的细节问题?

    关于java继承的基本概念就不多说了,下面就说说继承使用应该注意的细节问题? 示例 一: package com.bizvane; class Fu{ public Fu() { System.out ...

  7. 【JAVA】 02-Java对象细节

    链接: 笔记目录:毕向东Java基础视频教程-笔记 GitHub库:JavaBXD33 目录: <> <> 内容待整理: 面向过程: 代表语言-c:即通过函数体现,并不断调用函 ...

  8. Java和C++在细节上的差异(转)

    Java的基本程序结构.关键字.操作符都和C/C++非常相似,以下为主要的几点区别: 一.基本程序设计结构: Java的基本程序结构.关键字.操作符都和C/C++非常相似,以下为主要的几点区别: 1. ...

  9. Java集合的实现细节—Set集合和Map集合

    Set:代表无序.不可重复的集合 Map:代表key-value对集合,也称为关联数组 从表面上看,Set和Map相似性很少,但实际上可以说Map集合时Set集合的扩展. 1.Set集合和Map集合的 ...

随机推荐

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...

  3. Windows 7上执行Cake 报错原因是Powershell 版本问题

    在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...

  4. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  5. 参考bootstrap中的popover.js的css画消息弹框

    前段时间小颖的大学同学给小颖发了一张截图,图片类似下面这张图: 小颖当时大概的给她说了下,其实小颖也不知道上面那个三角形怎么画嘻嘻,给她说了DOM结构,具体的css让她自己百度,今天小颖自己参考boo ...

  6. Android 5.0 到 Android 6.0 + 的深坑之一 之 .so 动态库的适配

    (原创:http://www.cnblogs.com/linguanh) 目录: 前序 一,问题描述 二,为何会如此"无情"? 三,目前存在该问题的知名SDK 四,解决方案,1 对 ...

  7. 【C#附源码】数据库文档生成工具支持(Excel+Html)

    [2015] 很多时候,我们在生成数据库文档时,使用某些工具,可效果总不理想,不是内容不详细,就是表现效果一般般.很多还是word.html的.看着真是别扭.本人习惯用Excel,所以闲暇时,就简单的 ...

  8. SharpMap简析

    1.背景 因为项目需求,需要基于开源项目来对SHP进行相关操作.涉及到的主要功能就是加载SHP读取其中的属性信息和几何信息.于是选择了Sharpmap来进行,在使用中对其相关功能做了初步了解,做个总结 ...

  9. JAVA 分页工具类及其使用

    Pager.java package pers.kangxu.datautils.common; import java.io.Serializable; import java.util.List; ...

  10. 使用DeviceOne实现微信小程序功能

    微信小程序即将推出,还没推出就火的不行了.基于微信这个巨大平台,小程序必然能有巨大成功.不过它并不能完全取代App,该开发App还得开发.如果我们自己想实现一个基于自己的APP包含类似微信的小程序功能 ...