java代码编程时,做初始化(不用new()方法),怎么做?

java代码编程时,做初始化(不用new()方法),怎么做?

4个回答

 public class AccpTeacher {
    private String name;

    private int age;

    public AccpTeacher() {
        name = "无名氏";
        age = 22;
    }

    public AccpTeacher(String name) {
        this.name = name;
        this.age = 22;
    }

    public String toString() {
        return "名字是:" + name;
    }

    public String toString(int age, String name) {
        this.name = name;
        this.age = age;
        return "名字是:" + name + ";年龄是:" + age;
    }
}


public static void main(String[] args){
    // 实例化一个类
    Object accpTeacher = Class.forName(AccpTeacher.class.getName()).newInstance();
    System.out.println(accpTeacher);
}

使用Class.forName来获取对应的类,采纳的答案是无参数构造方法的常用调用方式,如果是有参数的,则需要使用Constructor类。可以参考这里:http://blog.csdn.net/shenyunsese/article/details/11737179

tongyi55555
JonsonJiao 回复大一能: 过奖了,我也是刚入门。
4 年多之前 回复
jiuwohuge
叶芝殇 明明这才是最佳答案,只给出代码的不是最好的,要自己思考,尝试
4 年多之前 回复

public class key {

private static String name;
public key(){ 使用构造方法赋值
    name="ssss";
} 
public static void main(String[] args) throws IOException {
    key k=new key();
    System.out.println(k.name);
}

}

