日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JAVA面向对象(2)

發(fā)布時(shí)間:2023/12/8 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA面向对象(2) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一:代碼塊:

1)實(shí)例代碼塊,使用一個(gè)大括號(hào),里面可以放一些語(yǔ)句和訪問(wèn)一些成員變量(定義在類(lèi)中的代碼塊),也叫做構(gòu)造代碼塊,一般用于初始化實(shí)例成員變量,當(dāng)我們?nèi)ew一個(gè)對(duì)象的時(shí)候,就會(huì)被執(zhí)行了,可以初始化一個(gè)實(shí)例成員變量

public class TestDemo{public String name;public int age;public static String str;{this.name="李佳偉";//初始化實(shí)例成員變量this.age=90;}static {str="生命";//初始化靜態(tài)成員變量this.name=""//報(bào)錯(cuò)}}

2)靜態(tài)代碼塊:

static{里面放一些字段和方法};在我們通過(guò)類(lèi)名進(jìn)行訪問(wèn)靜態(tài)成員的時(shí)候,也會(huì)默認(rèn)執(zhí)行靜態(tài)代碼塊的內(nèi)容

public class TestDemo{public static int count=10;static {count=99;}public static void main(String[] args) {System.out.println(TestDemo.count);} } //打印結(jié)果是99 package Demo;public class TestDemo{static {count=99;}public static int count=10;public static void main(String[] args) {System.out.println(TestDemo.count);}} //打印結(jié)果是10

1)如果count沒(méi)有進(jìn)行初始化,那么在任何位置(定義count的位置和static代碼塊的位置)count的值都是static代碼塊的值

2)靜態(tài)代碼塊的執(zhí)行順序>實(shí)例代碼塊的執(zhí)行順序,一般用于初始化靜態(tài)成員變量,再進(jìn)行類(lèi)加在的時(shí)候就被調(diào)用了

package 李佳偉; import javax.swing.*; import java.security.PrivateKey; import java.util.Scanner; import java.util.Arrays; import java.util.Scanner; class Person//一個(gè)類(lèi) { public int age;public static int count=0;public Person()//無(wú)返回值類(lèi)型聲明,且必須與類(lèi)名相同{System.out.println("我是構(gòu)建方法");}{System.out.println("我是示例代碼塊");}static{count=99;//如果都是靜態(tài)的,則初始化前看一看被定義的先后順序this .age=18;不能進(jìn)行訪問(wèn),因?yàn)殪o態(tài)代碼區(qū)不能訪問(wèn)實(shí)例變量,且this表示當(dāng)前對(duì)象的引用System.out.println("我是靜態(tài)代碼塊");}} public class HelloWorld {public static void main(String[] argv){Person lijiawei=new Person();//lijiawei就是一個(gè)對(duì)象,而且一個(gè)類(lèi)可以面向多個(gè)對(duì)象}} //靜態(tài)代碼塊>實(shí)例代碼塊>構(gòu)造方法

1)所以我們得出結(jié)論,對(duì)于靜態(tài)代碼快來(lái)說(shuō),無(wú)論生成多少個(gè)對(duì)象,靜態(tài)代碼塊就只會(huì)執(zhí)行一次,況且是最先執(zhí)行的

2)靜態(tài)代碼塊執(zhí)行完畢后,實(shí)例代碼塊(構(gòu)造快)再去執(zhí)行,最后是構(gòu)造方法執(zhí)行,靜態(tài)成員變量是類(lèi)的屬性,因此是在JVM加載類(lèi)的時(shí)候開(kāi)辟空間并進(jìn)行初始化的

3)如果一個(gè)類(lèi)中包含著多個(gè)靜態(tài)代碼塊,在進(jìn)行編譯代碼的時(shí)候,編譯器會(huì)按照定義的先后順序依次執(zhí)行

4)實(shí)例代碼塊只有在創(chuàng)建對(duì)象的時(shí)候才會(huì)執(zhí)行

5)上面的重寫(xiě)ToString方法把對(duì)象轉(zhuǎn)化成字符串被稱(chēng)之為序列化

反序列化:將字符串轉(zhuǎn)化成對(duì)象-----后面前后端進(jìn)行交互的時(shí)候,講一個(gè)字符串轉(zhuǎn)化成JSON格式的數(shù)據(jù)

