p2=p1不是Point對(duì)象賦值,而是引用賦值。這和C++不一樣。
在茌平等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都網(wǎng)站制作、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都營(yíng)銷(xiāo)網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,茌平網(wǎng)站建設(shè)費(fèi)用合理。
在java里邊,p1、p2、point和temp都是引用,而不是對(duì)象本身,引用就象C++的指針。上面的程序中,p2=p1的結(jié)果是,p2指向的對(duì)象和p1相同,他們都指向了p1=new Point()語(yǔ)句創(chuàng)建的對(duì)象。而Point p2=new Point(); 創(chuàng)建的對(duì)象,因?yàn)閜2不再引用它而變成垃圾,java會(huì)自動(dòng)刪除。
java的引用賦值就象C++的指針賦值,就類(lèi)似C++程序:
Point * p1=new Point();
Point * p2=new Point();
p2=p1;
所以你上面的程序也有這個(gè)問(wèn)題,temp=point;其實(shí)沒(méi)什么用,效果把Point temp=new mypoint(); 創(chuàng)建的對(duì)象刪除了,被壓棧的對(duì)象還是point,所以去掉這兩句,效果完全一樣。
如果你想復(fù)制一個(gè)新對(duì)象壓棧,應(yīng)該用java的clone方法,
temp=point.clone();
不過(guò)Point必須實(shí)現(xiàn)Clonable接口,并且正確實(shí)現(xiàn)它。
參看: 1 import java.util.*; 2 3 public class TestStack { 4 public static void main(String[] args) { 5 Stack stack = new Stack(); 6 7 for(int i = 0; i 10; i++) { 8 stack.push(new Integer(i)); 9 }1011 if(!stack.empty()) {12 System.out.println(stack.pop());13 }14 }15 }
public class Stack {
private Object[] stack;
//這個(gè)不需要;
//private int top = 0; //初始化棧頂
//這個(gè)也不需要;
//寫(xiě)一個(gè)棧出來(lái),最好是可以動(dòng)態(tài)的,可以自己改變大小的,即數(shù)組的長(zhǎng)度;
//private int size = 0; // 初始化大小
//元素個(gè)數(shù);
private int size;
//默認(rèn)長(zhǎng)度為10;
public Stack(){
this(10);
}
//也可以自己設(shè)置長(zhǎng)度,即容量;
public Stack(int len){
stack = new Object[len];
}
//返回元素個(gè)數(shù);
public int size(){
return size;
}
//返回?cái)?shù)組長(zhǎng)度,即容量;
public int capacity(){
return stack.length;
}
//實(shí)現(xiàn)動(dòng)態(tài)的數(shù)組;
public void ensureCapacity(){
if(size() == capacity()){
Object[] newStack = new Object[size() * 3 / 2 + 1];
System.arraycopy(stack, 0, newStack, 0, size());
stack = newStack;
}
}
//入棧;
public void push(Object o){
size++;
ensureCapacity();
stack[size - 1] = o;
}
/*
public void push(Object object) {
if (isFull()) {
System.out.println("棧滿(mǎn)! 入棧失敗");
}
stack[top++] = object;
}
*/
//判空;
public boolean isEmpty(){
return size == 0;
}
//出棧;
public Object pop(){
//首先要判空;
if(isEmpty()){
throw new ArrayIndexOutOfBoundsException("不能為空");
}
Object o = stack[--size];
stack[size] = null;
return o;
}
/*
// 出棧
public Object pop() {
Object object = stack[--top];
stack[top] = null;
return object;
}
*/
/*
// 計(jì)算棧當(dāng)前大小
public int size() {
return top;
}
// 判斷是否是空棧
public boolean isEmpey() {
return top == 0;
}
// 判斷是否棧滿(mǎn)
public boolean isFull() {
return top = size;
}
public Stack(int size) {
this.size = size;
}
*/
public static void main(String[] args) {
Stack stack = new Stack(3);
String[] data = new String[] { "a", "b", "c" };
for (int i = 0; i data.length; i++) {
stack.push(data[i]);
System.out.println(data[i] + "");
}
System.out.println("***********");
while (!stack.isEmpty()) {
System.out.println(stack.pop() + "");
}
//}
}
}
你自己對(duì)比一下,我是在你的里面修改的
和C++里面一樣,有入棧,彈棧,查找函數(shù)
import java.util.*;(引入包含棧類(lèi)的頭文件)
相關(guān)函數(shù)介紹
boolean empty()
測(cè)試堆棧是否為空。
E peek()
查看堆棧頂部的對(duì)象,但不從堆棧中移除它。
E pop()
移除堆棧頂部的對(duì)象,并作為此函數(shù)的值返回該對(duì)象。
E push(E item)
把項(xiàng)壓入堆棧頂部。
int search(Object o)
返回對(duì)象在堆棧中的位置,以 1 為基數(shù)。
使用java.util包中的Stack類(lèi)創(chuàng)建一個(gè)棧對(duì)象
public Object push(Object data);輸入數(shù)據(jù),實(shí)現(xiàn)壓棧
public Object pop();輸出數(shù)據(jù),實(shí)現(xiàn)彈棧
public boolean empty()判空
public Object peek();查看棧頂元素
可以去查查API嘛
我也是學(xué)java的,大家一起進(jìn)步。