抽象类和接口的区别,内部类引用外部方法final参数,守护线程和用户线程

abstract class和interface有什么区别?

        答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。(抽象类是不能实例化的,即不能被分配内存,而static修饰的方法在类实例化之前就已经别分配了内存,这样一来矛盾就出现了:抽象类不能被分配内存,而static方法必须被分配内存。所以抽象类中不能有静态的抽象方法。这和接口是一样的,接口中的方法也只能是 public   abstract修饰的,不能加上static。)Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

1。试图定义这样的操作时,编译器提示错误

[java]  view plain copy
  1. public static abstract Some getSome();  

2。仔细看下面的例子代码

[java]  view plain copy
  1. class A{  
  2.     public static void testP(){  
  3.        System.out.println("A");  
  4.        }  
  5.     public void testM(){  
  6.        System.out.println("X");  
  7.        }  
  8. }  
  9.   
  10. class B extends A{  
  11.     public static void testP(){  
  12.        System.out.println("B");  
  13.        }  
  14.     public void testM(){  
  15.        System.out.println("Y");  
  16.        }  
  17. }  
  18.   
  19. public class Test{  
  20.     public static void main(String[] args){  
  21.        A a=new A();  
  22.        B b=new B();  
  23.        a.testP();//结果是 A  
  24.        b.testP();//结果是 B  
  25.        a.testM();//结果是 X  
  26.        b.testM();//结果是 Y  
  27.        a=b;  
  28.        a.testP();//结果是  A ,如果testP不是静态的,那么执行结果应该是B才对  
  29.        b.testP();//结果是  B  
  30.        a.testM();//结果是  Y  
  31.        b.testM();//结果是  Y  
  32.        }  
  33. }  
        接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。 引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
=========================================================
int 和 Integer 有什么区别
答:Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了封装类。
原始类型和封装类
boolean和Boolean
char和Character
byte和Byte
short和Short
int和Integer
long和Long
float和Float
double和Double
引用类型和原始类型的行为完全不同,并且它们具有不同的语义。引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。


Collection 和 Collections的区别。 
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.。Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

谈谈final, finally, finalize的区别。 
final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,表示总是执行。都会执行,除非在前面出现system.exit(0)
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

=========================================================

为什么内部类方法引用外部类方法参数时参数要用final修饰?

1. 匿名内部类可以使用外部类的变量(局部或成员变来那个)
2. 匿名内部类中不同的方法可以共享这些变量
根据这两点信息我们就可以分析,可能这些变量会在匿名内部类的字段中保存着,并且在构造的时候将他们的值/引用传入内部类。这样就可以保证同时实现上述两点了。
事实上,Java就是这样设计的,并且所谓匿名类,其实并不是匿名的,只是编译器帮我们命名了而已。
Java对匿名内部类的实现是通过编译器来支持的,即通过编译器帮我们产生一个匿名类的类名,将所有在匿名类中用到的局部变量和参数做为内部类的final字段,同是内部类还会引用外部类的实例

public class InnerTest {
        /**
         * 方法中的内部类能不能访问方法中的局部变量,为什么?
         * 
         * 答:如果局部变量用final 关键字修饰,则可以访问,否则不可以访问。
         * 首先方法中定义有一个内部类,我们只是为了控制这个类的可见性,它并不是方法的一部分我们只是代码这样写,
         * 目的是为了控制内部类的可见性,编译之后的结果,也会出现 外部类 和 内部类各自的字节码class文件,
         * 这就说明内部类是一个独立的个体,他们就是两个类而已,他们各自都有自己的成员变量和方法。
         * 并且方法的属性与内部类的生命周期不同. 方法执行完毕后,方法内的属性也会随之被销毁,
         * 然而如果让内部类在使用被销毁的属性这并不合理. 解决方法就是加上final关键字.
         * 在java中, 某个属性一旦加上final关键字, 可以看作是常量,
         * 而常量的生命周期在程序的整个执行期间
         * 都是有效的. 所以可以引用, 不会出错.
         * 
         * 
         * */
public static void main(String[] args) {
                
                doSomething();
        }
        public static void doSomething(){
        final int a =10;  //此处 的  a  必须用final 修饰,否则内部类将无法访问a . 
        class Inner{
            public void seeOuter(){
                System.out.println(a);
            }
        }
        Inner in = new Inner();
        in.seeOuter();
    }
}
=========================================================
守护线程和用户线程

Java有两种Thread:“守护线程Daemon”与“用户线程User”。
守护线程是一种“在后台提供通用性支持”的线程,它并不属于程序本体。
任何线程都可以是“守护线程Daemon”或“用户线程User”。他们在几乎每个方面都是相同的,唯一的区别是判断虚拟机何时离开。

守护线程是一种“在后台提供通用性支持”的线程,它并不属于程序本体。守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。
setDaemon(boolean on)方法必须在线程启动之前调用,当线程正在运行时调用会产生异常。isDaemon方法将测试该线程是否为守护线程。
setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,false为User模式。

值得一提的是,当你在一个守护线程中产生了其他线程,那么这些新产生的线程不用设置Daemon属性,都将是守护线程,用户线程同样。
举个简单的例子:后台线程就是JVM(java虚拟机),前台线程,就是你写的程序。当你在运行你的程序时,如果jvm关闭了,你的程序就执行不了了。当你的程序运行(前台线程)完后,后台线程也就自动关闭了。

使用后台线程的优点,一般在什么情况下会用到前台线程?
完成你想完成的任务用前台线程执行,例如比如把内存缓冲区的数据转移到磁盘
非关键的任务用后台线程执行,例如为记录建立索引,或者计算word文字的个数

=========================================================
反射就是将java中的各个成分映射成为相应的java类!


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值