java一些容易忽略的问题

1.静态方法中不能调用非静态的成员或成员方法:

    不能引用非静态成员变量大家都很清楚:
[java] view plaincopy

  1. public class A
  2. int a;
  3. public static void main(String[] args)
  4. {
  5.   a = 2;//错误!!a非静态
  6. }

但是大家往往忽略以下的情况:

[java] view plaincopy

  1. package cn.edu.chd.test;
  2. public class B
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         new C();//错误,该类是动态类
  7.         new B().new C();//正确
  8.         new D();//正确,该类是静态类
  9.     }
  10.     public void func()
  11.     {
  12.         new C();//正确
  13.         new D();//正确
  14.     }
  15.     class C
  16.     {
  17.     }
  18.     static class D
  19.     {
  20.     }
  21. }
C类相当于B类的成员变量,故不能在静态方法中new出实例(记住:类中的静态方法不能直接调用动态方法)。
否则会提示错误:
No enclosing instance of type B is accessible. Must qualify the allocation with an enclosing instance of type B (e.g. x.new A() where x is an instance of B).
2.protected修饰的构造器在包内部可以被new实例,在其他包非子类中不能被new实例。其他包子类可以访问(包括匿名类):
domain包:
[java] view plaincopy

  1. package cn.edu.chd.domain;
  2. public class A
  3. {
  4.     protected A(){
  5.         System.out.println(“A constructor”);
  6.     }
  7. }

test包:

[java] view plaincopy

  1. package cn.edu.chd.test;
  2. import cn.edu.chd.domain.A;
  3. public class B
  4. {
  5.     public static void main(String[] args)
  6.     {
  7.     }
  8.     public void func()
  9.     {
  10.         new A();//错误!!!The constructor A() is not visible
  11.         new C();//正确,A的子类可以调A类的protected构造器
  12.       new A(){};//正确,其实这个匿名内部类就相当于new了A的子类
  13.     }
  14.     class C extends A
  15.     {//C类的无参构造器其实调用了super.A()
  16.     }
  17. }
3.类前面的修饰词只有三种(public/abstract/final),当然内部类除外。
4.访问权限问题:

类中某成员(方法或属性,method or field)的访问权限:

1、package(或称为friendly,但不用写出,friendly也不是关键字)权限,在同一包中的类和继承该类的子类可以访问;

2、public权限,任何类都可以访问;

3、private权限,该类内部的成员(方法、属性、内部类)可以访问,连该类的实例对象都不可以访问;

4、protected权限,继承访问权限,包内其余类和继承该类的子类可以访问,跟friendly权限差不多。

类中构造函数的访问权限:

1、public 很简单,不说了

2、protected 构造函数可以被继承该类的子类调用,但不能在包外或子类以外的地方被调用用来产生实例

3、private 该类无法被继承

内部类的访问权限:

1、public 任何地方均可访问

2、protected 在同一个包内均可访问,不同的包的子类可以访问

3、friendly(即默认权限) 同一个包内才可以访问

4、private 只有该内部类的外部类本身可以访问

类的访问权限:

1、public 任何地方均可访问

2、friendly 即默认权限,又称为package权限,在同一个包内可访问

 

5.抽象类是以abstract修饰的类,这个类里面可以有抽象的方法也可以没有!!

(1).抽象类不一定有抽象方法,但是有抽象方法的类一定是抽象类。
(2).抽象类不能被实例化!
[java] view plaincopy

  1. package cn.edu.chd.demo;
  2. public abstract class Demo
  3. {
  4. //    public abstract void func();//没有抽象方法也叫抽象类,比如HttpServlet类
  5.     public void func1()
  6.     {
  7.     }
  8. }

6.类上声明的泛型只对非静态成员有效

[java] view plaincopy

  1. package cn.edu.chd.basic;
  2. public class Demo<T>
  3. {
  4.     public void aa(T t)
  5.     {
  6.     }
  7.     public void bb(T t1,T t2)
  8.     {
  9.     }
  10. //    类上声明的泛型只对非静态成员有效
  11.     public static <T> void cc(T t)
  12.     {
  13.     }
  14. }

7.finally块中代码不执行的一种情况

[java] view plaincopy

  1. package  demo;
  2. /**
  3.  *  @author   Rowand   jj
  4.  *这种情况下finally块中代码不执行
  5.  */
  6. public   class  TryDemo
  7. {
  8.      public   static   void  main(String[] args)
  9.     {
  10.          try
  11.         {
  12.             System. out .println( “aaaa” );
  13.             System. exit (1);
  14.         }  catch  (Exception e)
  15.         {
  16.              //  TODO : handle exception
  17.         }
  18.          finally
  19.         {
  20.             System. out .println( “ha” );
  21.         }
  22.     }
  23. }

8.final 修饰的变量,其引用的对象不可以改变,但是我们可以改变对象的内容。

[java] view plaincopy

  1. public   class  Deemo
  2. {
  3.      public   static   void  main(String[] args)
  4.     {
  5.          final   Person  p =  new   Person ( “zhangsan” ,11);
  6.         p.setAge(12);//可以
  7.         System. out .println(p.getAge());
  8. //        p = new Person(” lisi “,22); //错误
  9.     }
  10. }
  11. class   Person
  12. {
  13.      int   age ;
  14.     String  name ;
  15.      public  Person(String name, int  age)
  16.     {
  17.          this . name  = name;
  18.          this . age  = age;
  19.     }
  20.      public   int  getAge()
  21.     {
  22.          return   age ;
  23.     }
  24.      public   void  setAge( int  age)
  25.     {
  26.          this . age  = age;
  27.     }
  28.      public  String getName()
  29.     {
  30.          return   name ;
  31.     }
  32.      public   void  setName(String name)
  33.     {
  34.          this . name  = name;
  35.     }
  36.      }

标签