zoukankan      html  css  js  c++  java
  • 【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
  • 相关阅读:
    C# 图片与Base64的相互转化
    LeetCode 303. Range Sum Query – Immutable
    LeetCode 300. Longest Increasing Subsequence
    LeetCode 292. Nim Game
    LeetCode 283. Move Zeroes
    LeetCode 279. Perfect Squares
    LeetCode 268. Missing Number
    LeetCode 264. Ugly Number II
    LeetCode 258. Add Digits
    LeetCode 257. Binary Tree Paths
  • 原文地址:https://www.cnblogs.com/ghostll/p/3543475.html
Copyright © 2011-2022 走看看