補(bǔ)充:

1)序列化最重要的作用:在傳遞和保存對(duì)象時(shí).保證對(duì)象的完整性和可傳遞性。對(duì)象轉(zhuǎn)換為有序字節(jié)流,以便在網(wǎng)絡(luò)上傳輸或者保存在本地文件中

2)反序列化的最重要的作用:根據(jù)字節(jié)流中保存的對(duì)象狀態(tài)及描述信息,通過(guò)反序列化重建對(duì)象。

3)核心作用就是對(duì)象狀態(tài)的保存和重建。(整個(gè)過(guò)程核心點(diǎn)就是字節(jié)流中所保存的對(duì)象狀態(tài)及描述信息)

class Person{public static int count=0;static{System.out.println("我是靜態(tài)代碼塊");}public static void run(){System.out.println("我是run方法");} }System.out.println(Person.count); //最終打印的結(jié)果是我是靜態(tài)代碼塊,0 對(duì)于toString方法來(lái)說(shuō),在調(diào)用println方法的時(shí)候會(huì)被自動(dòng)調(diào)用

JAVA的序列化和反序列化:

只有實(shí)現(xiàn)了Serializable或者Externalizable接口的類(lèi)的對(duì)象才能被序列化為字節(jié)序列。(不是則會(huì)拋出異常)?

JDK中序列化和反序列化的API: 1)java.io.ObjectInputStream:對(duì)象輸入流 類(lèi)的readObject()方法從輸入流中讀取字節(jié)序列,然后將字節(jié)序列反序列化為一個(gè)對(duì)象并返回。 2)java.io.ObjectOutputStream:對(duì)象輸出流 該類(lèi)的writeObject(Object obj)方法將將傳入的obj對(duì)象進(jìn)行序列化,把得到的字節(jié)序列寫(xiě)入到目標(biāo)輸出流中進(jìn)行輸出

?實(shí)現(xiàn)序列化和反序列化的實(shí)現(xiàn):

1)若Student類(lèi)僅僅實(shí)現(xiàn)了Serializable接口,并且還定義了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),則采用以下方式進(jìn)行序列化與反序列化 2)ObjectOutputStream調(diào)用Student對(duì)象的writeObject(ObjectOutputStream out)的方法進(jìn)行序列化。 3)ObjectInputStream會(huì)調(diào)用Student對(duì)象的readObject(ObjectInputStream in)的方法進(jìn)行反序列化 1)若Student類(lèi)實(shí)現(xiàn)了Externalnalizable接口,且Student類(lèi)必須實(shí)現(xiàn)readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,則按照以下方式進(jìn)行序列化與反序列化。 2)ObjectOutputStream調(diào)用Student對(duì)象的writeExternal(ObjectOutput out))的方法進(jìn)行序列化 3)ObjectInputStream會(huì)調(diào)用Student對(duì)象的readExternal(ObjectInput in)的方法進(jìn)行反序列化

1)Java有很多基礎(chǔ)類(lèi)已經(jīng)實(shí)現(xiàn)了serializable接口,比如String,Vector等。但是也有一些沒(méi)有實(shí)現(xiàn)serializable接口的;

2)static修飾字段不能被序列化

