• 【java】一些容易忽略的问题


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

        不能引用非静态成员变量大家都很清楚:
    1. public class A  
    2.   
    3. int a;  
    4. public static void main(String[] args)  
    5. {  
    6.   a = 2;//错误!!a非静态  
    7. }  
    但是大家往往忽略以下的情况:
    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.     }  
    22. }  
    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包:
    1. package cn.edu.chd.domain;  
    2. public class A  
    3. {  
    4.     protected A(){  
    5.         System.out.println("A constructor");  
    6.     }  
    7. }  
    test包:
    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).抽象类不能被实例化!
    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.     }   
    9. }  
    6.类上声明的泛型只对非静态成员有效
    1. package cn.edu.chd.basic;  
    2. public class Demo<T>  
    3. {  
    4.     public void aa(T t)  
    5.     {     
    6.     }  
    7.       
    8.     public void bb(T t1,T t2)  
    9.     {      
    10.     }  
    11.       
    12. //    类上声明的泛型只对非静态成员有效  
    13.     public static <T> void cc(T t)  
    14.     {  
    15.     }  
    16. }  
    7.finally块中代码不执行的一种情况
    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在CODE上查看代码片派生到我的代码片
    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.       
    16.      public  Person(String name, int  age)  
    17.     {  
    18.          this . name  = name;  
    19.          this . age  = age;  
    20.     }  
    21.      public   int  getAge()  
    22.     {  
    23.          return   age ;  
    24.     }  
    25.      public   void  setAge( int  age)  
    26.     {  
    27.          this . age  = age;  
    28.     }  
    29.      public  String getName()  
    30.     {  
    31.          return   name ;  
    32.     }  
    33.      public   void  setName(String nam
  • 相关阅读:
    PHP之ThinkPHP框架(界面)
    安卓网络访问(xUtils3)
    Python制作二维码和条形码扫描器 (pyzbar)
    redis 哨兵
    Django 源码阅读笔记(详细视图)
    Django 源码阅读笔记(基础视图)
    JavaScript基础
    Flask 基础
    redis 主从复制
    redis 数据删除策略和逐出算法
  • 原文地址:https://www.cnblogs.com/ghostll/p/3543475.html
Copyright © 2020-2023  润新知