一般都提供无参构造。飘过。。。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java编程中的初始化问题
为啥初始化字符串数组要放在无参构造函数中?放在外面时,就会报数组越界异常?代码如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.HashMap; import java.util.Map; import com.bdqn.hibernate.model.Student; public class Session { //模拟配置文件 String tableName="_Student"; Map<String, String> cfs=new HashMap<String, String>(); //定义一个String数组,来存储方法名 String[] methodNames; public Session() { cfs.put("_id", "id"); cfs.put("_name", "name"); cfs.put("_age", "age"); methodNames=new String[cfs.size()]; } public void save(Student s) throws Exception{ //创建sql语句 String sql=createSql(); //加载驱动类 /*Class.forName("com.mysql.jdbc.Driver"); Connection conn=DriverManager.getConnection( "jdbc:mysql://localhost:3306/hibernate", "root", ""); PreparedStatement pst=conn.prepareStatement(sql); pst.executeUpdate(); pst.close(); conn.close();*/ } private String createSql() { String str1=""; //定义变量,用来存储方法名数组的下标 int index=0; for(String s:cfs.keySet()){ //通过键获取值 String value=cfs.get(s); //将值的首字母转换成大写 value=Character.toUpperCase(value.charAt(0))+value.substring(1); //获取方法名 methodNames[index]="get"+value; System.out.println(methodNames[index]); index++; str1+=s+","; } str1=str1.substring(0, str1.length()-1); System.out.println(str1); String str2=""; for(int i=0; i<cfs.size(); i++){ str2+="?,"; } str2=str2.substring(0, str2.length()-1); System.out.println(str2); String sql="insert into "+tableName+" ("+str1+") value("+str2+")"; System.out.println(sql); return sql; } }
Java 初始化问题
<div class="iteye-blog-content-contain" style="font-size: 14px;"> <p>代码如下:</p> <pre name="code" class="java">public class Test { Test t = new Test(); public static void main(String[] args) { Test t = new Test(); } }</pre> <p> </p> <p>想请问一下,程序为何会报错误:Exception in thread "main" java.lang.StackOverflowError;</p> <p> </p> <p>堆栈溢出了;据我测试得到的结果是:上面那行初始化代码一直循环执行导致堆栈溢出,想知道为什么?</p> <p> </p> <p>PS:第一次在ITeye发帖,以前是在CSDN发帖,如有不对的地方,请指出;</p> <p> </p> </div>
flex java结合页面初始化
<pre name="code" class="java">initialize="view1_initializeHandler(event)" </pre> <p> 在容器里我用这个方法初始化,然后调用remoteObjec访问java方法,返回个结果</p> <pre name="code" class="flex"> var reObj:RemoteObject=new RemoteObject(); reObj.destination="initdService"; reObj.endpoint="http://localhost:8080/BL/messagebroker/amf"; reObj.findHotPicList(); reObj.addEventListener(ResultEvent.RESULT,function(re:ResultEvent):void{ re.stopImmediatePropagation(); hotPicList=ArrayCollection(re.token.result); }); if(hotPicList!=null){*****}</pre> <p> 可是为什么总是第一次没结果,但是看java控制台确实已经调用了,只有再进这个页面时结果才出来。</p>
小白课设第一次编程Java,这里出错怎么办
第一次学习java,以下是整个程序段,出错那里应该怎么改。 ``` package util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.text.SimpleDateFormat; import java.util.Date; import javax.servlet.http.HttpServletRequest; import model.User; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipOutputStream; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import dao.UserDao; public class Util { public static String getTime2() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); Date date = new Date(); return sdf.format(date.getTime()); } public static String getTime() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); return sdf.format(date.getTime()); } public static String getRiqi() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); return sdf.format(date.getTime()); } public static String getYuefen() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); Date date = new Date(); return sdf.format(date.getTime()); } // 上传文件/复制文件。 public static void copyFile(File src, File dst) { try { int BUFFER_SIZE = 16 * 1024; InputStream in = null; OutputStream out = null; try { in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE); out = new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE); byte[] buffer = new byte[BUFFER_SIZE]; for (int byteRead = 0; (byteRead = in.read(buffer)) > 0;) { out.write(buffer, 0, byteRead); } } finally { if (null != in) { in.close(); } if (null != out) { out.close(); } } } catch (Exception e) { e.printStackTrace(); } } public static void createZip(String src, String nilename, String path) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ZipOutputStream zipOut = new ZipOutputStream(bos); zipOut.setEncoding("gbk"); File file = new File(path, src); byte[] buffer = new byte[4096]; int bytes_read; InputStream fis = new FileInputStream(file); zipOut.putNextEntry(new ZipEntry(src)); while ((bytes_read = fis.read(buffer)) != -1) { zipOut.write(buffer, 0, bytes_read); } zipOut.closeEntry(); fis.close(); zipOut.close(); FileOutputStream fout = new FileOutputStream(new File(path, nilename)); bos.writeTo(fout); fout.flush(); fout.close(); } //初始化系统 public static void init(HttpServletRequest request){ WebApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext()); UserDao userDao = (UserDao)app.getBean("userDao"); User user = userDao.selectBean(" where username='admin' and userlock=0 "); if(user==null){ user = new User(); user.setPassword("111111"); user.setRole(1); user.setTruename("admin"); user.setUsername("admin"); userDao.insertBean(user); } } } ``` ![图片说明](https://img-ask.csdn.net/upload/202001/03/1578016411_198621.png) ![图片说明](https://img-ask.csdn.net/upload/202001/03/1578017373_802226.png)
java new一个新的类后面接{}有什么用途?
像下面这段代码,ThreadLocal在初始化的时候后面接了一个方法,我在自己的代码中也试了一下,可以再大括号中定义变量定义方法,但是外部是不能调用的,我想知道这样写除了初始化还有什么用途和意义呢? [code="java"] private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){ public Integer initialValue(){ return 0; } }; [/code]
Java并发编程实战中创建不可变容器对象为什么是线程安全?
学习Java并发编程实战时,为什么说VolatileCachedFactorizer类是线程安全的? 多个线程同时调用service方法时,不会造成初始化多次cache对象吗? OneValueCache类: ``` public class OneValueCache { private final BigInteger lastNumber; private final BigInteger[] lastFactors; public OneValueCache(BigInteger i, BigInteger[] factors) { lastNumber = i; lastFactors = Arrays.copyOf(factors, factors.length); } public BigInteger[] getFactors(BigInteger i) { if (lastNumber == null || !lastNumber.equals(i)) return null; else return Arrays.copyOf(lastFactors, lastFactors.length); } } ``` VolatileCachedFactorizer类: ``` public class VolatileCachedFactorizer extends GenericServlet implements Servlet { private volatile OneValueCache cache = new OneValueCache(null, null); public void service(ServletRequest req, ServletResponse resp) { BigInteger i = extractFromRequest(req); BigInteger[] factors = cache.getFactors(i); if (factors == null) { factors = factor(i); cache = new OneValueCache(i, factors); } encodeIntoResponse(resp, factors); } void encodeIntoResponse(ServletResponse resp, BigInteger[] factors) { } BigInteger extractFromRequest(ServletRequest req) { return new BigInteger("7"); } BigInteger[] factor(BigInteger i) { // Doesn't really factor return new BigInteger[]{i}; } } ```
Socket网络编程时输入流的阻塞问题
各位大神好,我在学习java网络编程时想要建立既可以压缩又可以加密的流,但是在代码 执行过程中在服务器端的输入流建立时被阻塞了,代码无法继续走下去。经过调查我认为 是因为该输入流没有得到从客户端输出流发送过来的数据所以被阻塞了。虽然知道了原因 但是我本人实在是不知道怎么改这段代码,已经被困了一个星期了,这个问题还是没有解 决。如果有知道的大神请您务必帮帮忙,谢谢了。 以下是代码: 服务器端初始化: serverSession(){ initInput(); initOutput(); } 客户端初始化: clientSession(){ initOutput(); initInput(); } initOutput(){ BufferedOutputStream bos = new BufferedOutputStream(soc_.getOutputStream()); String KEY = "abc_1234_ef@1234"; String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; String KEY_ALGORITHM = "AES"; SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes(), KEY_ALGORITHM); Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); CipherOutputStream cos = new CipherOutputStream(bos, cipher); byte[] iv = cipher.getIV(); bos.write(iv); GZIPOutputStream gos = new GZIPOutputStream(cos); ObjectOutputStream oos = new ObjectOutputStream(gos); oos.flush(); gos.flush(); cos.flush(); bos.flush(); } initInput(){ BufferedInputStream is = new BufferedInputStream(soc_.getInputStream()); byte[] iv = new byte[16]; is.read(iv); String KEY = "abc_1234_ef@1234"; String DEFAULT_CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; String KEY_ALGORITHM = "AES"; SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes(), KEY_ALGORITHM); Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, skeySpec, new IvParameterSpec(iv)); CipherInputStream cis = new CipherInputStream(is, cipher); GZIPInputStream gis = new GZIPInputStream(cis); ObjectInputStream ois = new ObjectInputStream(gis); }
java编程,我这段代码是在ecplise上实现的,但DEBUG都没问题,运行后却什么都没有弹出
Dubug上显示, <terminated>SLinkedList [Java Application] <terminated, exit value: 0>C:\Program Files\Java\jdk1.7.0_07\bin\javaw.exe (2013-5-7 下午8:46:10) 系统变量的Path为C:\Program Files\Java\jdk1.7.0_07\bin; classpath.;%JAVA_HOME%\lib; 以下为代码: @author Administrator * */ //java ADT import java.awt.*; class SLinkedList{//插入和删除操作分为头尾和中间,对于头,前一个为空,对于尾,后一个结点为空,需要分别对待. public class book{ protected int number; protected String title; protected String writer; protected double pricing; protected String publishinghouse; book next; //这便是一个指针,只不过它是引用. public book(int number,double pricing,String title,String writer,String publishinghouse) { this.number=number; this.pricing=pricing; this.title=title; this.writer=writer; this.publishinghouse=publishinghouse; this.next=null; } } protected book head,tail;//链表类的保护数据成员 public SLinkedList() { head = tail = null; } //创建空链表 public boolean isEmpty() { return head == null; } //判断链表是否为空 public void addToHead(int number,double pricing,String title,String writer,String publishinghouse) { head=new book(number,pricing,title,writer,publishinghouse); //创建头结点 if(tail==null) tail=head; } public void addToTail(int number,double pricing,String title,String writer,String publishinghouse) { if(!isEmpty()) {//若链表非空那么将为指针的next初始化为新元素 tail.next=new book(number,pricing,title, writer, publishinghouse); tail=tail.next; //以书号number作为标识符 }else { //如果为空则创建新的,并将头尾指向它 head=tail=new book(number,pricing,title,writer,publishinghouse); } } public void addFirst(int number,double pricing,String title,String writer,String publishinghouse) { book newNode=new book(number,pricing,title,writer,publishinghouse); newNode.next = head; head = newNode; } //表头插入节点,高效率,这是插入操作之一 public void addLast(int number,double pricing,String title,String writer,String publishinghouse) { book newNode = new book(number,pricing,title,writer,publishinghouse); book p = head; while (p.next != null) p = p.next;//一直到next到表尾 p.next = newNode; newNode.next = null; } //表尾插入结点,在表尾接一个 public void removeFirst() { if (!isEmpty()) head = head.next; else System.out.println("The list have been emptied!"); } //表头删除结点,只需让表头指向下一个结点 public void removeLast() { //prev为前一个结点的指针,curr为当前的指针 book prev = null, curr = head; //删除表尾的结点 while(curr.next != null) { prev = curr; curr = curr.next; if(curr.next == null) prev.next=null; //使前一个结点指向空,则原本的表尾结点便断开了 } }//removeLast public boolean insert(int appointednumber,int number,double pricing,String title,String writer,String publishinghouse) {//结点插入到链表某一位置 book prev = head, curr = head.next; book newNode; newNode = new book(number, pricing, title, writer, publishinghouse); if(!isEmpty()) { while( (curr!= null) && (appointednumber==curr.number) ) { //两个判断条件不能换 当前不为空,且指定num一致. prev = curr; curr = curr.next; //appointednumber为指定插入的位置 } newNode.next = curr;//新结点的next指针指向当前cur,即要插入的位置的下一个结点 prev.next = newNode; //cur指向了要插入的结点 return true; } return false; } public void remove(int number){//删除指定位置的结点 book curr=head; book prev=null; boolean found=false; while((curr!=null)&&(!found)) { if(number==curr.number ) { if(prev==null) removeFirst(); else prev.next=curr.next; found=true; } else{ prev=curr; curr=curr.next ;//未找到要删除的位置则继续找,指针后移 } }//while }//remove public book index(int number)//查询操作 { //用index确定要找的number book p; for(p=head;p!=null;p=p.next ){ if(p.number==number) return p; number++; } System.out.print("Error!"); return null;//找不到,返回-1 } public int Length(SLinkedList L){//返回链表长度 int l=0; book p=head; while(p.next!=null) { p=p.next ; l=l+1;} return l; } public void Insertsort(SLinkedList L) { //按关键字即number非递减排序 //对链表L作直接插入排序(不需要移动元素) book p=L.head.next; book q=L.head;//q为前面的,p为后面的 book ptr=null; if(!isEmpty()){ for(int j=2;j<=Length(L);j++) { if(p.number>q.number) p=p.next; else { ptr=L.head ; if(q==L.head) { book ptr0=head; while(ptr0.next!=q) {ptr0=ptr0.next ;} ptr0.next=p.next; p.next=q; //找到p结点的后一个结点,将p结点的前一个结点的指针指向p之后的那个结点 }//q为头结点,第一趟 while(ptr.next!=q) {ptr=ptr.next ;}//while book ptr1=q; while(ptr1.next !=p) {ptr1=ptr1.next; } ptr.next =p; ptr1.next=p.next; p.next=q; //换了指针,结点的next域没变,故结点位置也没变 book m=q; q=p; p=m; p=p.next;q=q.next; }//else }//for }//if else System.out.print("排序失败,记录为空");//-1表示为空,错误,不能排序 }//insert public book SelectMinKey(SLinkedList L,int i){//为了简单选择排序,返回最小的number book pt=L.head; book p1; while(i>1){ ; pt=pt.next; i--; } p1=pt.next; while(p1.next!=null){ if(pt.number>p1.number) {book s=p1;p1=pt;pt=s; } p1=p1.next; }//比pt所指number小的则交换,p1与ptr一直比较下去直到链表全部都已经比较过了 return pt; }//SelectMinKey public void Selectionsort(SLinkedList L) {//简单选择排序,堆排序是一维数组存储才比较方便 if(L.head==null) System.out.print("Error,linkedlist is empty!"); if(L.head.next==null) System.out.print("Okay!There is only one book"); //以上需要修饰,给出友好互动界面 for(int i=1;i<=Length(L);i++){ //仍以number作为关键字进行排序 book j=null;book p=L.head ; while(i>1){ ; p=p.next; i--; } j=SelectMinKey(L,i); if(p!=j) //链表结点的交换,只需改变指针,改变next域 { book j1=head; book j2=head; while(j1.next!=p){j1=j1.next ;}//利用两个指针j1j2储存指向p和j的next域 while(j2.next!=j){j2=j2.next ;} j1.next=p.next ;j2.next=j.next ;p.next=j2.next;j.next=j1.next ; } } } public static void main(String[] args) { Frame frm=new Frame("SlinkedList!"); frm.setSize(300,200); frm.setLocation(500, 400); Panel pan=new Panel(); pan.setSize(150,100); pan.setLocation(50,50); pan.setBackground(Color.gray ); Button bun=new Button("yes"); bun.setSize(80, 20); bun.setLocation(50, 50); bun.setBackground(Color.yellow ); frm.setLayout(null); pan.setLayout(null); pan.add(bun); frm.add(pan); SLinkedList L=new SLinkedList(); L.addToHead(00,80.2,"AB", "Steven", "xx publishinghouse"); L.index(00); } }//class SLinkedList
java中Map容器的填充(java编程思想中的一个例子,看不明白)
例子中的数据集是由世界上的国家以及它们的首都构造的二维数组,capitals()方法产生国家与首都的Map,你可以通过提供表所需尺寸的int参数来获取部分列表,上代码: public class Countries2 { //由世界上的国家以及它们的首都构造的二维数组 public static final String[][] DATA = { // Africa {"ALGERIA","Algiers"}, {"ANGOLA","Luanda"}, {"BENIN","Porto-Novo"}, {"BOTSWANA","Gaberone"}, {"BURKINA FASO","Ouagadougou"}, {"BURUNDI","Bujumbura"}, {"CAMEROON","Yaounde"}, {"CAPE VERDE","Praia"}, {"CENTRAL AFRICAN REPUBLIC","Bangui"}, {"CHAD","N'djamena"}, {"COMOROS","Moroni"}, {"CONGO","Brazzaville"}, {"DJIBOUTI","Dijibouti"}, {"EGYPT","Cairo"}, {"EQUATORIAL GUINEA","Malabo"}, {"ERITREA","Asmara"}, {"ETHIOPIA","Addis Ababa"}, {"GABON","Libreville"}, {"THE GAMBIA","Banjul"}, {"GHANA","Accra"}, {"GUINEA","Conakry"}, {"BISSAU","Bissau"}, {"COTE D'IVOIR (IVORY COAST)","Yamoussoukro"}, {"KENYA","Nairobi"}, {"LESOTHO","Maseru"}, {"LIBERIA","Monrovia"}, {"LIBYA","Tripoli"}, {"MADAGASCAR","Antananarivo"}, {"MALAWI","Lilongwe"}, {"MALI","Bamako"}, {"MAURITANIA","Nouakchott"}, {"MAURITIUS","Port Louis"}, {"MOROCCO","Rabat"}, {"MOZAMBIQUE","Maputo"}, {"NAMIBIA","Windhoek"}, {"NIGER","Niamey"}, {"NIGERIA","Abuja"}, {"RWANDA","Kigali"}, {"SAO TOME E PRINCIPE","Sao Tome"}, {"SENEGAL","Dakar"}, {"SEYCHELLES","Victoria"}, {"SIERRA LEONE","Freetown"}, {"SOMALIA","Mogadishu"}, {"SOUTH AFRICA","Pretoria/Cape Town"}, {"SUDAN","Khartoum"}, {"SWAZILAND","Mbabane"}, {"TANZANIA","Dodoma"}, {"TOGO","Lome"}, {"TUNISIA","Tunis"}, {"UGANDA","Kampala"}, {"DEMOCRATIC REPUBLIC OF THE CONGO (ZAIRE)", "Kinshasa"}, {"ZAMBIA","Lusaka"}, {"ZIMBABWE","Harare"}, // Asia {"AFGHANISTAN","Kabul"}, {"BAHRAIN","Manama"}, {"BANGLADESH","Dhaka"}, {"BHUTAN","Thimphu"}, {"BRUNEI","Bandar Seri Begawan"}, {"CAMBODIA","Phnom Penh"}, {"CHINA","Beijing"}, {"CYPRUS","Nicosia"}, {"INDIA","New Delhi"}, {"INDONESIA","Jakarta"}, {"IRAN","Tehran"}, {"IRAQ","Baghdad"}, {"ISRAEL","Jerusalem"}, {"JAPAN","Tokyo"}, {"JORDAN","Amman"}, {"KUWAIT","Kuwait City"}, {"LAOS","Vientiane"}, {"LEBANON","Beirut"}, {"MALAYSIA","Kuala Lumpur"}, {"THE MALDIVES","Male"}, {"MONGOLIA","Ulan Bator"}, {"MYANMAR (BURMA)","Rangoon"}, {"NEPAL","Katmandu"}, {"NORTH KOREA","P'yongyang"}, {"OMAN","Muscat"}, {"PAKISTAN","Islamabad"}, {"PHILIPPINES","Manila"}, {"QATAR","Doha"}, {"SAUDI ARABIA","Riyadh"}, {"SINGAPORE","Singapore"}, {"SOUTH KOREA","Seoul"}, {"SRI LANKA","Colombo"}, {"SYRIA","Damascus"}, {"TAIWAN (REPUBLIC OF CHINA)","Taipei"}, {"THAILAND","Bangkok"}, {"TURKEY","Ankara"}, {"UNITED ARAB EMIRATES","Abu Dhabi"}, {"VIETNAM","Hanoi"}, {"YEMEN","Sana'a"}, // Australia and Oceania {"AUSTRALIA","Canberra"}, {"FIJI","Suva"}, {"KIRIBATI","Bairiki"}, {"MARSHALL ISLANDS","Dalap-Uliga-Darrit"}, {"MICRONESIA","Palikir"}, {"NAURU","Yaren"}, {"NEW ZEALAND","Wellington"}, {"PALAU","Koror"}, {"PAPUA NEW GUINEA","Port Moresby"}, {"SOLOMON ISLANDS","Honaira"}, {"TONGA","Nuku'alofa"}, {"TUVALU","Fongafale"}, {"VANUATU","< Port-Vila"}, {"WESTERN SAMOA","Apia"}, // Eastern Europe and former USSR {"ARMENIA","Yerevan"}, {"AZERBAIJAN","Baku"}, {"BELARUS (BYELORUSSIA)","Minsk"}, {"BULGARIA","Sofia"}, {"GEORGIA","Tbilisi"}, {"KAZAKSTAN","Almaty"}, {"KYRGYZSTAN","Alma-Ata"}, {"MOLDOVA","Chisinau"}, {"RUSSIA","Moscow"}, {"TAJIKISTAN","Dushanbe"}, {"TURKMENISTAN","Ashkabad"}, {"UKRAINE","Kyiv"}, {"UZBEKISTAN","Tashkent"}, // Europe {"ALBANIA","Tirana"}, {"ANDORRA","Andorra la Vella"}, {"AUSTRIA","Vienna"}, {"BELGIUM","Brussels"}, {"BOSNIA","-"}, {"HERZEGOVINA","Sarajevo"}, {"CROATIA","Zagreb"}, {"CZECH REPUBLIC","Prague"}, {"DENMARK","Copenhagen"}, {"ESTONIA","Tallinn"}, {"FINLAND","Helsinki"}, {"FRANCE","Paris"}, {"GERMANY","Berlin"}, {"GREECE","Athens"}, {"HUNGARY","Budapest"}, {"ICELAND","Reykjavik"}, {"IRELAND","Dublin"}, {"ITALY","Rome"}, {"LATVIA","Riga"}, {"LIECHTENSTEIN","Vaduz"}, {"LITHUANIA","Vilnius"}, {"LUXEMBOURG","Luxembourg"}, {"MACEDONIA","Skopje"}, {"MALTA","Valletta"}, {"MONACO","Monaco"}, {"MONTENEGRO","Podgorica"}, {"THE NETHERLANDS","Amsterdam"}, {"NORWAY","Oslo"}, {"POLAND","Warsaw"}, {"PORTUGAL","Lisbon"}, {"ROMANIA","Bucharest"}, {"SAN MARINO","San Marino"}, {"SERBIA","Belgrade"}, {"SLOVAKIA","Bratislava"}, {"SLOVENIA","Ljuijana"}, {"SPAIN","Madrid"}, {"SWEDEN","Stockholm"}, {"SWITZERLAND","Berne"}, {"UNITED KINGDOM","London"}, {"VATICAN CITY","---"}, // North and Central America {"ANTIGUA AND BARBUDA","Saint John's"}, {"BAHAMAS","Nassau"}, {"BARBADOS","Bridgetown"}, {"BELIZE","Belmopan"}, {"CANADA","Ottawa"}, {"COSTA RICA","San Jose"}, {"CUBA","Havana"}, {"DOMINICA","Roseau"}, {"DOMINICAN REPUBLIC","Santo Domingo"}, {"EL SALVADOR","San Salvador"}, {"GRENADA","Saint George's"}, {"GUATEMALA","Guatemala City"}, {"HAITI","Port-au-Prince"}, {"HONDURAS","Tegucigalpa"}, {"JAMAICA","Kingston"}, {"MEXICO","Mexico City"}, {"NICARAGUA","Managua"}, {"PANAMA","Panama City"}, {"ST. KITTS","-"}, {"NEVIS","Basseterre"}, {"ST. LUCIA","Castries"}, {"ST. VINCENT AND THE GRENADINES","Kingstown"}, {"UNITED STATES OF AMERICA","Washington, D.C."}, // South America {"ARGENTINA","Buenos Aires"}, {"BOLIVIA","Sucre (legal)/La Paz(administrative)"}, {"BRAZIL","Brasilia"}, {"CHILE","Santiago"}, {"COLOMBIA","Bogota"}, {"ECUADOR","Quito"}, {"GUYANA","Georgetown"}, {"PARAGUAY","Asuncion"}, {"PERU","Lima"}, {"SURINAME","Paramaribo"}, {"TRINIDAD AND TOBAGO","Port of Spain"}, {"URUGUAY","Montevideo"}, {"VENEZUELA","Caracas"}, }; //此类需要定制定制Set实现和定制Map.Entry类 private static class FlyweightMap extends AbstractMap<String, String>{ private static Set<Map.Entry<String, String>> entries = new EntrySet(DATA.length); //定制的Map.Entry类 private static class Entry implements Map.Entry<String, String>{ int index; public Entry(int index) { this.index = index; } @Override public boolean equals(Object obj) { return DATA[index][0].equals(obj); } @Override public String getKey() { return DATA[index][0];//返回国家名字 } @Override public String getValue() { return DATA[index][1];//返回首都名字 } @Override public String setValue(String value) { throw new UnsupportedOperationException(); } } @Override public Set<Map.Entry<String, String>> entrySet() { return entries; } //定制的Set实现 static class EntrySet extends AbstractSet<Map.Entry<String, String>>{ private int size; public EntrySet(int size) { if(size < 0) { size = 0; }else if(size > DATA.length) { size = DATA.length; }else { this.size = size; } } private class Iter implements Iterator<Map.Entry<String, String>>{ private Entry entry = new Entry(-1); @Override public boolean hasNext() { return entry.index < size - 1; } @Override public Map.Entry<String, String> next() { entry.index++; return entry; } } @Override public Iterator<Map.Entry<String, String>> iterator() { return new Iter(); } @Override public int size() { return size; } } } static Map<String,String> select(int size){ return new FlyweightMap() { @Override public Set<Map.Entry<String, String>> entrySet() { return new EntrySet(size); } }; } public static Map<String,String> capitals(int size){ return select(size); } public static void main(String[] args) { System.out.println(capitals(11)); } /*我的问题是:当走到select()方法的时候,new了一个匿名内部类,也就是一个Map容器,然后下一步去初始化FlyweightMap类,在FlyweightMap类中也就定义了entries成员,Map容器是在何时添加数据的呢?Entry类和Iter类是什么时候被初始化的?*/ } 第一次写这个,不知道问题写得够不够详细,希望有前辈解答一下 以上的理解,那getValue和getKey什么时候被调用的呢?代码上看出不出,但是打印方法名的时候确实走进这两个方法。
面向对象的程序设计--JAVA 第二周题 出错
这一周的编程题是需要你在课程所给的时钟程序的基础上修改而成。但是我们并不直接给你时钟程序的代码,请根据视频自己输入时钟程序的Display和Clock类的代码,然后来做这个题目。 我们需要给时钟程序加上一个表示秒的Display,然后为Clock增加以下public的成员函数: public Clock(int hour, int minute, int second); 用hour, minute和second初始化时间。 public void tick(); “嘀嗒”一下,时间走1秒。 public String toString(); 返回一个String的值,以“hh:mm:ss“的形式表示当前时间。这里每个数值都占据两位,不足两位时补0。如“00:01:22"。注意其中的冒号是西文的,不是中文的。 提示:String.format()可以用和printf一样的方式来格式化一个字符串。 另外写一个Main类,它的main函数为下面的样子,注意,必须原封不动地作为Main的main函数: public static void main(String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); Clock clock = new Clock(in.nextInt(), in.nextInt(), in.nextInt()); clock.tick(); System.out.println(clock); in.close(); } 我的作业: public class Main { public static void main(String[] args) { java.util.Scanner in = new java.util.Scanner(System.in); Clock clock = new Clock(in.nextInt(), in.nextInt(), in.nextInt()); clock.tick(); System.out.println(clock); in.close(); } } class Display { private int value = 0; private int limit = 0; public Display(int a) { limit = a; } public void increase() { value++; if(value == limit) { value =0; } } public void setvalue(int x) { value = x; } public int getvalue() { return value; } } class Clock { private Display hour = new Display(24); private Display minuter = new Display(60); private Display second = new Display(60); public Clock(int hour, int minute, int second) { this.hour.setvalue(hour); this.minuter.setvalue(minute); this.second.setvalue(second); } public void tick() { second.increase(); if(second.getvalue() == 0) { minuter.increase(); } if(minuter.getvalue() == 0) { hour.increase(); } } public String toString() { String s =""; s = String.valueOf(hour.getvalue()); s = s + ":"; s = s + String.valueOf(minuter.getvalue()); s = s + ":"; s = s + String.valueOf(second.getvalue()); return s; } } 显示用例1例2未通过 求大神看看哪里错了
java.sql.SQLException错误
运行StuDialog.class出现下面错误提示,初学Java请求帮助找出下面是什么原因? java.sql.SQLException: No value specified for parameter 2 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929) at com.mysql.jdbc.PreparedStatement.checkAllParametersSet(PreparedStatement.java:2560) at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2536) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2383) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2327) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2312) at com.studentmanager.StuAddDialog.actionPerformed(StuAddDialog.java:109) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6216) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5981) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4583) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178) at java.awt.Dialog$1.run(Dialog.java:1051) at java.awt.Dialog$3.run(Dialog.java:1103) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Dialog.show(Dialog.java:1101) at java.awt.Component.show(Component.java:1516) at java.awt.Component.setVisible(Component.java:1468) at java.awt.Window.setVisible(Window.java:841) at java.awt.Dialog.setVisible(Dialog.java:991) at com.studentmanager.StuAddDialog.<init>(StuAddDialog.java:73) at com.studentmanager.StuDialog.actionPerformed(StuDialog.java:109) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6216) at javax.swing.JComponent.processMouseEvent(JComponent.java:3265) at java.awt.Component.processEvent(Component.java:5981) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4583) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2475) at java.awt.Component.dispatchEvent(Component.java:4413) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) 1、StuDialog.class如下: package com.studentmanager; import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.Vector; public class StuDialog extends JFrame implements ActionListener{ //定义一些控件 JPanel jp1,jp2; JLabel jl1; JButton jb1,jb2,jb3,jb4; JTable jt; JScrollPane jsp; JTextField jtf; public static void main(String[] args) { // TODO Auto-generated method stub StuDialog stuDialog=new StuDialog(); } public StuDialog() { jp1=new JPanel(); jtf=new JTextField(10); jb1=new JButton("查询"); jb1.addActionListener(this); jl1=new JLabel("请输入名字"); //把各个控件加入到jp1 jp1.add(jl1); jp1.add(jtf); jp1.add(jb1); jp2=new JPanel(); jb2=new JButton("添加"); jb2.addActionListener(this); jb3=new JButton("修改"); jb4=new JButton("删除"); //把各个按钮就加入到jp2 jp2.add(jb2); jp2.add(jb3); jp2.add(jb4); /*//rowData可以存放多行 Vector hang=new Vector(); hang.add("sp001"); hang.add("孙悟空"); hang.add("男"); hang.add("25"); hang.add("火锅山"); hang.add("少林派"); //加入到rowData rowData.add(hang);*/ //创建一个数据模型对象 StuModel sm=new StuModel(); //初始化JTable jt=new JTable(sm); //初始化Jsp JScrollPane jsp=new JScrollPane(jt); //把jsp放入JFrame this.add(jsp); this.add(jp1,"North"); this.add(jp2,"South"); this.setSize(400,300); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //判断是哪个按钮被点击 if(e.getSource()==jb1) { System.out.println("用户想查询"); //因为把表的现实的数据封装到StuModel中,那么我们就可以 //简单完成查询 //查询数据库,更新JTable String name=this.jtf.getText().trim(); //写一个SQL语句 String sql="select * from stu where stuName='"+name+"'"; //构建新的数据模型,并更新 StuModel sm=new StuModel(sql); //更新JTable jt.setModel(sm); //当用户点击添加 } else if(e.getSource()==jb2) { StuAddDialog sa=new StuAddDialog(this,"添加学生",true); //重新再获得新的数据模型 } } } 2、StuAddDialog.class如下: package com.studentmanager; import java.awt.*; import javax.swing.*; import java.util.*; import java.awt.event.*; import javax.swing.JDialog; import java.sql.*; public class StuAddDialog extends JDialog implements ActionListener { //定义我需要的swing控件 JPanel jp1,jp2,jp3; JTextField jtf1,jtf2,jtf3,jtf4,jtf5,jtf6; JButton jb1,jb2; JLabel jl1,jl2,jl3,jl4,jl5,jl6; //owner 它的父窗口 //title窗口名 //model指定是模式窗口,还是非模式窗口 public StuAddDialog(Frame owner,String title,boolean modal) { super(owner,title,modal);//调用父类构造方法,达到模式对话框效果 jl1=new JLabel("学号"); jl2=new JLabel("姓名"); jl3=new JLabel("性别"); jl4=new JLabel("年龄"); jl5=new JLabel("籍贯"); jl6=new JLabel("系别"); jtf1=new JTextField(); jtf2=new JTextField(); jtf3=new JTextField(); jtf4=new JTextField(); jtf5=new JTextField(); jtf6=new JTextField(); jb1=new JButton("添加"); jb1.addActionListener(this); jb2=new JButton("取消"); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); //设置布局 jp1.setLayout(new GridLayout(6,1)); jp2.setLayout(new GridLayout(6,1)); jp1.add(jl1); jp1.add(jl2); jp1.add(jl3); jp1.add(jl4); jp1.add(jl5); jp1.add(jl6); jp2.add(jtf1); jp2.add(jtf2); jp2.add(jtf3); jp2.add(jtf4); jp2.add(jtf5); jp2.add(jtf6); jp3.add(jb1); jp3.add(jb2); this.add(jp1,BorderLayout.WEST); this.add(jp2,BorderLayout.CENTER); this.add(jp3,BorderLayout.SOUTH); jb1.addActionListener(this); //展现 this.setSize(300,250); //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==jb1) { //对用户点击添加按钮后的响应动作 //连接数据库 Connection ct=null; Statement stmt=null; ResultSet rs=null; PreparedStatement psmt=null; //连接数据库,判断用户是否合法 try{ //1加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2创建连接对象,注册驱动程序并打开连接对象 ct=DriverManager.getConnection("jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=GBK","root","123456"); psmt=ct.prepareStatement("select * from stu"); //3获取语句对象 //stmt=ct.createStatement(); //与编译语句对象 psmt=ct.prepareStatement("insert into stu values(?,?,?,?,?,?)"); //给参数赋值 psmt.setString(1,jtf1.getText()); psmt.setString(1,jtf2.getText()); psmt.setString(1,jtf3.getText()); psmt.setString(1,jtf4.getText()); psmt.setString(1,jtf5.getText()); psmt.setString(1,jtf6.getText()); //4执行操作 psmt.executeUpdate(); this.dispose();//关闭对话框 }catch(ClassNotFoundException e1) { e1.printStackTrace(); }catch(SQLException e2) { e2.printStackTrace(); } finally { //释放语句对象,连接对象 try { if(rs!=null) rs.close(); if(stmt!=null) stmt.close(); if(ct!=null) ct.close(); }catch(Exception e2) { e2.printStackTrace(); } } } } @Override public Container getContentPane() { // TODO Auto-generated method stub return super.getContentPane(); } @Override public void setContentPane(Container contentPane) { // TODO Auto-generated method stub super.setContentPane(contentPane); } }
【JAVA】关于继承关系中构造方法的问题
<p>父类Person,有无参构造方法Person(),和公用方法func().</p> <p>子类Teacher,有无参构造方法Teacher(),有参构造方法Teacher(int a)和公用方法func().</p> <p> </p> <p>代码如下:</p> <p> </p> <pre name="code" class="java">class Teacher extends Person { public Teacher() { super(); } public Teacher(int a) { System.out.print(a); } public void func() { System.out.print("2,"); } public static void main(String[] args) { Teacher t1 = new Teacher(); Teacher t2 = new Teacher(3); } } class Person { public Person() { func(); } public void func() { System.out.print("1,"); } } </pre> <p> 题目是問运行结果是什么?</p> <p> </p> <p> 我的理解如下:</p> <p><span style="white-space: pre;"> </span>从主方法入手,声明Teacher类的实例t1和t2,其中t1使用无参构造方法Teacher()进行初始化,而Teacher()中使用super(),即使用父类Person中无参构造方法Person(),在这个父类的构造方法中调用了func().所以,实例t1输出是:1, .</p> <p><span style="white-space: pre;"> </span>在实例t2中,使用有参构造方法Teacher(int a)进行初始化.所以,实例t2输出是:3 </p> <p><span style="white-space: pre;"> </span>所以猜测的运行结果应该为<span style="color: #ff0000;">1,3</span></p> <p> </p> <p> 实际运行结果为:<span style="color: #ff0000;">2,2,3</span></p> <p> </p> <p> 我的疑问是:为什么会在使用了super()的情况下,调用的func()却是子类中的func()?而且是调用了两次?望各位大神解答.</p>
java输出顺序
class Parent { // 静态变量 public static String p_StaticField = "父类--静态变量"; // 变量 public String p_Field = "父类--变量"; // 静态初始化块 static { System.out.println(p_StaticField); System.out.println("父类--静态初始化块"); } // 初始化块 { System.out.println(p_Field); System.out.println("父类--初始化块"); } // 构造器 public Parent() { System.out.println("父类--构造器"); } } public class SubClass extends Parent { // 静态变量 public static String s_StaticField = "子类--静态变量"; // 变量 public String s_Field = "子类--变量"; // 静态初始化块 static { System.out.println(s_StaticField); System.out.println("子类--静态初始化块"); } // 初始化块 { System.out.println(s_Field); System.out.println("子类--初始化块"); } // 构造器 public SubClass() { System.out.println("子类--构造器"); } // 程序入口 public static void main(String[] args) { System.out.println("aa"); new SubClass(); } } 为什么aa在中间输出,按理说应该先输出aa的啊》??哪位解释一下,谢谢 父类--静态变量 父类--静态初始化块 子类--静态变量 子类--静态初始化块 aa 父类--变量 父类--初始化块 父类--构造器 子类--变量 子类--初始化块 子类--构造器
java中的httpclient的SSL出错
我直接下载最新版的httpclient,直接复制的示例中的代码,只是把网址换成我自己想要的网址.并且,在我电脑中,在办公室服务器里测试都通过,但上传上机房服务器里面就出错了. java代码 [code="java"] public void login() { try { //初始化 httpclient DefaultHttpClient httpclient = new DefaultHttpClient(); //设置证书 httpclient.getConnectionManager().getSchemeRegistry().register(sch); String url = "login.jsp"; HttpPost httpost = new HttpPost(url); print("准备登陆网站,网址:"+url); List <NameValuePair> nvps = new ArrayList <NameValuePair>(); nvps.add(new BasicNameValuePair("actionName", "login")); nvps.add(new BasicNameValuePair("login_password", "11")); nvps.add(new BasicNameValuePair("login_user", "111")); httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); HttpResponse response = httpclient.execute(httpost); String statusLine = response.getStatusLine().toString(); print("得到网页打开状态"+statusLine); if(statusLine.equals("HTTP/1.1 200 OK")) { } } } /* * 设置SSL证书 */ public void setSSL() { try { KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); String p = System.getProperty("user.dir")+"/my.key"; print(p); FileInputStream instream = new FileInputStream(new File(p)); try { trustStore.load(instream, "123456".toCharArray()); }catch(Exception e) { e.printStackTrace(); } finally { instream.close(); } SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore); sch = new Scheme("https", socketFactory, 443); } catch(Exception e) { e.printStackTrace(); } } [/code] 程序出错提示 [code="java"] javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:371) at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128) at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:399) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:143) at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149) at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554) at login(login.java:89) [/code]
java并发多线程 关于final和Volatile 的问题
@Immutable class OneValueCache { private final BigInteger lastNumber; private final BigInteger[] lastFactors; /** * 如果在构造函数中没有使用 Arrays.copyOf()方法,那么域内不可变对象 lastFactors却能被域外代码改变 * 那么 OneValueCache 就不是不可变的。 */ public OneValueCache(BigInteger i, BigInteger[] factors) { lastNumber = i; lastFactors = Arrays.copyOf(factors, factors.length); } public BigInteger[] getFactors(BigInteger i) { if (lastNumber == null || !lastNumber.equals(i)) return null; else return Arrays.copyOf(lastFactors, lastFactors.length); } } @ThreadSafe public class VolatileCachedFactorizer implements Servlet { private volatile OneValueCache cache = new OneValueCache(null, null); public void service(ServletRequest req, ServletResponse resp) { BigInteger i = extractFromRequest(req); BigInteger[] factors = cache.getFactors(i); if (factors == null) { factors = factor(i); cache = new OneValueCache(i, factors);//声明为 volatile ,防止指令重排序,保证可见性 } encodeIntoResponse(resp, factors); } } 上面两段程序是在java并发编程中看到的。没有看明白为什么必须使用final和Volatile 这两个关键字才可以保证不使用锁他也是安全的。 能不能有大神能够说一下,假如不使用final,只使用Volatile 他会发生的不安全情况,与都使用了这两个关键字的对比。 谢谢了。万分感谢,看了一晚上。 下面就是我对两个关键字的理解: Volatile 就是本地内存不存这个变量,直接在主内存中就行读写 final修饰变量就是这个变量是不可改变的,如果是引用类型就表示一直会引用初始化那个地址的数据,如果是基本类型,就是不能修改这个类型的值 如果不正确请指证一下
能帮我分析一下两个算法吗。
第一种用的时间很长,在输入50左右的数据时,两种方法的答案不同,但50之前的数据是一样的,是怎么回事呢,谢谢!! **原题**:学完青蛙跳楼梯之后,小明突发奇想,如果我先迈左脚,而且要求最后一次也是踏左脚,每步可以跨1-2阶,那么1个9阶的楼梯,我会有多少种方法上楼呢?他编程实现了之后并实际测试了一下,9阶一共有27种上楼的方法。那么50阶、90阶呢? ``` import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt();/////////输入阶数 System.out.print(fun(n+1,false)); } public static int fun(int jie,boolean leftfoot) {///////////jie是当前站的jie(n+1) if(jie == 3) { return 1; } if(jie == 4) { if(leftfoot) { return 2; }else { return 1; } } return fun(jie-1,!leftfoot)+fun(jie-2,!leftfoot); } } ``` ``` import java.util.Scanner; public class Main { static long[] left = new long[93]; static long[] right = new long[93]; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); //初始化 left[1]代表1阶的时候左脚到达终点的方法数 right[2]代表2阶的时候右脚到达终点的方法数 left[1] = left[2] = right[2] = 1; for (int i = 3; i <= 92; i++) { left[i] = right[i - 1] + right[i - 2]; //左脚到达终点 那么说明在i-1阶 或者 i-2阶 的时候踏上去的是 右脚 right[i] = left[i - 1] + left[i - 2]; } System.out.println(left[n]); } } ```
关于Java进度条多线程调用问题,一个很实用的问题,希望熟悉多线程编程的高手看看
目前我在做一个C/S架构的Java应用,其中有一项查询操作非常耗时,可以增加个进度条以提高用户界面友好型.大体流程是这样的,在一个方法内 protected void action_queryButton()实行一个耗时的查询操作ArrayList alQuery = BuinessLogic.getQuery(); 此操作非常耗时,我把它抽出来放到一个线程中去做,具体是:先写个QueryDialog继承于JDialog,上面加入JProgressBar进度条,在初始化QueryDialog的过程中启动线程做费时查询,期间不断将查询进度消息返回给JDialogProgress中的 JProgressBar(这样用户可以看到进度条在不断刷新往前跑),最后查询结束,返回查询结果集alQuery(是一个ArrayList对象). 这一切都已实现,关键问题是当我启动线程执行费时查询操作时,主线程也继续往下执行,我的线程还没来得及返回结果集,主线程已经 将一个空引用赋给result了(ArrayList result = alQuery;)等我线程返回时,一切晚矣~~~主线程继续往下执行(当然会抛个空指针异常,呵呵)...我的最终目的也就没有达到.我的目的是让线程去执行费时操作,同时界面显示进度条不断刷新,等费时查询结束,进度条跑到100%,然后返回结果集给主线程下一行的ArrayList引用对象 result,这样我才算真正完成任务,事与愿违啊,线程启动后,主线程继续往下走,没有完成任务交接.实例伪代码我附上了, protected ArrayList action_queryButton() { //主线程开始 . . . . // 新建查询对话框 QueryDialog queryDialog = new QueryDialog(topFrame, this.managerContext); // 打开对话框:注意,我开始启动费时查询线程了.线程start方法我封装在queryDialog.showDialog(queryParam, iFrame)方法里,具体代码这 //里不提供了. if (queryDialog.showDialog(queryParam, iFrame) != queryDialog.OPTION_OK) { // 用户取消 或者 异常 queryDialog.dispose(); queryDialog = null; return; } /*获得查询参数:注意我上面开启了个线程,当线程还没结束,也就是说还没返回查询结果集时,主线程继续往下走,执行了下步操作调getQuery方法得到一个ArrayList空对象(因为此时线程没有走完,不可能返回真实查询结果),系统会抛个空指针*/ ArrayList result = queryDialog.getQuery(); setQueryManagerContext(tempParam); queryDialog.dispose(); queryDialog = null; // . . . . return result; } 我的解决方法是在开启查询线程后,让主线程停止不动,不让它往下走,等待查询结束QueryDialog对象返回查询结果集后,再让主线程继续下一步 ArrayList result = queryDialog.getQuery();这样,result就有值了,一切都OK. 请问谁有更好的解决办法? 如果不方便给出代码,说出思路也行,说错没关系,大家一起探讨共同进步嘛,呵呵.
關于多線程中雙檢查鎖(DCL)初始化發布安全性問題疑惑?
最近在看<java 并發編程實踐>,有提到雙檢查鎖發布對象的功能. public MyObject{ private static MyObect obj; public static MyObect getInstance(){ if(obj == null){ synchronized(MyObect .class){ if(obj == null) obj = new MyObject();//这里 } } return obj; } } 有介紹此種方式可能會看看過期值﹐或無效狀態值。 大百度上搜索到以下兩種答案: 第一種﹕ 在[url]http://dev.csdn.net/author/axman/4c46d233b388419e9d8b025a3c507b17.html[/url]中提到此種主式(在jdk1.2以上)并不會造成上述異常。 第二種﹕ 在[url]http://www.verybc.com/a/hulianwang/2009/1124/8780.html[/url]中提到上種方式會造成上述情況﹐但在解釋時提到[color=red]按照顺序的话,接下来应该运行的步骤是 1) 分配新的Singleton对象的内存 2) 调用Singleton的构造器,初始化成员字段 3) instance被赋为指向新的对象的引用。 前面说过,编译器或处理器都为了升高性能都有估计停止指令的乱序运行,线程一的真正运行步骤估计是1) 分配内存 2) instance指向新对象 3) 初始化新举例。假如线程二在2完成后3运行前被唤醒,它看到了一个的不为null的instance,跳出窍门体走了,带着一个的还没初始化的Singleton对象。[/color]。此段解釋與書中(339頁)提到[color=red]同步仰制了編譯器﹐運行時和硬件對存儲操作的各種方式的重排序(因為obj = new MyObject()是在同步塊中)[/color] 針對引種方式正確的解釋應該為何?
特别简单的Java聊天程序
小弟刚学完java基础,练练手就做了一个特别简单的聊天程序,源代码如下: import java.net.*; import java.awt.*; import java.awt.event.*; public class Receive { Frame f=new Frame("聊天室"); TextField tfIP=new TextField(15); TextArea lst=new TextArea(); Label lb=new Label("IP"); DatagramSocket ds; TextField tfData=new TextField(20); Button bt=new Button("send"); Button bt2=new Button("Content can't for empty");//定义模态显示 Dialog dlg=new Dialog(f,"消息提示",true); public static void main(String args[]){ new Receive();//调用构造函数初始化 } public Receive(){ try{ ds=new DatagramSocket(8087); }catch(Exception ex){ ex.printStackTrace(); } //设置线程监听对方发送的内容 new Thread(new Runnable(){ public void run(){ byte buf[]=new byte[1024]; DatagramPacket dp=new DatagramPacket(buf,1024); while(true){ try{ ds.receive(dp); lst.append("对方(来自"+dp.getAddress().getHostAddress()+",接口:"+dp.getPort()+") "+"当前时间:"+"\n"+new String(buf,0,dp.getLength())+"\n"); }catch(Exception e){ e.printStackTrace(); } } } }).start(); init1(); } public void init1(){ f.setSize(400,400);//设置容器的大小 f.add(lst); //添加组件,布置布局 Panel p1=new Panel(); Panel p2=new Panel(); Panel p3=new Panel(); p1.setLayout(new BorderLayout()); p2.setLayout(new BorderLayout()); p3.setLayout(new BorderLayout()); p1.add("West",lb); p1.add("East",tfIP); p2.add("West",bt); p2.add("East",tfData); p3.add("West",p1); p3.add("East",p2); f.add("South",p3); dlg.setLayout(new FlowLayout()); dlg.add(bt2); dlg.setBounds(0, 0, 200, 150);//设置提示框的大小 f.setVisible(true);//让容器可显示 f.setResizable(false);//不可改变容器大小 //关闭窗口事件 f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ ds.close(); f.setVisible(false); f.dispose(); System.exit(0); } }); //触发按钮事件 bt.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ex){ byte[]buf; buf=tfData.getText().getBytes(); if(buf.length!=0){ try{ DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName(tfIP.getText()),8088); ds.send(dp); tfData.setText(""); lst.append("自己:"+"\n"+new String(buf)+"\n");//new String(dp.getData()); }catch(Exception e){ e.printStackTrace(); } }else{//设置成为模态显示并其可现 dlg.setModal(true); dlg.setVisible(true); } } }); //模态显示按钮的触发事件 bt2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ dlg.dispose(); } }); //输入文本框的触发事件 tfData.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ byte[]buf; buf=e.getActionCommand().getBytes(); if(buf.length!=0){ try{ DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName(tfIP.getText()),8088); ds.send(dp); ((TextField)e.getSource()).setText(""); lst.append("自己:"+"\n"+new String(buf)+"\n");//new String(dp.getData()); }catch(Exception ex){ ex.printStackTrace(); } }else{ dlg.setModal(true); dlg.setVisible(true); } } }); } } 把上面的代码在复制一个,改变一下端口,就可以实现简单的聊天了,但还有一些功能没有实现,还请各位指点一二。 未能实现的功能:双方发送的内容所显示的动态时间;发送框在程序刚开始运行的时候,光标没在发送框;发送按钮不能显示中文,不知道怎么解决这个中文乱码 还请大家帮忙啊!
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
使用 Docker 部署 Spring Boot 项目
Docker 技术发展为微服务落地提供了更加便利的环境,使用 Docker 部署 Spring Boot 其实非常简单,这篇文章我们就来简单学习下。首先构建一个简单的 S...
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
redis分布式锁,面试官请随便问,我都会
文章有点长并且绕,先来个图片缓冲下! 前言 现在的业务场景越来越复杂,使用的架构也就越来越复杂,分布式、高并发已经是业务要求的常态。像腾讯系的不少服务,还有CDN优化、异地多备份等处理。 说到分布式,就必然涉及到分布式锁的概念,如何保证不同机器不同线程的分布式锁同步呢? 实现要点 互斥性,同一时刻,智能有一个客户端持有锁。 防止死锁发生,如果持有锁的客户端崩溃没有主动释放锁,也要保证锁可以正常释...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员...
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC...
【技巧总结】位运算装逼指南
位算法的效率有多快我就不说,不信你可以去用 10 亿个数据模拟一下,今天给大家讲一讲位运算的一些经典例子。不过,最重要的不是看懂了这些例子就好,而是要在以后多去运用位运算这些技巧,当然,采用位运算,也是可以装逼的,不信,你往下看。我会从最简单的讲起,一道比一道难度递增,不过居然是讲技巧,那么也不会太难,相信你分分钟看懂。 判断奇偶数 判断一个数是基于还是偶数,相信很多人都做过,一般的做法的代码如下...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
Android 9.0 init 启动流程
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android本篇文章主要介绍Android开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:一、启动流程概述一、 启动流程概述Android启动流程跟Linux启动类似,大致分为如下五个阶段。1.开机上电,加载固化的ROM。2.加载BootLoader,拉起Android OS。3.加载Uboot,初始外设,引导Kernel启动等。...
相关热词 c# 引用mysql c#动态加载非托管dll c# 两个表数据同步 c# 返回浮点json c# imap 链接状态 c# 漂亮字 c# 上取整 除法 c#substring c#中延时关闭 c#线段拖拉
立即提问