final修飾類 不能被繼承,也沒有子類。
目前成都創(chuàng)新互聯(lián)公司已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、淮陽網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。【使用環(huán)境】:
1.不是專門為繼承而設(shè)計的類,類的本身方法之間有復(fù)雜的調(diào)用關(guān)系。假如隨意創(chuàng)建這些類的子類,子類可能會錯誤的修改父類的實現(xiàn)細節(jié)
2.出于安全原因,類的實現(xiàn)細節(jié)不允許有任何改動
3.在創(chuàng)建對象模型的時候,確信這個類不會再被擴展
final 不能修飾接口
final 修飾的方法 不能重寫
final 可以修飾入?yún)?/p>
static 可以修飾類 不能修飾接口 不能修飾入?yún)?不能出現(xiàn)在方法內(nèi)
java允許我們在一個類里面定義靜態(tài)類。比如內(nèi)部類(nested class)。把nested class封閉起來的類叫外部類。在java中,我們不能用static修飾頂級類(top level class)。只有內(nèi)部類可以為static。
靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類之間到底有什么不同呢?下面是兩者間主要的不同。
(1)內(nèi)部靜態(tài)類不需要有指向外部類的引用。但非靜態(tài)內(nèi)部類需要持有對外部類的引用。
(2)非靜態(tài)內(nèi)部類能夠訪問外部類的靜態(tài)和非靜態(tài)成員。靜態(tài)類不能訪問外部類的非靜態(tài)成員。他只能訪問外部類的靜態(tài)成員。
(3)一個非靜態(tài)內(nèi)部類不能脫離外部類實體被創(chuàng)建,一個非靜態(tài)內(nèi)部類可以訪問外部類的數(shù)據(jù)和方法,因為他就在外部類里面。
接口和抽象類
抽象類
使用abstract關(guān)鍵字修飾,并且沒有方法體
抽象類不能直接創(chuàng)建實例可以定義引用變量。
Shape shape=new Shape();錯
Shape shape=new Circle();對
抽象類只能被繼承,一個具體類繼承一個抽象類,必須實現(xiàn)所有的抽象方法。
有抽象的方法類一定是抽象類。但是抽象類中不一定都是抽象方法,也可以是全是具體的方法。
abstract與final不能同時使用。final阻止重寫和繼承的。
abstract與private也不能同時修飾方法,因為private阻止繼承,也阻止了重寫的事實。
抽象類與接口的區(qū)別
抽象類不能創(chuàng)建實例
抽象類的抽象方法不需在具體的子類來實現(xiàn),不能有抽象的構(gòu)造方法或者抽象的靜態(tài)方法。
接口是抽象類的一種特例,接口中的所有方法都必須是抽象的,接口的方法默認為public abstract類型,接口中的成員變量默認為 public static final類型
區(qū)別如下
抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。
抽象類可以有普通成員變量,接口中沒有。
抽象類中包含非抽象的方法,接口中的所有方法必須是抽象的。
抽象類的抽象方法訪問的類型可以是public,protected和默認類型(最好不要),接口接口方法只能是public類型的,,并且默認為public abstract類型。
一個類只能繼承一個抽象類,但可以實現(xiàn)多個接口
redis key值還有亂碼xacxedx00x05tx00x0cALIYUN_TOKEN
原因:
spring-data-redis的RedisTemplate
private boolean enableDefaultSerializer = true;
private RedisSerializer> defaultSerializer = new JdkSerializationRedisSerializer();
private RedisSerializer keySerializer = null;
private RedisSerializer valueSerializer = null;
private RedisSerializer hashKeySerializer = null;
private RedisSerializer hashValueSerializer = null;
解決方法:設(shè)置序列化方式為StringRedisSerializer
private RedisTemplate redisTemplate;
@Autowired(required = false)
public void setRedisTemplate(RedisTemplate redisTemplate) {
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
this.redisTemplate = redisTemplate;
}
日志級別輸出
Log4j建議只使用四個級別,優(yōu)先級從高到低分別是 ERROR、WARN、INFO、DEBUG。通過在這里定義的級別,您可以控制到應(yīng)用程序中相應(yīng)級別的日志信息的開關(guān)。比如在這里定義了INFO級別,則應(yīng)用程序中所有DEBUG級別的日志信息將不被打印出來,也是說大于等于的級別的日志才輸出。
logback指定某方法打印至某指定目錄 以方便觀察
INFO
ACCEPT
DENY
/opt/car_log/trace_%d{yyyyMMdd}.log
30
%d{HH:mm:ss} [%F:%L] %-5level - %msg%n
在java類創(chuàng)建該日志對象
private static Logger logger_car_trace = LoggerFactory.getLogger("CAR_TRACE");
抓取html后提取并處理文字內(nèi)容
pom.xml配置jar包
org.jsoup
jsoup
1.11.3
java代碼
// 1. Jsoup.parse(html).text() 用jsonP的方法處理成文本
// 2. replaceAll("\uFEFF", "") 處理bom頭
Jsoup.parse(html).text().replaceAll("\uFEFF", "");
// 3. tab,縮進
換行 回車 全部替換為,
text.replaceAll("[\t\n\r]", ",");
// 4. 替換所有的空格為逗號 包含一個或多個
text.replaceAll("[' ']+", ",")
延展:
/t相當(dāng)于鍵盤的Tab鍵,/n換行New Line,/r回車Carriage Return,基本的概念應(yīng)該是回車表示回到最前面,換行表示換一行。
操作系統(tǒng)的不同,換行符操也不同:
/r Mac
/n Unix/Linux
/r/n Windows
查看linux是32位還是64位
使用命令 “getconf LONG_BIT”
如果返回的是32,那么就是32位
如果返回的是64,那么就是64位