public class TestDemo{static class Student implements Serializable {public int age;public String name;public Student(int age,String name){this.age=age;this.name=name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +'}';}}public static void main(String[] args) throws IOException, ClassNotFoundException { //1.序列化File file=new File("d:/textDemo.txt");FileOutputStream f1=new FileOutputStream(file);ObjectOutputStream outputStream=new ObjectOutputStream(f1);outputStream.writeObject(new Student(18,"hhhh")); //2反序列化FileInputStream f2= new FileInputStream(file);ObjectInputStream inputStream= new ObjectInputStream(f2);Student student2 = (Student) inputStream.readObject();System.out.println(student2);}

練習(xí)1:編寫(xiě)一個(gè)類(lèi)Calculator,有兩個(gè)屬性num1和num2這兩個(gè)數(shù)據(jù)的值,不能在定義的時(shí)候進(jìn)行初始化,最后實(shí)現(xiàn)加減乘除四種運(yùn)算

package Demo; class Calculator{private int num1;private int num2;public void setNum1(int num1) {this.num1 = num1;}public void setNum2(int num2) {this.num2 = num2;}public int add(){return num1+num2;}public int sub(){return num1-num2;}public int mul(){return num1*num2;}public double dev(){return num1*1.0/num2;} } public class TestDemo{public static void main(String[] args) {Calculator calculator=new Calculator();calculator.setNum1(10);calculator.setNum2(20);System.out.println(calculator.add());System.out.println(calculator.sub());System.out.println(calculator.dev());System.out.println(calculator.mul());} }

練習(xí)2:設(shè)計(jì)交換兩個(gè)變量的值,要求交換實(shí)參的值

把實(shí)參的值放到我們的堆上,有地址就好了

public class TestDemo{public static void main(String[] args) {int a=10;int b=90;swap(a,b);System.out.println(a);System.out.println(b);}private static void swap(int a, int b) {int temp=a;a=b;b=temp;} } 無(wú)法交換

解法:交換引用中屬性的值

package Demo; class MyValue{public int data; } public class TestDemo{public static void main(String[] args) {MyValue myValue1=new MyValue();myValue1.data=90;MyValue myValue2=new MyValue();myValue2.data=100;swap(myValue1,myValue2);System.out.println("myValue1.data="+myValue1.data);System.out.println("MyValue2.data="+myValue2.data);}private static void swap(MyValue myValue1, MyValue myValue2) {int temp=myValue1.data;myValue1.data=myValue2.data;myValue2.data=temp;}}

包:import是導(dǎo)入一個(gè)具體的類(lèi),而不能導(dǎo)入一個(gè)具體的包

1)是組織類(lèi)的一種形式,是為了保證類(lèi)的唯一性,假設(shè)你自己在代碼中寫(xiě)了一個(gè)Test類(lèi),然后你的同事也寫(xiě)了一個(gè)Test類(lèi),那么就會(huì)導(dǎo)致代碼無(wú)法編譯通過(guò)

2)package:包,類(lèi)所在的包,包是一組類(lèi)的集合,可以防止類(lèi)名沖突,import static可以導(dǎo)入一些靜態(tài)方法,import可以導(dǎo)入一個(gè)具體的包,這是錯(cuò)的,只可以導(dǎo)入包中的一組類(lèi)或者多組類(lèi);

3)import:引入,指引入了類(lèi)所需要的類(lèi)

import是導(dǎo)入包,以區(qū)別于同個(gè)名稱(chēng)的但是屬于不同包的類(lèi);

4)在文件上方有一個(gè)字段是package,是將當(dāng)前類(lèi)導(dǎo)入到包中,等以后要使用的時(shí)候,可以使用import將其導(dǎo)入

5)正常情況下,有一個(gè)叫做java.util底下的包,他里面有一個(gè)package的字段,意思是把當(dāng)前的類(lèi)導(dǎo)入包中,以便后續(xù)的程序可以使用import來(lái)到如使用這個(gè)包里面的方法;

6)import java.util.Arrays這個(gè)意思就是導(dǎo)入java.util中的Arrays類(lèi)

7)java.util.*,代表導(dǎo)入包中的所有的類(lèi),java在這個(gè)地方處理的時(shí)候,用誰(shuí)就自動(dòng)倒誰(shuí);

8)在C語(yǔ)言里面,是全部進(jìn)行導(dǎo)入,一個(gè)類(lèi),在不同的包中有不同的內(nèi)容

import java.util.Date;//導(dǎo)入包中的一個(gè)類(lèi),導(dǎo)入util包中的Date類(lèi) public class HelloWorld {public static void main(String[] args) {Date date=new Date();System.out.println(date.getTime());//打印的是一個(gè)毫秒級(jí)的時(shí)間戳} } public class HelloWorld {public static void main(String[] args) {java.util.Date date=new java.util.Date();System.out.println(date.getTime());} }

我們需要使用java.util的其他類(lèi),我們就可以使用import java.util.*,這樣我們就可以導(dǎo)入這個(gè)包的所有類(lèi),但是我們要注意并不是所有類(lèi)都會(huì)被導(dǎo)入進(jìn)來(lái),而是用到誰(shuí)我們就會(huì)倒入誰(shuí)

但是我們有時(shí)候要顯式指定我們要導(dǎo)入的類(lèi)名,不然還是很容易會(huì)出現(xiàn)沖突的情況

