- public class FinalOriginalTest {
- private final int a;
- private String name;
- public FinalOriginalTest(){
- a = 3;
- }
- public FinalOriginalTest(String name){
- this.name = name;
- }
- public static void main(String[] args){
- FinalOriginalTest ft = new FinalOriginalTest();
- FinalOriginalTest ft1 = new FinalOriginalTest("hello");
- }
- }
问题1:上面的程序能否编译通过?如果不能,请说明理由。
解答:不能编译通过,可能没有初始化变量a。因为对于final类型的成员变量的初始化,在构造方法中完成赋值,如果一个类有多个构造方法,就要 保证在每个构造方法中都要完成对该final类型变量的初始化工作。所以需要在public FinalOriginalTest(String name)构造方法中给a赋值。
注意:final可以用在类、方法、变量上。
1、final用在类上,表明当前类它不能被继承,没有子类。
2、final用在方法上,表明当前方法不能被override,不能被重写。
3、final用在变量上,表明当前变量是一个终态的变量,是一个常量,这个变量的值一但被赋值后就不能被改变了。
对于final类型的成员变量的初始化方式:
1、声明变量时直接赋值
2、在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。
问题2:上面的程序中,修正问题1之后,将private final int a;改为private static final int a;能否编译通过?如果不能,请说明理由。
解答:不能编译通过,因为a是静态变量,在这个类还没有实例化的时候,它的值就已经有了。所以对于一个int类型的static final类型的变量a来说,我们只能在声明的时候就给它赋值private static final int a = 3;然后把构造方法里面的赋值给注释掉,这样编译就能通过了。
总结:对于final类型的变量,对于不加static我们可以有两种方式给它赋值:声明变量时直接赋值;在构造方法中完成赋值,如果一个类有多 个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。对于一个变量既是final又是static的,我们必须在声明变量 时直接赋值。
- public class FinalReferenceTest {
- public static final StringBuffer sb = new StringBuffer();
- public static void main(String[] args){
- sb.append("hello");
- }
- }
问题1:上面的程序能否编译通过?如果能,说明理由,如果不能,请说明理由。
解答:能编译通过。
分析:对于final修饰的引用类型,到底这个引用不能变还是这个引用指向的对象的内容不能变?答案是引用不能改变,而引用指向的内容是可以改变的。
问题2:上面的程序在语句sb.append("hello");后面添加语句 sb = new StringBuffer()能否编译通过?如果能,说明理由,如果不能,请说明理由。
解答:不能编译通过。
分析:由于对于final修饰的引用类型,是引用不能改变,而引用指向的内容是可以改变的。因为sb已经指向了第一次new...产生的对象,已 经不能改变,所以在语句sb.append("hello");后面添加语句 sb = new StringBuffer()是不能编译通过的。
总结:对于final类型的引用变量来说,所谓的不能改变指的是该引用不能改变。
SELECTT0.[U_SOContrNo],T0.[DocNum],T0.[DocDate], T0.[U_BusUnitTyp] 'Unit'
, T0.[U_CusPONo], T0.[CardCode], T0.[CardName]
,T1.[ItemCode],T1.[Dscription]
, Case
whenT0.[DocStatus] = 'O' then '未清'
when(T0.[DocStatus] = 'C' AND T0.[CANCELED] = 'Y' ) then '已取消'
when(T0.[DocStatus] = 'C' AND T0.[CANCELED] = 'N' ) then '已结算'
end as 状态
,CASE
WHEN (T1.[TargetType]= 13) THEN '已开票'
WHEN (T2.[TargetType]= 13) THEN '已开票'
ELSE '...'
END AS'开票状态'
,T1.[Quantity] '合同数'
,T2.[Quantity] '发货数'
,T3.[Quantity] '退货数'
, T1.[Price] '单价'
, T0.[DocCur]
, T1.[PriceAfVAT],(T1.[PriceAfVAT] * T1.[Quantity]) AS '含税价(合同)'
, T0.[Comments]
, T5.[DocNum],T5.[DocDate], (T5.[PriceAfVAT] * T5.[Quantity] ) AS '开票金额'
, T1.[Quantity]- T3.[Quantity]'退货否'
FROM ORDR T0
INNER JOIN RDR1 T1 ONT0.DocEntry = T1.DocEntry
LEFT JOIN (
SELECT B0.[DocNum],B0.[DocType]
, B1.[TargetType],B1.[TrgetEntry], B1.[ItemCode], B1.[Quantity], B1.[PriceAfVAT]
FROM ODLN B0 INNER JOIN DLN1 B1 ON B0.DocEntry = B1.DocEntry
) T2 ONT1.[TrgetEntry] = T2.[DocNum]
AND T1.[ItemCode] =T2.[ItemCode]
AND T1.[PriceAfVAT] =T2.[PriceAfVAT]
LEFT JOIN (
SELECT C0.[DocNum],C1.[TargetType], C1.[TrgetEntry], C1.[ItemCode], C1.[Quantity], C1.[PriceAfVAT]
FROM ORDN C0 INNERJOIN RDN1 C1 ON C0.DocEntry = C1.DocEntry
) T3 ONT2.[TrgetEntry] = T3.[DocNum]
AND T2.[ItemCode] =T3.[ItemCode]
AND T2.[PriceAfVAT] =T3.[PriceAfVAT]
LEFT JOIN (
SELECT D0.[DocNum],D1.[ItemCode],D1.[DocDate], D1.[Quantity], D1.[PriceAfVAT]
FROM OINV D0 INNER JOIN INV1 D1 ON D0.DocEntry = D1.DocEntry
) T5 ON ((T1.[TargetType] = 13) AND (T1.[TrgetEntry] = T5.[DocNum]) AND (T1.[ItemCode] =T5.[ItemCode]) AND (T1.[PriceAfVAT] = T5.[PriceAfVAT]) )
OR ( (T2.[TargetType]= 13) AND (T2.[TrgetEntry] = T5.[DocNum]) AND (T2.[ItemCode] = T5.[ItemCode])AND (T2.[PriceAfVAT] = T5.[PriceAfVAT]) )
WHERE (T0.[Series] =39 OR T0.[Series] = 40)
AND ( T0.docdate>=[%0] or [%0] = '' )
AND ( T0.docdate<=[%1] or [%1] = '' )
AND T1.[Quantity]-T3.[Quantity]=0
GROUP BYT0.[DocNum],T0.[DocDate], T0.[U_BusUnitTyp],T0.[U_SOContrNo], T0.[U_CusPONo], T0.[CardCode], T0.[CardName]
,T1.[ItemCode],T1.[Dscription]
,T0.[DocStatus],T0.[CANCELED]
,T1.[TargetType],T2.[TargetType]
,T1.[Quantity] ,T2.[Quantity],T3.[Quantity]
, T1.[Price] ,T0.[DocCur]
, T1.[PriceAfVAT],(T1.[PriceAfVAT] * T1.[Quantity])
, T0.[Comments]
, T5.[DocNum],T5.[DocDate], (T5.[PriceAfVAT] * T5.[Quantity] )
ORDER BY 1,2,10,11