String s="a" 和 String s=new String("a"); 这两个的区别是什么?
String str1="abc" 和 String str1=new String("abc"); 这两个的区别是什么?
麻烦高手说一下
[解决办法]
前者在编译的时候就将"abc"放在栈区的字符串常量池当中,并利用str1这个引用指向到这个字符串常量的引用,而后者是在运行的时候,在堆区创建一个字符串对象"abc"并利用str1指向这个对象获得引用,因此两个str1的引用指向的内存地址不同,而逻辑上str1输出的内容相同
[解决办法]
怎么老是有人问这个问题
String str1="abc"
str1是栈内变量,它的内存保存的是常量池的常量字符串对象对象"abc"的地址
String str1=new String("abc");
str1是栈内变量,它的内存保存的是堆中的new String对象的地址,new String在堆中生成对象,并用常量池的字符串对象"abc"初始化堆中的对象,所以堆中的对象的内存的内容和常量池对象的内存的内容一样,但是是不同的两个对象
[解决办法]
String str1=new String("abc");
两个对象,一个是“xyx”,一个是指向“xyx”的引用对象str1。
[解决办法]
这个看起来比较容易明白
import java.awt.Color;import java.awt.Graphics;/** * 使用Singleton pattern * @author xKF55811 * */public class Chessman { //定义2种棋子,new Chessman(1)为黑子,new Chessman(2)为白子 private static Chessman[] chessmanes = new Chessman[]{new Chessman(1),new Chessman(2)}; //棋子宽度 private static int width; //棋子长度 private static int height; //棋子类型(黑子或白子)表示 private int belong; /** * 获取棋子宽度 * @return 棋子宽度 */ public static int getWidth() { return width; } /** * 设置棋子宽度 * @param _width 棋子宽度 */ public static void setWidth(int _width) { width = _width; } /** * 获取棋子高度 * @return 棋子高度 */ public static int getHeight() { return height; } /** * 设置棋子高度 * @param _height 棋子高度 */ public static void setHeight(int _height) { height = _height; } /** * 设置棋子大小 * @param _width 棋子宽度 * @param _height 棋子长度 */ public static void setSize(int _width, int _height) { width = _width; height = _height; } //构造函数,设置标识 private Chessman(int belong) { this.belong = belong; } /** * 获取棋子标识 * @return 棋子标识 */ public int getBelong() { return belong; } /** * 获取棋子 * @param belong 棋子类型标识 * @return 对应的棋子 */ public synchronized static Chessman getChessman(int belong) { if(belong==1) { return chessmanes[0]; } else if(belong==2) { return chessmanes[1]; } return null; } /** * 根据坐标绘制棋子 * @param g 画布 * @param locationX 横坐标 * @param locationY 纵坐标 */ public void paint(Graphics g,int locationX,int locationY) { g.drawOval(locationX, locationY, width, height); if(belong==1) { g.setColor(Color.white); } g.fillOval(locationX, locationY, width, height); } }
[解决办法]
import java.awt.Graphics;
import javax.swing.JFrame;
public class ChessBoard extends JFrame {
/**
*
*/
//棋子数组
private Chessman[][] chessmanes;
//棋盘行数
private int rowCount;
//棋盘列数
private int colCount;
//棋格宽度
private int boxWidth = 50;
//棋格高度
private int boxHeight = 50;
private static final long serialVersionUID = 1L;
/**
* 设置棋格和棋子宽度
* @param width 棋格宽度
*/
public void setBoxWidht(int width)
{
boxWidth = width;
//设置棋子宽度
Chessman.setWidth(width);
}
/**
* 设置棋格和棋子高度
* @param height 棋格高度
*/
public void setBoxHeight(int height)
{
boxHeight = height;
//设置棋子高度
Chessman.setHeight(height);
}
/**
* 根据参数初始化棋盘行列数
* @param rowCount 棋盘行数
* @param colCount 棋盘列数
*/
private ChessBoard(int rowCount,int colCount)
{
this.rowCount = rowCount;
this.colCount = colCount;
//初始化棋盘
init();
}
/**
* 设置棋格和棋子大小
*/
public void setBoxSize(int boxWidth,int boxHeight)
{
this.boxWidth = boxWidth;
this.boxHeight = boxHeight;
//设置棋子大小
Chessman.setSize(boxWidth, boxHeight);
////重置棋盘大小
//this.setSize(colCount*boxWidth,rowCount*boxHeight+boxHeight/2);
}
/**
* 设置棋盘大小
*/
public void setSize(int width,int height)
{
super.setSize(width, height);
//重置棋格大小
setBoxSize(width/colCount, (int)((height*2.0f)/(rowCount*2+1)));
}
/**
* 初始化棋盘
*/
@SuppressWarnings("deprecation")
public void init()
{
//初始化棋子矩阵
chessmanes = new Chessman[rowCount][colCount];
//设置棋盘大小
this.setSize(colCount*boxWidth,rowCount*boxHeight+boxHeight/2);
//多余代码
show();
//重绘棋盘
repaint();
}
/**
* 棋盘绘制
*/
public void paint(Graphics g)
{
//绘制横线
for(int i=0;i<rowCount;i++)
{
int y = i*boxHeight+boxHeight/2;
g.drawLine(0, y, getWidth(), y);
}
//绘制纵线
for(int i=0;i<colCount;i++)
{
int x = i*boxWidth+boxWidth;
g.drawLine(x, 0, x, getHeight());
}
//绘制棋子
for(int i=0;i<rowCount;i++)
{
for(int j=0;j<colCount;j++)
{
if(chessmanes[i][j]!=null)
{
chessmanes[i][j].paint(g,j*boxWidth+boxWidth/2,(i+1)*boxHeight);
}
}
}
}
[解决办法]
http://blog.csdn.net/xiazdong/article/details/6723101
我这里面有图解。