一個(gè)包底下不能有相同的類(lèi),包名不一樣,類(lèi)名不一樣,那么即使有相同的類(lèi)也互不干擾

包名必須是小寫(xiě)字母

import java.util.*; import java.sql.*;public class HelloWorld {public static void main(String[] args) {Date date=new Date();System.out.println(date.getTime());} } 上面的代碼會(huì)編譯出錯(cuò),我們應(yīng)該這么寫(xiě):因?yàn)槭莾蓚€(gè)包里面都有一個(gè)Date類(lèi) import java.util.*; import java.sql.*; public class HelloWorld {public static void main(String[] args) {java.util.Date date=new java.util.Date();System.out.println(date.getTime());} } import static java.lang.Math.*; public class HelloWorld {public static void main(String[] args) {double x=30;double y=40;double result=sqrt(pow(x,2)+pow(y,2));System.out.println(result);} } 下面是另一種寫(xiě)法: import java.lang.Math; public class HelloWorld {public static void main(String[] args) {double x=30;double y=40;double result=Math.sqrt(Math.pow(x,2)+Math.pow(y,2));System.out.println(result);} } package Demo;import java.util.Date; import static java.lang.System.*; public class TestDemo{public static void main(String[] args) {out.println("生命在于運(yùn)動(dòng)");} }

下面是我們經(jīng)常使用的包:

1.java.lang:系統(tǒng)經(jīng)常引入的基礎(chǔ)類(lèi)(String,Object),此包在JDK1.1之后進(jìn)行自動(dòng)導(dǎo)入

2.java.lang.reflect:java反射編程包

3.java.net:進(jìn)行網(wǎng)絡(luò)編程開(kāi)發(fā)包

4.java.sql:進(jìn)行數(shù)據(jù)庫(kù)開(kāi)發(fā)的支持包

5.java.util:是java提供的工具程序包,集合類(lèi)等等

6.java.io:是IO編程開(kāi)發(fā)包

包的訪問(wèn)權(quán)限控制:

當(dāng)你的成員變量,不加任何的訪問(wèn)修飾限定符的時(shí)候,默認(rèn)是一個(gè)包訪問(wèn)權(quán)限

1)不加任何的字段作用,相當(dāng)于是default:默認(rèn)是包訪問(wèn)權(quán)限:只能在同一個(gè)包中的相同類(lèi)或者同一個(gè)包中的不同類(lèi)使用和進(jìn)行訪問(wèn)

只在包中使用 int a=10,這個(gè)變量不可以在包外使用,也就是說(shuō),這個(gè)變量只能在同一個(gè)包中的不同類(lèi)進(jìn)行使用和訪問(wèn),例如如果是一個(gè)類(lèi),class Test{},他的前面也沒(méi)有加任何的訪問(wèn)修飾限定符,所以他也只能在一個(gè)包中進(jìn)行訪問(wèn);只能在包內(nèi)new,不可以在包外new;

2)加上public之后,就可以在包外進(jìn)行訪問(wèn)了,同時(shí)在包內(nèi)也可以使用,任何地方都可以進(jìn)行訪問(wèn)

3)private:只可以在類(lèi)中進(jìn)行使用,在同一個(gè)包中的同一個(gè)類(lèi);

4)defalut:默認(rèn)為在同一個(gè)包內(nèi)可以訪問(wèn),包外不能訪問(wèn)

只可以在同一個(gè)包中進(jìn)行訪問(wèn),同一個(gè)包中的同一個(gè)類(lèi),同一個(gè)包中的不同類(lèi)都可以進(jìn)行訪問(wèn),別管是子類(lèi)還是非子類(lèi),只要出現(xiàn)了不同的包中,就不可以進(jìn)行訪問(wèn);

5)protected:在同一個(gè)包中和public沒(méi)有什么區(qū)別,它主要是體現(xiàn)在繼承上面的,同一個(gè)包中的同一個(gè)類(lèi),同一個(gè)包中的不同類(lèi),以及不同包中的子類(lèi)都可以進(jìn)行訪問(wèn);不同包中的非子類(lèi)是不可以進(jìn)行訪問(wèn)的(super.屬性),不同包必須繼承進(jìn)行訪問(wèn)?

總結(jié)

以上是生活随笔為你收集整理的JAVA面向对象(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。