對象的初始化過程
對象調用成員過程
單例設計模式
class Single
{
private Single(){}
private static Single p=new Single();
public static Single getInstance()
{
return p;
}
}
懶漢式(線程不安全,可以加入synchronized關鍵字,但是效率過低)class Single
{
private Single(){}
private static Single p=null;
public static /*synchronized */Single getInstance()
{
if(p==null)
p=new Single();
return p;
}
}
繼承(概述)
1.提高了代碼的複用性。
2.讓類與類之間產生了關係,有了這個關係,纔有了多態的特性
3.java語言中只支持單繼承(因爲多繼承容易帶來安全隱患。當多個類中定義了
相同功能,當功能內容不同時,子類對象不確定要運行哪一個.)
但是java保留了多繼承的機制,並用另一種體現形式來完成,即多實現。
4.查閱父類功能,創建子類對象使用功能。
注意:千萬不要爲了獲取其他類的功能,簡化代碼而繼承。
必須是類與類之間有所屬關係纔可以繼承。
只要讓學生和工人與單獨描述的這個類有關係就可以了。
class Person
{
String name;
int age
}
class Student extends Person
{
//String name;
//int age=;
void study()
{
System.out.println("good study");
}
}
class Worker extends Person
{
//String name;
//int age=;
void study()
{
System.out.println("good work");
}
}
子父類中的變量、方法和構造方法的關係
一、變量的特點子類要訪問本類中的變量,用this
子類要訪問父類中的同名變量,用super
super的使用和this的使用幾乎一致。
當子類對象調用該函數,會運行子類函數的內容。
如同父類的函數被覆蓋一樣。(父類的函數依然存在於內存中,只不過沒有運行)
這種情況是函數的另一個特性:重寫(覆蓋)
覆蓋:
1.子類覆蓋父類,必須保證子類權限大於等於父類權限。
2. 靜態只能覆蓋靜態。
注意:重寫與重載不同。
那是因爲子類的構造函數默認第一行有一條隱式的語句super()
super():會訪問父類中空參數的構造函數。而且子類中所有的構造函數第一行都是super()
2.爲什麼子類一定要訪問父類中的構造函數?
因爲父類中的數據子類可以直接獲取,所以子類對象在建立時,需要先查看父類是如何對這些數據進行初始化的。
所以子類在對象初始化時,要先訪問以下父類中的構造函數。
如果要訪問父類中指定的構造函數,可以通過手動定義super語句的方式來指定。
注意:super語句一定定義在子類構造函數的第一行。子類的構造函數的第一行也可以用子類的構造函數來代替
父類的構造函數,但是這並不影響對父類變量進行賦值,因爲子類的構造函數中總會有一個調用父類的構造函數
class Person
{
private String name;
Person(String name)
{
this.name=name;
}
void show(){}
}
class Student extends Person
{
Student(String name)
{
//super.name=name;
super(name);
}
void method()
{
super.show();
}
}
class Person
{
String name="zhangsan";
Person(){};
Person(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
}
class Student extends Person
{
String name;
Student(String name)
{
super(name);
}
/*public String getName()
{
return name;
}
*/
}
class ExtendsDemo5
{
public static void main(String[] args)
{
Student s=new Student("wqz");
String name=s.getName();
String name2=s.name;
System.out.println(name);//返回wqz
System.out.println(name2);//返回null
}
}
final關鍵字
一、概述模板方法模式
abstract class GetTime
{
public final void getTime()
{
long start =System.currentTimeMillis();
runCode();
long end =System.currentTimeMillis();
System.out.println("毫秒:"+(end-start));
}
public abstract void runCode();
}
class SubTime extends GetTime
{
public void runcode()
{
for(int x=0;x<100;x++)
{
System.out.print("x");
}
}
}
class TemplateDemo
{
public static void main(String[] args)
{
SubTime st=new SubTime();
st.getTime();
}
}
接口
interface Inter
{
public static final NUM=3;
public abstract void show();
}
class Test implements Inter
{
public void show(){}
}
class InterfaceDemo
{
public static void main(String[] args)
{
Test t=new Test();
System.out.println(t.NUM);
System.out.println(Test.NUM);
System.out.println(Inter.NUM);
}
}
abstract class Student
{
abstract void study();
void sleep()
{
System.out.println("sleep");
}
}
interface Smoking
{
void smoke();
}
class ZhangSan extends Student implements Smoking
{
void study(){};
public void smoke(){};
}
class Lisi extends Student
{
void study(){};
}
class InterfaceDemo
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
Object類
該類中定義的成員,是所有對象都具備的。
class Person
{
}
class Demo
{
}
class Demo1
{
private int num;
Demo1(int num)
{
this.num=num;
}
public boolean equals(Object obj)
{
if(obj instanceof Demo1)
{
Demo1 d=(Demo1)obj;
return this.num==d.num;
}
else
return false;
}
}
class ObjectDemo
{
public static void main(String[] args)
{
Demo d1=new Demo();
Demo d2=new Demo();
Demo d3=d1;
Demo1 d4=new Demo1(4);
Demo1 d5=new Demo1(4);
Demo1 d6=new Demo1(5);
Person p=new Person();
System.out.println(d1.equals(d2));//false
System.out.println(d1.equals(d3));//true
System.out.println(d1==d2);//false
System.out.println(d1==d3);//true
System.out.println(d4.equals(d5));//返回true
System.out.println(d4.equals(d6));//返回false
System.out.println(d4.equals(p));//返回false
//其實,equals()方法比較的就是————地址。
}
}
三、代碼(toSting()方法)
public String toString()
{
return getClass().getName() + '@' + Integer.toHexString(hashCode());
}
包與包之間訪問
DemoA a=new DemoA();
^
符號: 類 DemoA
位置: 類 PackageDemo
PackageDemo.java:6: 錯誤: 找不到符號
DemoA a=new DemoA();
^
符號: 類 DemoA
位置: 類 PackageDemo
錯誤原因:類名寫錯。因爲類名的全名是:報名.類名
②PackageDemo.java:6: 錯誤: 程序包packa不存在
packa.DemoA a=new packa.DemoA();
^
PackageDemo.java:6: 錯誤: 程序包packa不存在
packa.DemoA a=new packa.DemoA();
錯誤原因:packa包不在當前目錄下,需要設置classpath,告訴jvm去哪裏找指定的packa包
③PackageDemo.java:6: 錯誤: DemoA在packa中不是公共的; 無法從外部程序包中對其進行訪
問
packa.DemoA a=new packa.DemoA();
^
PackageDemo.java:6: 錯誤: DemoA在packa中不是公共的; 無法從外部程序包中對其進行訪
問
packa.DemoA a=new packa.DemoA();
錯誤原因:有了包範圍變大,一個包中的類要被訪問,必須要有足夠大的權限,所以被訪問的類要被public修飾
④PackageDemo.java:6: 錯誤: DemoA在packa中不是公共的; 無法從外部程序包中對其進行訪
問
packa.DemoA a=new packa.DemoA();
^
PackageDemo.java:6: 錯誤: DemoA在packa中不是公共的; 無法從外部程序包中對其進行訪
問
packa.DemoA a=new packa.DemoA();
錯誤原因:類共有後,被訪問的成員也要公有,纔可以被訪問。
總結:
①包與包之間進行訪問,被訪問的包中的類以及類中的成員,需要public修飾
②不同包中的子類,還可以直接訪問父類中被protected修飾的成員
public protected defalut private
同一個類中 ok ok ok ok
同一個包中 ok ok ok
子類 ok ok
不同包中 ok
基本數據類型——對象包裝類
基本數據類型對象包裝類
byte Byte
*int Integer
short Short
long Long
boolean Boolean
float Float
double Double
*char Character
基本數據類型對象包裝類,
1.最常見的作用————用於基本數據類型和字符串類型之間做轉換
1.1基本數據類型轉成字符串
基本數據類型+""
基本數據類型包裝類.toString(基本數據類型值)
如:Integer.toString(34);將34整數編程"34"
1.2字符串轉成基本數據類型
xxx a=Xxx.parseXxx(String)
如:int a=Integer.parseInt("123");
如果int a=Integer.parseInt("a123");會報數字格式異常。
Integer i=new Integer("123");
int num=i.intValue();
2.十進制與其他進制進行轉換
2.1 十進制轉成其他進制
二進制:toBinaryString();
十六進制:toHexString();
八進制:toOctalString();
2.2 其他進制轉成十進制
parseInt(String,radix);
例:Integer.parseIn("110",10)
基本數據類型——對象包裝類新特性
class
{
public static void main(String[] args)
{
Integer x=4;//JDK1.5以後新特性————自動裝箱。即自動完成了new Integer(4);
x=x+2;//自動拆箱,變成了int類型,所以能和2進行數學運算。再將所得和,進行裝箱賦給x.自動拆箱,實際上是進行了x.intValue()操作。
}
public static void method()
{
Integer x=new Integer("123");
Integer y=new Integer(123);
System.out.println(x==y);//false
System.out.println(x.equals(y));//true
}
public static void method1()
{
Integer m=128;
Integer n=128;
System.out.println(m==n);//false
Integer a=127;
Integer b=127;
System.out.println(a==b);//true
//因爲數值在byte(-128,127)範圍內,對於新特性,如果該數已經存在,則不會開闢新空間。
}
}