private 声明的对象能被.直接引用问题

private class ViewHolder extends RecyclerView.ViewHolder {

    private TextView tv_name;

    public ViewHolder(View itemView) {
        super(itemView);
        tv_name = itemView.findViewById(R.id.tv_name);
    }
}

      @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof ViewHolder) {
       Bean bean = mlist.get(position);
        ((ViewHolder) holder).tv_name.setText(bean.getTdi_name());
    }
}

    为什么我在ViewHolder类private声明的控件 能直接被.调用,有点无法理解,还望指教。

10个回答

因为你这个类是内部类,内部类的private变量是可以被外部类直接访问。参考下:https://www.zhihu.com/question/54730071

private表示私有类,public表示公有。在同一个类下,私有类本来就可以调用。

在类内部可以访问私有变量,即使是通过类实例,也可以访问。

private修饰全局变量的本来就是只能在当前类中使用啊

对于一个类的私有变量,在其作用域范围内可被使用;其他类不可直接访问该类的私有变量。

public class Test1{
private void f(){
System.out.println ("private f()");
}
public static void main (String[] args) {
Test1 po=new Test1();
po.f();
}
}

疑问:为何在类Test1中,创建他本身的对象的时候,其对象的引用可以直接调用类Test1中的private方法?

public class Test2{

public static void main (String[] args) {
PrivateTest po=new PrivateTest();
po.f();
}
}
class PrivateTest{
private void f(){
System.out.println ("private f()");
}
}

上述代码中类PrivateTest中的方法为private,故po.f()无法调用。

当前类下,private可以访问

private是对类内可见;而那个点的引用就在同一个类里,自然可以访问了

当前类里面声明的private可以被访问,离开了这个类就不可以了

建议你去了解一下 访问修饰符(public,private,protected,internal,sealed,abstract) 以及 内部内的几种实现 ,如果你了解这些后还是没知道这是为什么,那就去开视频吧~

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于cglib动态代理的对象无法获取其属性注解的问题
``` @Service public class MarketMoneyChangeService{ @DynamicReference private IMarketBuyerProvider marketBuyerProvider; @Transactional(rollbackFor = Exception.class) public Boolean doChangeMoney() { return true; } } ``` 注解声明如下: ``` import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * 服务动态注入注解 */ @Inherited @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface DynamicReference { } ``` 代码中@DynamicReference为自定义注解, 作用是根据项目配置, 在运行时注入指定SpringBean或者Dubbo引用对象。正常情况下使用没问题, 但是当加上事务注解@Transactional时, MarketMoneyChangeService会变成cglib代理对象, 则使用Field无法获取到注解@DynamicReference ``` DynamicReference dynamicRefrence = filed.getAnnotation(DynamicReference.class); ``` 求解大佬, 被cglib代理的对象如何获取属性的注解, 或者cglib代理的对象如何设置其属性值
System.NullReferenceException: 未将对象引用设置到对象的实例
在学习微软认知服务,用C#编写了一个简单的接口,但是出现了“未将对象引用设置到对象的实例 (System.NullReferenceException)”这个问题。在网上查了原因,好像有以下几种说法: “System.NullReferenceException: 未将对象引用设置到对象的实例”问题可能原因如下: 1、ViewState 对象为Null。 2、DateSet 空。 3、sql语句或Datebase的原因导致DataReader空。 4、声明字符串变量时未赋空值就应用变量。 5、未用new初始化对象。 6、Session对象为空。 7、对控件赋文本值时,值不存在。 8、使用Request.QueryString()时,所获取的对象不存在,或在值为空时未赋初始值。 9、使用FindControl时,控件不存在却没有做预处理。 10、重复定义造成未将对象引用设置到对象的实例错误. 第一次接触C#,看不出来究竟属于哪一类错误,求问各位大神这个错误应该怎么修正。编译器提示的错误在代码中注释出来了 以下附小弟源码: ``` using System.Collections.Generic; using System.Net.Http; using System.Text; using Newtonsoft.Json; using System; using System.Net.Http.Headers; using System.Web; public class Program { private const string ApiKey = "804e4631f32a421b8cf8066ca2d54fb0"; private const string DescribeImageApiUrl = "https://api.projectoxford.ai/vision/v1.0/describe?maxCandidates=3"; private const string ContentType = "application/json"; public static void Main(string[] args) { var imageUrls = new[] { "http://i.imgur.com/OJ6lzhz.jpg", "http://i.imgur.com/OV80Pr8.jpg" }; foreach(var imageUrl in imageUrls) { var response = DescribeImage(imageUrl); Console.WriteLine("Image: {http://img.taopic.com/uploads/allimg/110910/2316-110910124R147.jpg}"); Console.WriteLine("Descriptions:"); foreach (var caption in response.Description.Captions)//提示错误出现在这一行 { Console.WriteLine(caption.Text); } Console.WriteLine(new string('-', 5)); } Console.Read(); } private static DescribeImageResponse DescribeImage(string imageUrl) { var client = new HttpClient(); client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", ApiKey); var imageJson = new { url = imageUrl }; var response = client.PostAsync( DescribeImageApiUrl, new StringContent( JsonConvert.SerializeObject(imageJson), Encoding.UTF8, ContentType)).Result; var content = response.Content.ReadAsStringAsync().Result; return JsonConvert.DeserializeObject<DescribeImageResponse>(content); } private class DescribeImageResponse { public DescribeImageResponseDescription Description { get; set; } public string RequestId { get; set; } public DescribeImageResponseMetadata Metadata { get; set; } } private class DescribeImageResponseDescription { public List<string> Tags { get; set; } public List<DescribeImageResponseDescriptionCaption> Captions { get; set; } } private class DescribeImageResponseDescriptionCaption { public string Text { get; set; } public decimal Confidence { get; set; } } private class DescribeImageResponseMetadata { public double Width { get; set; } public double Height { get; set; } public string Format { get; set; } } } ```
为什么这个数据库连接成不成功都不显示呢?既没错误也没显示成功
//JDBC中的所有类和接口都在java.sql包下。 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Execute{ private static String driver="oracle.jdbc.OracleDriver";//声明驱动类字符串 //声明数据库连接字符串 private static String url="jdbc:oracle:thin:@localhost:1521:orcl"; private static Connection con=null;//声明数据库连接对象引用 private static Statement stat=null;//声明语句对象引用 private static PreparedStatement psInsert=null;//声明预编译语句对象引用 private static ResultSet rs=null;//声明结果集对象引用 public static void main(String[] args) { Execute e = new Execute(); } public static Connection getConnection()//得到数据库连接的方法 { try { Class.forName(driver);//加载驱动类 con=DriverManager.getConnection(url,"system","abcA1234");//得到连 接 System.out.println("数据库连接成功"); } catch(Exception e){ e.printStackTrace(); } return con;//返回连接 } }
C#奇怪的null引用错误
今天我写的订单处理系统报了个奇怪的null引用错误,错误内容如下: type=System.NullReferenceException msg=Object reference not set to an instance of an object. extMsg= stack= at PinRui.EDiner2SDK.SDKBLL.RevHistoryManage.<>c__DisplayClass7.<GetOrder>b__6(ShopOrderHistory item) in E:\work\src\EDiner2SDK\EDiner2Manage\RevHistoryManage.cs:line 83 at System.Collections.Generic.List`1.Find(Predicate`1 match) at PinRui.EDiner2SDK.SDKBLL.RevHistoryManage.GetOrder(Int32 accountId, String shopOrderNo) in E:\work\src\EDiner2SDK\EDiner2Manage\RevHistoryManage.cs:line 83 at ClientOrder.SendOrderData() at ClientOrder.ProcessRequest(HttpContext context) 之所以说奇怪是因为,按此报错的来看,应该集合对象为null。但是此集合对象是实例对象,且此类为单件模式。这个集合怎么可能为null呢?实在是不明白这里的问题,忘大家指点一下,谢谢! 下面是这个集合和类的声明方式: public class RevHistoryManage { private static readonly object _lock = new object(); private static RevHistoryManage _instance; /// <summary> /// 获取本类唯一实例 /// </summary> /// <returns></returns> public static RevHistoryManage Instance() { if (_instance == null) { lock (_lock) { if (_instance == null) { _instance = new RevHistoryManage(); } } } return _instance; } /// <summary> /// 构造函数 /// </summary> private RevHistoryManage() { } private List<ShopOrderHistory> _OrderCacheList = new List<ShopOrderHistory>(); public ShopOrderHistory GetOrder(int orderid) { return _OrderCacheList.Find(item => item.orderid == orderid);//就是这行报的错 } }
IOS中类别的3个作用 “创建对私有方法的前向引用”
最近在看IOS的面试题,遇到一个题叫做“类别的作用”,其作用有3: (1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。 (2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告 (3)向对象添加非正式协议:创建一个NSObject的类别称为 “创建一个非正式协议”,因为可以作为任何类的委托对象使用。 第1个和第3个好理解,但第2个怎么理解,我感觉一头雾水, 首先,第一句话 “如果其他类中的方法未实现”, 为什么方法未实现,不实现声明那个方法干什么 其次,“访问其他类的私有方法时编译器报错这时使用类别”, 声明这些方法,等于是声明了一个与该类同名的方法,先前的是private的,这样做有什么意义? 谁能帮我解释一下?
Android 的SharedPreferences.Editor
新建了一个类方法MusicCatalogue,在另一个页面使用 // 声明工具类 MusicCatalogue 并调用构造器 MusicCatalogue musicCatalogue = new MusicCatalogue(); // 赋予ListView 的对象 song_Inventory 的值为locality.getCatalog()的返回集合mListData musicCatalogue.setMusic_catalogue(); MusicCatalogue有这个方法,在Maiifest里使用MusicCatalogue作为第一启动就可用.setMusic_catalogue()方法创建出xml文件,而在外部类调用就会报出这个set方法之中的 SharedPreferences.Editor editor = getSharedPreferences("MusicCatalogueName1",MODE_PRIVATE).edit();“空对象引用” ,请各位大神指点~~~
帮忙看看为什么数据库是连上了还是有
sql exception:java.lang.NullPointerException package function; //JDBC中的所有类和接口都在java.sql包下。 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Execute{ private static String driver="oracle.jdbc.OracleDriver";//声明驱动类字符串 //声明数据库连接字符串 private static String url="jdbc:oracle:thin:@localhost:1521:orcl"; private static Connection con=null;//声明数据库连接对象引用 private static Statement stat=null;//声明语句对象引用 //private static PreparedStatement psInsert=null;//声明预编译语句对象引用 static ResultSet rs=null;//声明结果集对象引用 public static Connection getConnection()//得到数据库连接的方法 { try { Class.forName(driver);//加载驱动类 con=DriverManager.getConnection(url,"system","abcA1234");//得到连 接 return con; } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { if (con != null) { try {con.close(); } catch (SQLException e) { e.printStackTrace(); } } } return null; } public static boolean executeSQL(String sqlString) { boolean executeFlag; try { stat.execute(sqlString); executeFlag = true; } catch (SQLException e) { executeFlag = false; System.out.println("sql exception:" + e.getMessage()); } return executeFlag; } public static boolean query(String sqlString) { try { rs = null; //System.out.println(sqlString); rs = stat.executeQuery(sqlString); } catch (Exception Ex) { System.out.println("sql exception:" + Ex); return false; } return true; } public static void main(String[] args) { Connection conn = getConnection(); if (conn != null) { System.out.println("连接成功"); } else { System.out.println("连接失败"); } } }
有没有大神能指点一下哪里错了。。。。
package Frame; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; import javax.swing.*; import db.DButil; public class login extends JFrame implements ActionListener{ private JPanel jp=new JPanel(); //创建标签数组 private JLabel[] jlArray={new JLabel("用户名"), new JLabel("密 码"),new JLabel("")}; private JButton jb1; private JButton jb2; private JButton jb3; private JTextField jtf=new JTextField(); private JPasswordField jpf=new JPasswordField(); //布局构造实现方法 public login(){ Icon icon1=new ImageIcon("login.jpg"); Icon icon2=new ImageIcon("reset.jpg"); Icon icon3=new ImageIcon("zhuce.jpg"); JPanel jp=new JPanel(){ protected void paintComponent(Graphics g) { ImageIcon icon = new ImageIcon("bg.jpg"); Image img = icon.getImage(); g.drawImage(img, 0, 0, icon.getIconWidth(), icon.getIconHeight(), icon.getImageObserver()); }}; jp.setLayout(null); jb1=new JButton(icon1); jb2=new JButton(icon3); jb3=new JButton(icon2); jlArray[0].setBounds(70,120,90,32); jb1.setBounds(365,110,130,60); jb2.setBounds(365,170,130,60); jlArray[1].setBounds(70,170,90,32); //将标签与按钮添加到JPanel容器中 jp.add(jlArray[0]); jp.add(jlArray[1]); jp.add(jb1); jp.add(jb2); jb1.addActionListener(this); jb2.addActionListener(this);//为按钮注册动作事件监听器 //添加修改密码的按钮 jb3.setBounds(365,230,130,60); jp.add(jb3); jp.add(jtf); jtf.setBounds(140,120,180,30);//设置文本框位置 jp.add(jpf); jpf.setBounds(140,170,180,30);//设置密码框位置 jpf.setEchoChar('*'); //密码显示字符形式 jpf.addActionListener(this); //为密码框注册动作事件监听器 this.setVisible(true);//设置窗体的可见性 jpf.addActionListener(this); //为密码框注册动作事件监听器 //设置用于显示登陆状态的标签大小位置,并将其添加进JPanel容器 jlArray[2].setBounds(70,220,300,30); jp.add(jlArray[2]); this.setTitle("登陆");//设置窗体标题 this.setBounds(450,200,500,318);//设置窗体的大小 this.setResizable(false);//设置窗体不让用户调整大小 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); this.setVisible(true);//设置窗体的可见性 this.add(jp);//将窗体添加到面板中 jp.setBackground(Color.blue); } public static void main(String[] args) { new login();//创建登陆窗体 } public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //得到用户名与密码 String user=jtf.getText().trim(); String pwd=String.valueOf(jpf.getPassword());//返回密码的字符串表示方式 String sql=""; if(e.getSource()==jtf){//事件源为文本框,切换焦点到密码框 jpf.requestFocus(); } else if(e.getSource()==jb1||e.getSource()==jpf){ //判断用户名和密码是否匹配 查询数据库 if(DButil.check(user, pwd)){ //登陆成功 MainFrame mf=new MainFrame(jtf.getText());//主窗体 this.dispose(); } else{ //登陆失败 jlArray[2].setText("对不起,非法的用户名和密码"); this.clear(); } } else if(e.getSource()==jb2) {//事件源为注册按钮 if(user.equals("")||pwd.equals("")) {//如果注册的用户名为空或者密码为空 jlArray[2].setText("用户名和密码都不得为空!!!"); this.clear();//清空输入文本框 } else { sql="select uid from user where uid='"+user+"'"; if(DButil.isExist(sql)) {//用户名已经存在 jlArray[2].setText("对不起,用户名已存在!!!"); this.clear();//清空输入文本框 } else { sql="insert into user values('"+user+"','"+pwd+"')"; if(DButil.update(sql)>0) {//注册成功 jlArray[2].setText("恭喜您!!!注册成功,请登陆"); } } } } else if(e.getSource()==jb3)//修改密码的监听 { //判断是否已经输入用户名和密码 if(user.equals("")||pwd.equals("")) { jlArray[2].setText("修改密码先输入正确的用户名和密码!!!"); this.clear();//清空输入文本框 } //判断是否输入了正确的用户名和密码 else if(DButil.check(user,pwd)) { //正确的用户名和密码 String password=JOptionPane.showInputDialog(this,"修改密码:","请输入新密码", JOptionPane.PLAIN_MESSAGE); //得到新的密码为空 if(password==null||password.equals("")) { JOptionPane.showMessageDialog(this,"密码不得为空!!!","错误", JOptionPane.WARNING_MESSAGE); } else {//密码不为空 sql="update user set pwd='"+password+"' where uid='"+user+"'";//更新密码的SQL if(DButil.update(sql)>0) {//密码修改成功 this.clear();//清空输入文本框 jlArray[2].setText("恭喜您!!!密码修改成功,请用新密码登陆"); } } } else { JOptionPane.showMessageDialog(this,"用户名或者密码错误!!!","错误", JOptionPane.WARNING_MESSAGE); this.clear();//清空输入文本框 } } } package Frame; import javax.swing.*; import javax.swing.table.DefaultTableModel; import db.DButil; import java.awt.*; import java.awt.event.*; import java.sql.*; import java.io.*; import java.util.*; public class MainFrame extends JFrame implements ActionListener,ItemListener { private String uname=null;//当前用户的名字 private boolean isInsert=false;//是否为添加默认为否 private JPanel topjp=new JPanel();//界面上半部分的JPanel容器 private JButton jba=new JButton("模糊查询"); private JButton jbs=new JButton("查找"); private JTextField jtfs=new JTextField();//按给出信息查找联系人信息 private JRadioButton jrbxm=new JRadioButton("按姓名查找",true); private JRadioButton jrbbh=new JRadioButton("按学号查找",false); private ButtonGroup bg=new ButtonGroup();//单选按钮组 private JPanel jpbr=new JPanel();//单选按钮面板 private JPanel jpyInfo=new JPanel();//右侧显示个人信息的面板 private JTextArea jta=new JTextArea(); // 模糊查询得到的信息文本区 private JLabel[] jlInfo={new JLabel("学号:"),new JLabel("姓名:"), new JLabel("性别:"),new JLabel("出生日期:"), new JLabel("电话号码:"),new JLabel("QQ:"), new JLabel("Email:"),new JLabel("地址:"), new JLabel("添加相片")}; private JButton[] jbInfo={new JButton("编辑"),new JButton("保存"), new JButton("浏览"), new JButton("上传"),}; private JLabel jlPhoto=new JLabel();//显示图像的JLabel控件 private JTextField[] jtfInfo=new JTextField[10]; private JTextField jtfPhoto=new JTextField();//添加照片到相册的路径 private JFileChooser jfcPic=new JFileChooser();//上传图像的文件选择器 private DefaultTableModel tableModel; private JTable table; //性别部分 private JRadioButton jrbMale=new JRadioButton("男",true); private JRadioButton jrbFemale=new JRadioButton("女"); private ButtonGroup bgGender=new ButtonGroup(); private JPanel jpGender=new JPanel();//单选按钮面板 private JLabel jlDetail=new JLabel();//右侧显示一幅图片的标签 private JSplitPane jspOuter=//上下分割的JSplitPane new JSplitPane(JSplitPane.VERTICAL_SPLIT,true); //系统托盘部分 private PopupMenu popup=new PopupMenu(); private SystemTray tray;//定义SystemTray成员变量 private TrayIcon trayIcon;//定义TrayIcon成员变量 private MenuItem exit=new MenuItem("退出程序");//定义菜单 public void initJps() {//界面上半部分的初始化 topjp.setLayout(null);//设置topjp布局管理器为null //设置按钮大小并添加到JPanel面板里 jba.setBounds(5,10,120,26); jba.addActionListener(this);//为模糊查询按钮注册事件监听器 topjp.add(jba); jbs.setBounds(130,10,80,26); jbs.addActionListener(this);//为查找按钮注册事件监听器 topjp.add(jbs);//添加按钮到topjp面板里 //设置jtfs文本框大小并添加到jps面板里 jtfs.setBounds(215,10,120,26); jtfs.addActionListener(this);//为文本框注册事件监听器 topjp.add(jtfs); //设置单选按钮大小和位置并添加到jpbr面板里同时添加到bg单选按钮组里 jrbxm.setBounds(5,3,50,26); jrbxm.addItemListener(this);//为单选按钮注册ItemEvent事件监听器 bg.add(jrbxm); jpbr.add(jrbxm); jrbbh.setBounds(60,3,50,26); jrbbh.addItemListener(this); bg.add(jrbbh); jpbr.add(jrbbh); jpbr.setBounds(360,10,200,26); topjp.add(jpbr); } public void initInfo() {//初始化信息界面 jpyInfo.setLayout(null);//设置布局管理器为空 jpyInfo.setBounds(50,50,380,360);//设置信息面板的大小和位置 jlPhoto.setBounds(220,10,150,170);//设置联系人图像JLabel的大小和位置 jlPhoto.setBorder(BorderFactory.createLineBorder(Color.BLACK));//将JLbel的边框线显现出来 jpyInfo.add(jlPhoto);//将显示联系人照片的JLabel添加到信息面板 tableModel=new DefaultTableModel(); Vector vector1 = new Vector(); DButil db = new DButil(); vector1.add("学号"); vector1.add("姓名"); vector1.add("性别"); vector1.add("出生日期"); vector1.add("电话号码"); vector1.add("QQ"); vector1.add("Email"); vector1.add("地址"); vector1.add("照片路径"); tableModel.setDataVector(null, vector1); System.out.print(123); table=new JTable(tableModel); //table.addMouseListener((MouseListener) this); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); JScrollPane js=new JScrollPane(table); //添加相片部分的控件 jtfPhoto.setBounds(80,250,200,26);//设置得到照片路径的文本框的大小和位置 jpyInfo.add(jtfPhoto);//将得到照片路径的文本框添加到信息面板 jbInfo[2].setBounds(285,250,80,26); jbInfo[2].addActionListener(this);//为添加照片的浏览按钮注册事件监听器 jpyInfo.add(jbInfo[2]); //上传按钮 jbInfo[3].setBounds(380,250,80,26); jbInfo[3].addActionListener(this);//为添加照片的浏览按钮注册事件监听器 jpyInfo.add(jbInfo[3]); for(int i=0;i<9;i++)//添加JLabel,并设置大小和位置 { jlInfo[i].setBounds(20,10+i*30,60,26); jpyInfo.add(jlInfo[i]); } for(int i=0;i<10;i++) {//初始化一些文本框 jtfInfo[i]=new JTextField(); } //学号 jtfInfo[0].setBounds(80,10,135,26); jpyInfo.add(jtfInfo[0]); //姓名 jtfInfo[1].setBounds(80,40,135,26); jpyInfo.add(jtfInfo[1]); //出生日期 jtfInfo[3].setBounds(80,100,135,26); jpyInfo.add(jtfInfo[3]); //电话号码 jtfInfo[4].setBounds(80,130,135,26); jpyInfo.add(jtfInfo[4]); //QQ jtfInfo[5].setBounds(80,160,135,26); jpyInfo.add(jtfInfo[5]); //Email jtfInfo[6].setBounds(80,190,135,26); jpyInfo.add(jtfInfo[6]); //地址文本框的添加 jtfInfo[7].setBounds(80,220,285,26); jpyInfo.add(jtfInfo[7]); //模糊查询信息文本区的添加 js.setBounds(0,350,600,100); jpyInfo.add(js); //编辑、保存按钮 jbInfo[0].setBounds(160,300,80,26); jbInfo[0].addActionListener(this); jpyInfo.add(jbInfo[0]); jbInfo[1].setBounds(260,300,80,26); jbInfo[1].addActionListener(this); jpyInfo.add(jbInfo[1]); //性别部分 jrbMale.setBounds(5,3,50,26); jrbMale.addItemListener(this); //为单选按钮注册ItemEvent事件监听器 bgGender.add(jrbMale); jpGender.add(jrbMale); jrbFemale.setBounds(60,3,50,26); jrbFemale.addItemListener(this); //为单选按钮注册ItemEvent事件监听器 bgGender.add(jrbFemale); jpGender.add(jrbFemale); jpGender.setBounds(60,70,125,26); jpyInfo.add(jpGender); } public void clearInfo()//清空信息面板 { for(int i=0;i<10;i++) { jtfInfo[i].setText("");//清空文本框 } jlPhoto.setIcon(null);//清空图像 } public void setjtaArea(String information){ if(information.isEmpty()){ JOptionPane.showMessageDialog(this,"所查用户不存在!!!","错误", JOptionPane.WARNING_MESSAGE); } else { jta.setText(information); } } public void setInfo(Vector<String> pInfo)//将信息向量设置到信息面板中 {//将信息向量按规则填到信息面板里 this.clearInfo(); if(pInfo.size()==0) { JOptionPane.showMessageDialog(this,"所查用户不存在!!!","错误", JOptionPane.WARNING_MESSAGE); } else { for(int i=0;i<2;i++) {//显示联系人编号和姓名 jtfInfo[i].setText(pInfo.get(i)); } if(pInfo.get(2).equals("男")) {//显示性别 jrbMale.setSelected(true); } else {//显示性别 jrbFemale.setSelected(true); } for(int i=3;i<9;i++) {//显示出生日期、电话号码和QQ jtfInfo[i].setText(pInfo.get(i)); } } } public Vector<String> getInfo()//从信息面板得到用户输入的信息 { Vector<String> pInfo=new Vector<String>(); pInfo.add(jtfInfo[0].getText().trim());//添加pid pInfo.add(jtfInfo[1].getText().trim());//添加pname String gender=jrbMale.isSelected()?"男":"女"; pInfo.add(gender);//添加性别 pInfo.add(jtfInfo[3].getText().trim());//出生日期 pInfo.add(jtfInfo[4].getText().trim());//电话号码 pInfo.add(jtfInfo[5].getText().trim());//QQ pInfo.add(jtfInfo[6].getText().trim());//Email pInfo.add(jtfInfo[7].getText().trim());//地址 String photoPath=jtfPhoto.getText().trim();//得到照片路径 pInfo.add(photoPath);//照片路径 return pInfo; } public void monitorSaveButton() //监听保存按钮的方法 { String sql=""; String pid=jtfInfo[0].getText().trim();//得到联系人的编号 String pname=jtfInfo[1].getText().trim();//得到联系人的姓名 String gender=jrbMale.isSelected()?"男":"女"; String s1=jtfInfo[3].getText().trim(); String s2=jtfInfo[4].getText().trim(); String s3=jtfInfo[5].getText().trim(); String s4=jtfInfo[6].getText().trim(); String s5=jtfInfo[7].getText().trim(); String s6=jtfPhoto.getText().trim(); String sqla="select * from contacts where pid='"+pid+"'";//判断此编号是否存在的SQL String sqlb="select * from contacts where pname='"+pname+"'";//判断此姓名是否存在的SQL boolean isIdExist=DButil.isExist(sqla);//得到编号是否存在 boolean isNameExist=DButil.isExist(sqlb);//得到姓名是否存在 if(!(pid.equals(" ")||pname.equals(" "))) { if(isIdExist||isNameExist){ JOptionPane.showMessageDialog(this,"联系人已存在"+ " , 添加联系人失败","错误",JOptionPane.WARNING_MESSAGE); } else { sql="insert into contacts values (?,?,?,?,?,?,?,?,?,?)"; String[] paras={pid,pname,gender,s1,s2,s3,s4,s5,s6,null}; if(DButil.update(sql,paras)>0){ JOptionPane.showMessageDialog(this,"联系人保存成功","提示", JOptionPane.INFORMATION_MESSAGE); } } } } public void setEditable(boolean Editable)//设置信息窗口是否可编辑 { jrbFemale.setEnabled(Editable);//设置性别是否可编辑 jrbMale.setEnabled(Editable);//设置性别是否可编辑 for(int i=0;i<8;i++) { jtfInfo[i].setEditable(Editable);//设置文本框是否可编辑 } } public void monitorSearchButton()//监听查找按钮的方法 { String name=jtfs.getText().trim(); String sql="";//声明查找字符串 if(name.equals("")) { JOptionPane.showMessageDialog(this,"查找条件不能为空!!!", "错误", JOptionPane.WARNING_MESSAGE); } else { if(jrbxm.isSelected()==true) {//按姓名查找 sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where pname='"+name+"'"; this.setInfo(DButil.getPerInfo(sql));//设置信息面板为该联系人的信息 } else {//按编号查找 sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where pid='"+name+"'"; this.setInfo(DButil.getPerInfo(sql));//设置信息面板为该联系人的信息 } } this.setEditable(false);//设置面板不可编辑 } public void monitorRandomSearchButton(String information){ //监听模糊查询按钮 String adress=jba.getText().trim(); String sql="";//声明查找字符串 if(adress.equals("")) { JOptionPane.showMessageDialog(this,"查找条件不能为空!!!", "错误", JOptionPane.WARNING_MESSAGE); } else{ sql="select pid,pname,pgender,pbirthday,pnumber,pQQ,pemail,padress,pphoto from contacts where padress like '%天河区%'"; } } public MainFrame(String uname) { //主窗体构造器 this.uname=uname;//设置用户名 this.initJps();//界面上半部分的搭建 this.initInfo(); jspOuter.setDividerLocation(46);//设置分割窗体JSplitPane的位置 jspOuter.setTopComponent(topjp);//设置窗体上半部分的控件 jspOuter.setBottomComponent(jpyInfo);//设置下半部分的控件 //设置窗体关闭按钮执行的动作 this.add(jspOuter); this.addWindowListener( new WindowAdapter() { @SuppressWarnings("deprecation") public void WindowClosing(WindowEvent e) { //将窗体隐藏 MainFrame.this.hide(); } } ); //设置主窗体的图标、标题、大小以及可见性 this.setResizable(false);//设置窗体不让调整大小 this.setTitle(uname+"的通讯录"); this.setBounds(420,80,618,550); this.setVisible(true); } public void actionPerformed(ActionEvent e) { if(e.getSource()==jbInfo[1]) {//保存按钮的监听 this.monitorSaveButton(); } else if(e.getSource()==jba) {//模糊查询按钮的监听 DButil db = new DButil(); Vector vector1 = new Vector(); vector1.add("学号"); vector1.add("姓名"); vector1.add("性别"); vector1.add("出生日期"); vector1.add("电话号码"); vector1.add("QQ"); vector1.add("Email"); vector1.add("地址"); vector1.add("照片路径"); String ad = jtfs.getText().trim(); tableModel.setDataVector(db.getData(ad),vector1); } else if(e.getSource()==jbInfo[2]) {//打开图像文件路径 jfcPic.showOpenDialog(this); if(jfcPic.getSelectedFile()!=null) { jtfPhoto.setText(""+jfcPic.getSelectedFile()); } } else if(e.getSource()==jbInfo[0]) {//编辑按钮的监听 this.setEditable(true);//设置信息面板可编辑 } else if(e.getSource()==jbs||e.getSource()==jtfs) {//查找,按按钮或者在文本框里敲回车 this.monitorSearchButton(); } } public void itemStateChanged(ItemEvent e) { } public static void main(String[] args){ } } package db; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.Vector; public class DButil { private static String jdbcName="org.gjt.mm.mysql.Driver";//声明驱动类字符串 //声明数据库连接字符串 private static String dbUrl="jdbc:mysql://127.0.0.1:3306/maillist"; private static String dbUserName="root"; private static String dbPassword="admin"; private static Connection con=null;//声明数据库连接对象引用 private static Statement stat=null;//声明语句对象引用 private static PreparedStatement pstmt=null; private static ResultSet rs=null;//声明结果集对象引用 private static PreparedStatement psInsert=null;//声明预编译语句对象引用 public static Connection getConnection()//得到数据库连接的方法 { System.out.println("连接中.."); try { Class.forName(jdbcName);//加载驱动类 con=DriverManager.getConnection(dbUrl,dbUserName,dbPassword);//得到连接 System.out.println("成功连接"); } catch(Exception e){e.printStackTrace();} return con;//返回连接 } public static boolean check(String user,String pwd)//登陆验证 { boolean flag=false; try { con=DButil.getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery("select pwd from user where uid='"+user+"'"); rs.next(); String spwd=rs.getString(1);//得到密码 if(spwd.equals(pwd)) { flag=true;//密码匹配,登陆成功 } } catch(Exception e) { flag=false;//有任何异常发生,登陆失败 } finally{DButil.closeCon();}//关闭数据库连接 return flag; } //某条记录是否存在 public static boolean isExist(String sql) { boolean flag=false;//设置返回值 try { con=DButil.getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery(sql);//执行查询 if(rs.next()) { flag=true;//存在,设置返回值为true } } catch(Exception e) { e.printStackTrace(); flag=false;//发生任何异常,置返回结果为false } finally{DButil.closeCon();}//关闭数据库连接 return flag;//返回结果 } public static int update(String sql,String[] paras)//更新数据库 { int count=0;//声明返回值 try { con=DButil.getConnection(); pstmt=con.prepareStatement(sql); for(int i=0; i<paras.length;i++){ pstmt.setString(i+1, paras[i]); } count=pstmt.executeUpdate(); } catch(Exception e) { e.printStackTrace(); count=-1;//更新失败返回值为-1 } finally{DButil.closeCon();}//关闭数据库连接 return count;//返回结果 } public static int update(String sql)//更新数据库 { int count=0;//声明返回值 try { con=DButil.getConnection(); stat=con.createStatement(); count=stat.executeUpdate(sql);//执行更新 } catch(Exception e) { e.printStackTrace(); count=-1;//更新失败返回值为-1 } finally{DButil.closeCon();}//关闭数据库连接 return count;//返回结果 } //====================添加联系人================================= public static String insertPerson(String uid,Vector<String> pInfo) { String isPathNull="isNotNull";//传过来的图像是不是合法,默认不为空 try{ con=getConnection();//得到数据库连接 if(pInfo.get(8).equals("")||pInfo.get(8)==null) {//照片路径为空,则不插入图像 psInsert=con.prepareStatement("insert into contacts(pid,pname,pgender,pbirthday,pnumber,"+ "pQQ,pemail,padress,uid)"+ "values(?,?,?,?,?,?,?,?,?)"); } else {//照片路径不为空,则插入图像 psInsert=con.prepareStatement("insert into contacts(pid,pname,pgender,pbirthday,pnumber,"+ "pQQ,pemail,padress,pphoto,uid)"+ "values(?,?,?,?,?,?,?,?,?,?,?)" ); File f=new File(pInfo.get(8));//获取选取的图片文件 byte[] b=new byte[(int)f.length()];//创建存储图片数据的数组 FileInputStream fin=new FileInputStream(f); fin.read(b);fin.close();//读取文件存于byte数组中并关闭输入流 psInsert.setBytes(11,b);//设置pphoto参数的数据 } for(int i=0;i<8;i++) {//设置公共信息 psInsert.setString(i+1,pInfo.get(i)); } psInsert.setString(10,uid);//所属用户 psInsert.execute();psInsert.close();//执行更新并关闭语句 } catch(FileNotFoundException fnfe){isPathNull="isNull";}//图片路径不对 catch(Exception e){e.printStackTrace();} finally{DButil.closeCon();}//关闭数据库连接 return isPathNull; } public static String updatePerson(String uid,Vector<String> pInfo){ String isPathNull="isNotNull";//传过来的path是不是合法 try{ con=getConnection(); if(pInfo.get(9).equals("")||pInfo.get(9)==null) {//更新时候,如果照片路径为空,则不更新图像 psInsert=con.prepareStatement("update contacts set pname=?,pgender=?,birthday=?,pnumber=?,"+ "pQQ=?,pemail=?,padress=?,pphoto=?,uid=? where pid='"+pInfo.get(0).trim()+"'"); } else {//如果照片路径不为空,则更新图像 psInsert=con.prepareStatement("update contacts set pname=?,pgender=?,page=?,pnumber=?,"+ "pemail=?,pgroup=?,ppostalcode=?,padress=?,uid=?,pphoto=? where pid='"+pInfo.get(0).trim()+"'"); File f=new File(pInfo.get(9));//获取选取的图片文件 byte[] b=new byte[(int)f.length()];//创建存储图片数据的数组 FileInputStream fin=new FileInputStream(f); fin.read(b);fin.close();//读取文件存于byte数组中并关闭输入流 psInsert.setBytes(10,b); } for(int i=1;i<8;i++){//设置公共的信息部分 psInsert.setString(i,pInfo.get(i)); } psInsert.setString(9,uid);//所属用户 psInsert.execute();psInsert.close();//执行更新并关闭语句 } catch(FileNotFoundException fnfe){isPathNull="isNull";}//路径不合法 catch(Exception e){e.printStackTrace();} finally{DButil.closeCon();}//关闭连接 return isPathNull; } public Vector getData(String ad){ Vector vector=new Vector(); try { //陈述对象 con=getConnection();//得到数据库连接 stat=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);//创建语句对象 rs=stat.executeQuery("select * from contacts where padress LIKE '%"+ad+"%'"); ResultSetMetaData rm=rs.getMetaData(); //循环打印出数据库表中数据 int n=rm.getColumnCount(); while(rs.next()){ Vector ve=new Vector(); for(int i=1;i<n+1;i++){ String s=rs.getString(i); ve.add(s); } vector.add(ve);//Vector对象接收表中数据 } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{if(rs!=null){ try { rs.close();//关闭结果集 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(stat!=null){ try { stat.close();//关闭陈述对象 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con!=null){ try { con.close();//关闭连接 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } return vector; } public static Vector<String> getPerInfo(String sql)//得到联系人信息 { Vector<String> pInfo=new Vector<String>(); try { con=getConnection();//得到数据库连接 stat=con.createStatement();//创建语句对象 rs=stat.executeQuery(sql);//执行查询 while(rs.next()) { for(int i=1;i<10;i++) { System.out.println(rs.getString(i)); pInfo.add(rs.getString(i));//将联系人信息添加到返回向量 } } } catch(Exception e) { e.printStackTrace(); } finally{DButil.closeCon();}//关闭数据库连接 return pInfo;//返回信息集合 } public static void closeCon()//关闭数据库连接的方法 { try { if(rs!=null){rs.close(); rs=null;}//如果结果集不为空关闭结果集并赋值null if(stat!=null){stat.close(); stat=null;}//如果语句对象不为空关闭语句对象并赋值null if(con!=null){con.close(); con=null;}//如果连接不为空关闭连接并赋值null } catch(Exception e){e.printStackTrace();} } public static void main(String[] args){ DButil DB=new DButil(); System.out.println(DB.getConnection()); } } }
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修饰变量就是这个变量是不可改变的,如果是引用类型就表示一直会引用初始化那个地址的数据,如果是基本类型,就是不能修改这个类型的值 如果不正确请指证一下
C#的WinForms的简单查询
是实现从数据库查询数据的。。 请看代码 public partial class Form2 : Form { private DataSet ds; //声明Dataset private SqlDataAdapter bs; //声明读取年级信息的数据适配器 string saih = "Data Source=.;Initial Catalog=ri;Integrated Security=True"; public Form2() { InitializeComponent(); } private void Form2_Load(object sender, EventArgs e) { //调用方法 searchstudent(); } public void searchstudent() { //创建数据库链接 SqlConnection conn = new SqlConnection(saih); try { //查询年级的SQL语句 StringBuilder sb = new StringBuilder(); sb.Append("select id,name,sex,birthday"); sb.Append(" from grade"); if (Convert.ToInt32(this.cbo.SelectedValue) != -1) { sb.AppendFormat(" where id={0}",Convert.ToInt32(this.cbo.SelectedValue)); } sb.Append(" order by [id]"); bs = new SqlDataAdapter(); //填充Dataset SqlCommand comm = new SqlCommand(sb.ToString(),conn); bs.SelectCommand = comm; //填充钱,清空原有的数据 if (ds.Tables["grade"] != null) { ds.Tables["grade"].Clear(); } bs.Fill(ds, "grade"); } catch (Exception ex) { MessageBox.Show(ex.Message,"异常提示",MessageBoxButtons.OK,MessageBoxIcon.Warning); } finally { conn.Close(); } } private void btnselect_Click(object sender, EventArgs e) { searchstudent(); } } } 结果显示:未将对象引用设置到对象的实例 我们现在学的还是些简单的基础东西。。这些代码我是按照书本上敲的。过程没有报错什么的。但是运行就是没效果。请各位帮帮忙
在SurfaceView extends Surface中定义了class,在里面重载onkeyup,就是执行不了
代码如下: package com.rzy.plane; import java.util.Random; import java.util.Vector; import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.SurfaceHolder.Callback; public class MainActivity extends Activity { MySurfaceView mysurfaceview = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mysurfaceview = new MySurfaceView(this); setContentView(mysurfaceview); } } class MySurfaceView extends SurfaceView implements Callback { private SurfaceHolder sfh; private Paint paint; //定义游戏状态变量 public static final int GAME_MENU = 0; public static final int GAMEING = 1; public static final int GAME_WIN = 2; public static final int GAME_LOST = 3; public static final int GAME_PAUSE = -1; //当前游戏状态(默认初始在游戏菜单界面) public static int gameState = GAME_MENU; public static int screenW; public static int screenH; //声明一个Resources实例便于加载图片 private Resources res = this.getResources(); private Bitmap bmpBackGround;//游戏背景 private Bitmap bmpBoom;//爆炸效果 private Bitmap bmpBoosBoom;//boss爆炸效果 private Bitmap bmpButton;//游戏开始按钮 private Bitmap bmpButtonPress;//游戏开始按钮点击 private Bitmap bmpEnemyduck;//怪物鸭子 private Bitmap bmpEnemyFiy;//怪物苍蝇 private Bitmap bmpEnemyBoss;//怪物boss private Bitmap bmpGameWin;//游戏胜利背景 private Bitmap bmpGameLost;//游戏失败背景 private Bitmap bmpPlayer;//游戏主角飞机 private Bitmap bmpPlayerHp;//游戏主角飞机血量 private Bitmap bmpMenu;//菜单背景 private Bitmap bmpBullet;//子弹 private Bitmap bmpEnmeyBullet;//敌机飞机 private Bitmap bmpBossBullet;//Boss子弹 //声明一个菜单对象 private GameMenu gameMenu; //声明一个滚动游戏背景对象 private GameBg backGround; //声明主角对象 private Player player; String tag = "MySurfaceView"; public MySurfaceView(Context context) { super(context); sfh = this.getHolder(); sfh.addCallback(this); paint = new Paint(); paint.setColor(Color.WHITE); } @Override public void surfaceCreated(SurfaceHolder holder) { screenW = this.getWidth(); screenH = this.getHeight(); initGame(); myDraw(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { } public void myDraw() { Canvas canvas = sfh.lockCanvas(); switch (gameState) { case GAME_MENU: gameMenu.draw(canvas, paint); Log.i(tag, "00"); break; case GAMEING: //游戏 背景 backGround.draw(canvas, paint); //主角绘图函数 player.draw(canvas, paint); Log.i(tag, "0"); break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; } sfh.unlockCanvasAndPost(canvas); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (gameState) { case GAME_MENU: break; case GAMEING: //主角的按键按下事件 player.onKeyDown(keyCode, event); Log.i(tag, "1"); break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { switch (gameState) { case GAME_MENU: break; case GAMEING: //按键抬起事件 player.onKeyUp(keyCode, event); Log.i(tag, "2"); break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; } return super.onKeyUp(keyCode, event); } @Override public boolean onTouchEvent(MotionEvent event) { // Canvas canvas = sfh.lockCanvas(); switch (gameState) { case GAME_MENU: gameMenu.onTouchEvent(event); Log.i(tag, "1"); myDraw(); break; case GAMEING: break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; } // sfh.unlockCanvasAndPost(canvas); return true; } private void logic() { switch (gameState) { case GAME_MENU: break; case GAMEING: //背景逻辑 backGround.logic(); //主角逻辑 player.logic(); Log.i(tag, "3"); break; case GAME_WIN: break; case GAME_LOST: break; case GAME_PAUSE: break; } } private void initGame() { if (gameState == GAME_MENU) { bmpBackGround = BitmapFactory.decodeResource(res, R.drawable.background); bmpBoom = BitmapFactory.decodeResource(res, R.drawable.boom); bmpBoosBoom = BitmapFactory.decodeResource(res, R.drawable.boom); bmpButton = BitmapFactory.decodeResource(res, R.drawable.button); bmpButtonPress = BitmapFactory.decodeResource(res, R.drawable.button_press); bmpEnemyduck = BitmapFactory.decodeResource(res, R.drawable.boss_duck); bmpEnemyFiy = BitmapFactory.decodeResource(res, R.drawable.boss_fly); bmpEnemyBoss = BitmapFactory.decodeResource(res, R.drawable.boss_pig); bmpGameWin = BitmapFactory.decodeResource(res, R.drawable.win); bmpGameLost = BitmapFactory.decodeResource(res, R.drawable.lost); bmpPlayer = BitmapFactory.decodeResource(res, R.drawable.zhujue); bmpPlayerHp = BitmapFactory.decodeResource(res, R.drawable.hp); bmpMenu = BitmapFactory.decodeResource(res, R.drawable.menu); bmpBullet = BitmapFactory.decodeResource(res, R.drawable.bullte); bmpEnmeyBullet = BitmapFactory.decodeResource(res, R.drawable.enemy_bullye); bmpBossBullet = BitmapFactory.decodeResource(res, R.drawable.bossbullte); } gameMenu = new GameMenu(bmpMenu, bmpButton, bmpButtonPress); backGround = new GameBg(bmpBackGround); player = new Player(bmpPlayer, bmpPlayerHp); } public class GameMenu { //菜单背景 private Bitmap bmpMenu; //按钮图片资源(按下和未按下图) private Bitmap bmpButton, bmpButtonPress; //按钮坐标 private int btnX, btnY; //按钮标记 private Boolean isPress; //菜单初始化 public GameMenu(Bitmap bmpMenu, Bitmap bmpButton, Bitmap bmpButtonPress) { this.bmpMenu = bmpMenu; this.bmpButton = bmpButton; this.bmpButtonPress = bmpButtonPress; //X居中,Y紧接屏幕底部 btnX = MySurfaceView.screenW / 2 - bmpButton.getWidth() / 2; btnY = MySurfaceView.screenH / 2 - bmpButton.getHeight() / 2; isPress = false; } //菜单绘图函数 public void draw(Canvas canvas, Paint paint) { canvas.drawBitmap(bmpMenu, 0, 0, paint); //绘制未按下按钮图 if(isPress) { canvas.drawBitmap(bmpButtonPress, btnX, btnY, paint); } else { canvas.drawBitmap(bmpButton, btnX, btnY, paint); } } //菜单触屏事件函数,主要用于处理按钮事件 public void onTouchEvent(MotionEvent event) { int pointX = (int) event.getX(); int pointY = (int) event.getY(); if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) { if (pointX > btnX && pointX < btnX + bmpButton.getWidth()) { if (pointY > btnY && pointY < btnY + bmpButton.getHeight()) { isPress = true;Log.i(tag, "TRYE"); } else { isPress = false;Log.i(tag, "FALSE1"); } } else { isPress = false;Log.i(tag, "FALSE2"); } } else if (event.getAction() == MotionEvent.ACTION_UP) { if (pointX > btnX && pointX < btnX + bmpButton.getWidth()) { if (pointY > btnY && pointY < btnY + bmpButton.getHeight()) { isPress = false;Log.i(tag, "FALSE3"); MySurfaceView.gameState = MySurfaceView.GAMEING; } } } } } public class GameBg { //游戏背景的图片资源 //为了循环播放,这里定义两个位图对象 //其资源引用的是同一张图片 private Bitmap bmpBackGround1; private Bitmap bmpBackGround2; //游戏背景坐标 private int bg1x, bg1y, bg2x, bg2y; //背景滚动速度 private int speed = 3; //游戏背景构造函数 public GameBg(Bitmap bmpBackGround) { this.bmpBackGround1 = bmpBackGround; this.bmpBackGround2 = bmpBackGround; //首先让第一张背景底部正好填满整个屏幕 bg1y = -Math.abs(bmpBackGround1.getHeight() - MySurfaceView.screenH); //第二张背景图紧接在第一张背景的上方 //+101的原因:虽然两张背景图无缝隙连接但是因为图片资源头尾 //直接连接不和谐,为了让视觉看不出是两张图连接而修正的位置 bg2y = bg1y - bmpBackGround1.getHeight() + 101; } //游戏背景的绘图函数 public void draw(Canvas canvas, Paint paint) { //绘制两张背景 canvas.drawBitmap(bmpBackGround1, bg1x, bg1y, paint); canvas.drawBitmap(bmpBackGround2, bg2x, bg2y, paint); } //游戏背景的逻辑函数 public void logic() { bg1y += speed; bg2y += speed; //当第一张图片的Y坐标超出屏幕, //立即将其坐标设置到第二张图的上方 if (bg1y > MySurfaceView.screenH) { bg1y = bg2y - bmpBackGround1.getHeight() + 111; } if (bg2y > MySurfaceView.screenH) { bg2y = bg1y - bmpBackGround1.getHeight() + 111; } } } public class Player { //主角血量与血量位图 //默认3血 private int playerHp = 3; private Bitmap bmpPlayerHp; //主角的坐标以及位图 public int x, y; private Bitmap bmpPlayer; //主角移动速度 private int speed = 5; //主角移动白哦是 private boolean isUp, isDown, isLeft, isRight; //主角的构造函数 public Player(Bitmap bmpPlayer, Bitmap bmpPlayerHp) { this.bmpPlayer = bmpPlayer; this.bmpPlayerHp = bmpPlayerHp; x = MySurfaceView.screenW / 2 - bmpPlayer.getWidth() / 2; y = MySurfaceView.screenH - bmpPlayer.getHeight(); } //主角的绘图函数 public void draw(Canvas canvas, Paint paint) { //绘制主角 canvas.drawBitmap(bmpPlayer, x, y, paint); //绘制血量 for (int i = 0; i < playerHp; i++) { canvas.drawBitmap(bmpPlayerHp, i * bmpPlayerHp.getWidth(), MySurfaceView.screenH - bmpPlayerHp.getHeight(), paint); } } //试题按键 public void onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { isUp = true; } if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { isDown = true; } if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { isLeft = true; } if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { isRight = true; } } //实体按键抬起 public void onKeyUp(int keyCode, KeyEvent event) { Log.i(tag, "player.keyup"); if (keyCode == KeyEvent.KEYCODE_DPAD_UP) { isUp = false; } if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { isDown = false; } if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { isLeft = false; } if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { isRight = false; } } //主角的逻辑 public void logic() { //处理主角移动 if(isLeft) { x -= speed; } if(isRight) { x += speed; } if(isUp) { y -= speed; } if(isDown) { y += speed; } //判断品目X边界 if (x + bmpPlayer.getWidth() >= MySurfaceView.screenW) { x = MySurfaceView.screenW - bmpPlayer.getWidth(); } else if (x <= 0) { x = 0; } //判断品目Y边界 if (y + bmpPlayer.getHeight() >= MySurfaceView.screenH) { y = MySurfaceView.screenH - bmpPlayer.getHeight(); } else if (y <= 0) { y = 0; } } //设置主角血量 public void setPlayerHp(int hp) { this.playerHp = hp; } //获取主角血量 public int getplayerHp() { return playerHp; } } }
vs2010运行程序报错:error LNK2019: 无法解析的外部符号
如题,我在vs2010环境下做C++练习题时出现该错误。程序代码如下: //array.h #ifndef ARRAY_H #define ARRAY_H template<typename T> class Array { public: Array(int n);//数组首地址不用指定,待会分配 Array(Array &a); ~Array(); T getAt(int i);//返回第i个数组元素 void setAt(T x,int i);//将第i个元素设置为x protected: private: T *array;//数组首地址 int length;//数组长度 }; #endif //array.cpp #include "array.h" template<typename T>//所有成员函数前必须加模板声明 Array<T>::Array(int n)//成员函数类名后需加<T> { array=new T[n]; length=n; } template<typename T> Array<T>::Array(Array &a) { length=a.length; array=new T[length]; for(int i=0;i<length;i++) array[i]=a.array[i];//数据复制 } template<typename T> Array<T>::~Array() { delete []array; } template<typename T> T Array<T>::getAt(int i) { return array[i]; } template<typename T> void Array<T>::setAt(T x,int i) { array[i]=x; } //test.cpp #include "array.h" #include <iostream> using namespace std; void main() { int a[]={1,2,3,4,5}; double b[]={0,0.5,1.0,1.5,2.0}; Array <int>a1(5);//使用时必须指明传递给类模板的数据类型 Array <double>b1(5);//必须分两行写 for (int i=0;i<5;i++) { a1.setAt(a[i],i);//数据拷给对象 b1.setAt(b[i],i); } Array <int>a2(a1); for (int i=0;i<5;i++) { cout<<a1.getAt(i)<<" "<<a2.getAt(i)<<" "<<b1.getAt(i)<<endl; } } 具体的报错信息如下: c: __thiscall Array<double>::~Array<double>(void)" (??1?$Array@N@@QAE@XZ),该符号在函数 _main 中被引用 1>test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Array<int>::~Array<int>(void)" (??1?$Array@H@@QAE@XZ),该符号在函数 _main 中被引用 1>test.obj : error LNK2019: 无法解析的外部符号 "public: int __thiscall Array<int>::getAt(int)" (?getAt@?$Array@H@@QAEHH@Z),该符号在函数 _main 中被引用 1>test.obj : error LNK2019: 无法解析的外部符号 "public: double __thiscall Array<double>::getAt(int)" (?getAt@?$Array@N@@QAENH@Z),该符号在函数 _main 中被引用 1>test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Array<int>::Array<int>(class Array<int> &)" (??0?$Array@H@@QAE@AAV0@@Z),该符号在函数 _main 中被引用 1>test.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Array<double>::setAt(double,int)" (?setAt@?$Array@N@@QAEXNH@Z),该符号在函数 _main 中被引用 1>test.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Array<int>::setAt(int,int)" (?setAt@?$Array@H@@QAEXHH@Z),该符号在函数 _main 中被引用 1>test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Array<double>::Array<double>(int)" (??0?$Array@N@@QAE@H@Z),该符号在函数 _main 中被引用 1>test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Array<int>::Array<int>(int)" (??0?$Array@H@@QAE@H@Z),该符号在函数 _main 中被引用 1>D:\vsprojects\chaper5\array3\Debug\array3.exe : fatal error LNK1120: 9 个无法解析的外部命令 补充:我将上述代码改写到同一个cpp文件中,发现问题解决。 我重新建立过项目和文件,确定不是建错工程、建错文件等情况。望各位给出一些方向,谢谢!
c++ 智能对象声明与堆内存,请明白人指点,谢谢
定义 含有计数器的智能类模板如下: template <class T> class SmartObjectPtr { private: T* p; public: SmartObjectPtr(T* p_=NULL) : p(p_) { if (p) p->AddRef(); }; SmartObjectPtr(const SmartObjectPtr &p_) : p((T*)p_) { if (p) p->AddRef(); }; ~SmartObjectPtr(void) { if (p) p->Release(); }; SmartObjectPtr& operator=(SmartObjectPtr &p_) { return operator=((T*)p_); }; SmartObjectPtr& operator=(T* p_) { // must take care the order, if release p first, then add ref to // p_ may fail if p_ == p, cause release p may delete p_ !!! if (p_) p_->AddRef(); if (p) p->Release(); p = p_; return *this; }; bool operator==(SmartObjectPtr &p_) { return operator==((T*)p_); }; bool operator==(T* p_) { return p == p_; }; bool operator!=(SmartObjectPtr &p_) { return operator!=((T*)p_); }; bool operator!=(T* p_) { return p != p_; }; operator T*(void) const { return p; }; operator T*(void) { return p; }; // new T& operator*(void) { return *p; }; T* operator->(void) { return p; }; T* GetAddr(void) { return p; }; bool isNull(void) { return p==NULL; } bool notNull(void) { return p!=NULL; } }; 定义引用计数器如下: class SmartObject { public: SmartObject(const char *pName="SmartObject"); virtual ~SmartObject(void); void AddRef(void); void Release(void); int GetRef(void); private: const char *m_Name; int m_Ref; bool m_Valid; protected: }; class A:public SmartObject { public: A():SmartObject("objA"){}; ~A(){}; }; typedef SmartObjectPtr<A> PA; PA pa = new A();//这一句不理解 ---- PA pa 这是用 类型A 来实例化 SmartObjectPtr的一个对象,而new A() 则是分配一个堆内存,并返回对内存的地址。 这2者是怎么扯上关系的?如果从赋值运算符= 来解释,我加上调试信息后,也没有看到输出调用赋值运算啊。 我们一般常用 A *pa1 = new A; 上面PA pa = new A();---这个pa 本来是一个对象,变成了指针??
Spring事务的问题,bulkUpdate,或query.executeUpdate
今天在测试spring任务调度时,突然发现我配的声明事务不起作用了,找了好久才发现不是我的事务的问题,是我在Dao中用了一个方法有问题 方法如下: public void updateByIds(final Set<String> updateIds)throws DaoException{ try { String queryString="update from Yaoyueyingyue y set y.state='2' where y.yaoyueid in (?)"; getHibernateTemplate().bulkUpdate(queryString, updateIds.toArray()); } catch (Exception e) { e.printStackTrace(); throw new DaoException(this.getClassName()+e.getMessage()); } updateIds是一个包含要更新的编号集合,我发现用这个方法在我Manager中调用Dao事务就不起作用了,后来又改成这样 public void updateByIds(final Set<String> updateIds)throws DaoException{ try { getHibernateTemplate().execute(new HibernateCallback(){ final String hql="update Yaoyueyingyue y set y.state=2 where yaoyueid in (:yaoyueid)"; public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query=session.createQuery(hql); query.setParameterList("yaoyueid", updateIds); query.executeUpdate(); return null; } }); } catch (Exception e) { e.printStackTrace(); throw new DaoException(this.getClassName()+e.getMessage()); } } 事务还是不行,这两个方法好像不受spring AOP事务管理,只要执行到这个Dao的方法就自动提交了,出来异常也不能回滚,真是郁闷,小弟对这块不是很明白,为什么事务就不行了呢,希望那位牛人,帮我解释下,谢谢了, 我的spring声明事务大概如下: <bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close"> <property name="forceShutdown"> <value>true</value></property> </bean> <bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp"> <property name="transactionTimeout" value="300"/> </bean> <bean id="springTransactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManager"><ref bean="atomikosTransactionManager" /></property> <property name="userTransaction"><ref bean="atomikosUserTransaction" /></property> </bean> <aop:config> <!-- This definition creates auto-proxy infrastructure based on the given pointcut, expressed in AspectJ pointcut language. Here: applying the advice named "txAdvice" to all methods on classes named PetStoreImpl. --> <aop:advisor pointcut="execution(* com.goal.log.manager.*.*(..))" advice-ref="txAdvice" /> <aop:advisor pointcut="execution(* com.goal.system.manager.*.*(..))" advice-ref="txAdvice" /> </aop:config> <!-- @Transactional 时要使用下面一行 --> <!-- <tx:annotation-driven transaction-manager="springTransactionManager" proxy-target-class="true"/> --> <!-- Transaction advice definition, based on method name patterns. Defaults to PROPAGATION_REQUIRED for all methods whose name starts with "insert" or "update", and to PROPAGATION_REQUIRED with read-only hint for all other methods.--> <!-- 引用springTransactionManager --> <tx:advice id="txAdvice" transaction-manager="springTransactionManager"> <tx:attributes> <tx:method name="save*" rollback-for="java.lang.Exception"/> <tx:method name="insert*" rollback-for="java.lang.Exception"/> .... <tx:method name="*" read-only="true" rollback-for="java.lang.Exception"/> </tx:attributes> </tx:advice> atomikosTransactionManager这个东西不用管,是一个开源的支持JTA分布式的JAR,希望有人能够为我解答........ [b]问题补充:[/b] 谢谢你的解答,但是我还是不明白你的意思,你是指我的Dao中用了内部类吗,你所指的 “调用updateByIds方法 的代码 跳出你的当前类 然后在别的类调用当前了类的接口中的方法updateByIds ”是指什么意思,能不能说明白点,谢谢了!!! [b]问题补充:[/b] 谢谢你的答复,你的意思我也理解,但好像不是这个问题,因为我并没有像你说的那样在类的内部调用,我的所有方法都是在业务逻辑层调用的Manager层,Manager层我是在Spring中配置了的声明事务的,我给你据个例子: 这两个方法都是Dao中的 方法一: [code="java"] public void updateByIds(final Set<String> updateIds)throws DaoException{ try { /*String queryString="update from Yaoyuepub y set y.state='2' where y.yaoyueid in (?)"; getHibernateTemplate().bulkUpdate(queryString, updateIds.toArray());*/ getHibernateTemplate().execute(new HibernateCallback(){ final String hql="update Yaoyuepub y set y.state=2 where yaoyueid in (:yaoyueid)"; public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query=session.createQuery(hql); query.setParameterList("yaoyueid", updateIds); query.executeUpdate(); return null; } } ); } catch (Exception e) { e.printStackTrace(); throw new DaoException(this.getClassName()+e.getMessage()); } } [/code] 这个方法是把所有的要改的ID都一次性更新调,我是不想执行多条sql,在Manager中调用这个方法事务就起不了作用,还有一个方法,就是普通的更新对象 [code="java"] public void update(T t) throws DaoException { try { getHibernateTemplate().update(t); } catch (Exception e) { throw new DaoException(getClassName() + " update exception...",e); } } [/code] 要是把刚才Manager中调用改成循环执行下面的方法一个一个对象,就是有事务的,所以调用都一样,更类的内部调用应给没有关系的,我认为不管是query.executeUpdate还是spring自己提供的bulkUpdate这两个方法都是要写sql的,目的是满足批量更新和更大的灵活性,但是事务就不行了,我认为肯定可以让声明式事务支持这两个方法,就是不知道怎么配置一下,你可以自己在代码中分别做个例子试试,看看是不是用批量更新事务就控制不了了, 这就是我的理解,还请多多指教,谢谢诶!!! [b]问题补充:[/b] 我测试过了,以为可以了,但是还是不行,下面是我调用的一小部分代码 [code="java"] public void runThread() { Set<String> updateIds = new HashSet<String>(); for (Yaoyueyingyue yaoyueyingyue : yaoyueyingyues) { updateIds.add(yaoyueyingyue.getYaoyueid()); } if (updateIds.size() > 0) { yaoyuepubDao.updateByIds(updateIds); if(true) throw new RuntimeException("AAAAAAAAAAAAAAAAAAAAAAAAA"); yaoyueyingyueDao.updateByIds(updateIds); } [/code] 上面是我Manager中Spring任务调度自动执行的方法的一小部分,我中间估计抛出了异常,但是yaoyuepubDao数据库中都更新了,事务不起作用,我估计其实就是和bulkUpdate方法一样,只要这个方法能用事务控制了的话,应该没问题了 [b]问题补充:[/b] 下面是我在网上拷贝的--------------------------------   Spring的HibernateTemplate提供了Hibernate的完美封装,即通过匿名类实现回调,来保证Session的自动资源管理和事务的管理。其中核心方法是:   java代码: HibernateTemplate.execute(new HibernateCallback() {  public Object doInHibernate(Session session) throws HibernateException {   ....  } }   回调方法提供了session作为参数,有了session,就可以自由的使用Hibernate API编程了。使用了spring的之后,代码修改如下:   web层代码:   java代码: DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class); detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20))); departmentManager.findByCriteria(detachedCriteria);   构造detachedCriteria,作为参数传递给departmentManager   业务层代码使用spring,DepartmentManager的findByCriteria如下:   java代码: public List findByCriteria(final DetachedCriteria detachedCriteria) {  return (List) getHibernateTemplate().execute(new HibernateCallback() {   public Object doInHibernate(Session session) throws HibernateException {    Criteria criteria = detachedCriteria.getExecutableCriteria(session);    return criteria.list();   }  }); }   实际上也就是:   java代码: Criteria criteria = detachedCriteria.getExecutableCriteria(session); return criteria.list();   而已   但是该程序代码执行,会抛出强制类型转换异常!   我跟踪了一下spring和Hibernate源代码,原因如下:   spring的HibernateTemplate的execute方法提供的回调接口具有Session作为参数,但是实际上,默认情况下,HibernateTemplate传递给回调接口的session并不是org.hibernate.impl.SessionImpl类,而是SessionImpl类的一个Proxy类。之所以替换成为一个Proxy类,HibernateTemplate的注释说明,Proxy提供了一些额外的功能,包括自动设置Cachable,Transaction的超时时间,Session资源的更积极的关闭等等。   java代码: private boolean exposeNativeSession = false; ...   execute方法内部: Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));   但是遗憾的是,Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl,但是spring传过来的却是一个Proxy类,因此就报错了。   java代码: public Criteria getExecutableCriteria(Session session) {  impl.setSession( (SessionImpl) session ); // 要求SessionImpl,Spring传递的是Proxy  return impl; }   解决方法,禁止Spring的HibernateTemplate传递Proxy类,强制要求它传递真实的SessionImpl类,即给exexute方法增加一个参数,提供参数为true,如下:   java代码: public List findByCriteria(final DetachedCriteria detachedCriteria) {  return (List) getHibernateTemplate().execute(new HibernateCallback() {   public Object doInHibernate(Session session) throws HibernateException {    Criteria criteria = detachedCriteria.getExecutableCriteria(session);    return criteria.list();   }  }, true); } [b]问题补充:[/b] bulkUpdate这个方法按你给的源码,那我是用错了,但是你所说的我的模拟异常不再AOP的事务之内,我就不同意你的观点了,[code="java"] if (updateIds.size() > 0) { yaoyuepubDao.updateByIds(updateIds); // 事务开启 执行updateByIds 事务提交 if(true) throw new RuntimeException("AAAAAAAAAAAAAAAAAAAAAAAAA"); yaoyueyingyueDao.updateByIds(updateIds); // 事务开启 执行updateByIds 事务提交 } [/code] 我这段代码是两个Dao的操作,而这两个Dao的操作是被封装在一个Manger中的方法中的,Manager的每个方法都是有事务的,在操作玩第一个Dao后抛出一个RunTime异常,这时候第一个Dao操作已经执行了,这时候事务应该回滚的,不应该去更新的第一个Dao的操作,Manager中本来就业务层,中间有好多的Dao操作,事务应该控制这些Dao要不都提交,要不都回滚,你说呢,而你说的在11-12行之间加异常,那在一个Dao中,再说的的Dao是没有配事务的,又何谈回滚呢,要是把我上面两个Dao操作改成普通的对象更新,是可以回滚的,这个我肯定 比如这样 [code="java"] yaoyuepubDao.update(yaoyuepub); if(true) throw new RuntimeException("AAAAAAAAAAAAAAAAAAAAAAAAA"); yaoyueyingyueDao.update(yaoyueyingyue); [/code] 这个时候如果抛出异常,yaoyuepub是不会更新到数据库的,会回滚的,所以我总结就是executeUpdate(sql)这个方法我们直接sql,和操作对象是不一样的的,具体我也没有研究 [b]问题补充:[/b] [code="java"] public void updateByIds(final Set<String> updateIds)throws DaoException{ try { getHibernateTemplate().execute(new HibernateCallback(){ final String hql="update Yaoyuepub y set y.state=2 where yaoyueid in (:yaoyueid)"; public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query=session.createQuery(hql); query.setParameterList("yaoyueid", updateIds); query.executeUpdate(); return null; } } , true); } catch (Exception e) { e.printStackTrace(); throw new DaoException(this.getClassName()+e.getMessage()); } } [/code] 把上面的updateIds方法改成: [code="java"] public void updateByIds(final Set<String> updateIds)throws DaoException{ try { DetachedCriteria dc=DetachedCriteria.forClass(Yaoyuepub.class); dc.add(Restrictions.in("yaoyueid", updateIds)); List<Yaoyuepub> yaoyuepubs=select(dc); for(Yaoyuepub y:yaoyuepubs){ update(y); } } catch (Exception e) { e.printStackTrace(); throw new DaoException(this.getClassName()+e.getMessage()); } } [/code] 所有的调用都不变,spring事务就起作用了,说明自己createQuery然后executeUpdate是不被事务管理的,后其他都没有关系
大一简单作业,谢谢大家,今晚要提交
悬赏提高了 请将代码发到我的邮箱:gsshshabq@163.com 请基本原创编写 实验内容及要求: 1)自定义日期类,要求有年月日三个成员变量,有带参数的构造方法,拷贝构造方法,可以20170328的形式输出日期对象。(主方法中应有含对所有成员方法的测试语句) 2)自定义Person类,有姓名、身份证号、出生日期(用第1题中的日期类)、性别,当前人数(静态)等成员变量,有带参数的构造方法(如果出生日期和身份证号不符合,则创建对象失败),有输出方法。 要求有以下方法: public int getAge(int year) //返回当前对象在year年份的年龄 public int getAge() //返回当前对象今年的年龄,重载 public boolean equals(Person p)//比较当前对象与p引用实例对应成员变量值是否相等 3)由Person类派生student类,增加学号、专业名称、专业代码等成员变量。其中学号由student的构造方法自动生成(格式为2017+专业代码(2位)+流水号(3位),最大流水号就是当前该专业的人数)。 4)声明银行账户类,成员变量包括账号、储户姓名、开户时间、身份证号码、存款余额等账户信息,成员方法包括开户、存款、取款、查询(余额)、销户等操作。主要成员描述如下。(此处只列出了主要成员及方法,需按题目要求自己补充完整) public class Account //账户类 { private String name; //储户姓名 private double balance; //账户余额 public Account(String name) //构造方法,参数指定储户姓名 public String getName() //返回账户名 public double balance() //查看账户余额 public boolean put(double value) //存款操作,参数为存入金额 public double get(double value) //取款操作,参数为取款金额,返回实际取到金额 } 5)以矩形区域表示的图形抽象类RectangularShape声明如下,实现其中非抽象方法;并声明矩形类和椭圆类作为RectangularShape的子类,计算面积和周长。 public abstract class RectangularShape //以矩形区域表示的图形抽象类 { public int width,height; //矩形区域的宽度和高度 public RectangularShape(int width, int height) //构造方法 public RectangularShape() public abstract double area(); //计算面积,抽象方法 public abstract double perimeter(); //计算周长,抽象方法 }
关于友元函数的小问题
#include <iostream> //声明类Point using namespace std; class Point { public: Point(float x=0,float y=0); //有默认参数的构造函数 void setPoint(float ,float); //设置坐标值 float getX( )const {return x;} //读x坐标 float getY( )const {return y;} //读y坐标 friend ostream& operator<<(ostream &,const Point &); //重载运算符“<<” protected: //受保护成员 float x, y; }; //下面定义Point类的成员函数 Point::Point(float a,float b) //Point的构造函数 { //对x,y初始化 x=a; y=b; } void Point::setPoint(float a,float b) //设置x和y的坐标值 { //为x,y赋新值 x=a; y=b; } //重载运算符“<<”,使之能输出点的坐标 ostream& operator<<(ostream &cout, const Point &p) { cout<<"["<<p.x<<","<<p.y<<"]"<<endl; return cout; } class Circle:public Point //circle是Point类的公用派生类 { public: Circle(float x=0,float y=0,float r=0); //构造函数 void setRadius(float ); //设置半径值 float getRadius( )const; //读取半径值 float area ( )const; //计算圆面积 friend ostream &operator <<(ostream &,const Circle &); //重载运算符“<<” private: float radius; }; //定义构造函数,对圆心坐标和半径初始化 Circle::Circle(float a,float b,float r):Point(a,b),radius(r){} //设置半径值 void Circle::setRadius(float r){radius=r;} //读取半径值 float Circle::getRadius( )const {return radius;} //计算圆面积 float Circle::area( )const { return 3.14159*radius*radius; } //重载运算符“<<”,使之按规定的形式输出圆的信息 ostream &operator <<(ostream &output,const Circle &c) { output<<"Center=["<<c.x<<","<<c.y<<"],r="<<c.radius<<",area="<<c.area( )<<endl; return output; } int main( ) { Circle c(3.5,6.4,5.2); //建立Circle类对象c,并给定圆心坐标和半径 cout<<"original circle:\\nx="<<c.getX()<<", y="<<c.getY()<<", r="<<c.getRadius( )<<", area="<<c.area( )<<endl; //输出圆心坐标、半径和面积 c.setRadius(7.5); //设置半径值 c.setPoint(5,5); //设置圆心坐标值x,y cout<<"new circle:\\n"<<c; //用重载运算符“<<”输出圆对象的信息 Point &pRef=c; //pRef是Point类的引用变量,被c初始化 cout<<"pRef:"<<pRef; //输出pRef的信息 return 0; } 报错内容是(友元函数不能访问保护成员???) G:\c_files\try_2.cpp(506) : error C2248: 'x' : cannot access protected member declared in class 'Point' G:\c_files\try_2.cpp(490) : see declaration of 'x' G:\c_files\try_2.cpp(506) : error C2248: 'y' : cannot access protected member declared in class 'Point' G:\c_files\try_2.cpp(490) : see declaration of 'y' G:\c_files\try_2.cpp(534) : error C2248: 'x' : cannot access protected member declared in class 'Point' G:\c_files\try_2.cpp(490) : see declaration of 'x' G:\c_files\try_2.cpp(534) : error C2248: 'y' : cannot access protected member declared in class 'Point' G:\c_files\try_2.cpp(490) : see declaration of 'y' G:\c_files\try_2.cpp(534) : error C2248: 'radius' : cannot access private member declared in class 'Circle' G:\c_files\try_2.cpp(518) : see declaration of 'radius' G:\c_files\try_2.cpp(539) : warning C4305: 'argument' : truncation from 'const double' to 'float' G:\c_files\try_2.cpp(539) : warning C4305: 'argument' : truncation from 'const double' to 'float' G:\c_files\try_2.cpp(545) : error C2593: 'operator <<' is ambiguous 执行 cl.exe 时出错. 另有,将point类中重载函数写成inline就不报错了,为什么?
spring的jdbctemplet的queryforObject()有异常,不知道原因
public String execute()throws Exception{ if("save".equals(actionStr)){ sql = "update DY_Topic_Group set TGName='"+tgname+"',"+ "TDetail='"+tdetail+"' where TGID="+tgid; if(dbu.update(sql)){ //更新课程资料 message = "课程资料保存成功<br>"; } else{ message = "未知错误,课程资料保存失败<br>"; } sql = "select 1 from DY_User where URole=1 and UName='"+uname+"'"; //查看该用户是否是老师 if(!dbu.isExist(sql)){ //如果该用户是老师 message += "为课程指定老师失败,因为该用户不是老师"; } else{ sql = "select TUID from DY_TU where TGID="+tgid+" and UID=(select UID from"+ " DY_User where UName='"+uname+"')"; //搜出该课程和老师ID的关系记录主键 System.out.println("1"); String tuid = dbu.getStringInfo(sql); System.out.println(tuid); sql = "update DY_TU set UID=(select UID from DY_User where UName='"+uname+ "') where TUID="+tuid; System.out.println("3"); if(dbu.update(sql)){ message += "修改课程老师资料修改成功"; } else{ message += "未知错误,老师信息修改失败"; } } } [color=red]上面是给一门课程指定一个老师,下面是dbutil里面的getstringinfo方法[/color]public class DBUtil{ private JdbcTemplate jt; //声明JdbcTemplate对象引用 private List rl = null; //声明List对象引用 private String sql = null; //声明SQL字符串引用 private DataSource ds; //声明DataSource引用 private DataSourceTransactionManager dtm; private DefaultTransactionDefinition dtd; [color=red]此处省略一些代码。。。。。。。[/color] public String getStringInfo(String sql){ String info = null; //声明返回字符串引用 try{ sql = new String(sql.getBytes(),"iso8859-1");//对SQL语句转码 System.out.println("p"); info = (String)jt.queryForObject(sql,String.class); //执行查询 System.out.println("o"); info = new String(info.getBytes("iso8859-1"),"gbk");//对查询的字符串转码 System.out.println("i"); } catch(Exception e){ info = null;//有异常发生则info置为null System.out.println("u"); } return info; //返回查询结果 } [color=red]下面是tomcat服务器上的输出[/color] =============拦截器=============2011-4-2 21:24:36 isExist select 1 from DY_User where URole=1 and UName='w' 1 p [color=red]u null[/color] 3 [color=red]通过输出u 和 null 说明有异常,但我不知道为什么会有异常[/color]
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
死磕YOLO系列,YOLOv1 的大脑、躯干和手脚
YOLO 是我非常喜欢的目标检测算法,堪称工业级的目标检测,能够达到实时的要求,它帮我解决了许多实际问题。 这就是 YOLO 的目标检测效果。它定位了图像中物体的位置,当然,也能预测物体的类别。 之前我有写博文介绍过它,但是每次重新读它的论文,我都有新的收获,为此我准备写一个系列的文章来详尽分析它。这是第一篇,从它的起始 YOLOv1 讲起。 YOLOv1 的论文地址:https://www.c...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片...
简明易理解的@SpringBootApplication注解源码解析(包含面试提问)
欢迎关注文章系列 ,关注我 《提升能力,涨薪可待》 《面试知识,工作可待》 《实战演练,拒绝996》 欢迎关注我博客,原创技术文章第一时间推出 也欢迎关注公 众 号【Ccww笔记】,同时推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《提升能力,涨薪可待篇》- @SpringBootApplication注解源码解析 一、@SpringBootApplication 的作用是什...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给袈...
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库 回到首页 目录: Python语言高频重点汇总 目录: 1. 函数-传参 2. 元类 3. @staticmethod和@classmethod两个装饰器 4. 类属性和实例属性 5. Python的自省 6. 列表、集合、字典推导式 7. Python中单下划线和双下划线 8. 格式化字符串中的%和format 9. 迭代器和生成器 10...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
ES6基础-ES6的扩展
进行对字符串扩展,正则扩展,数值扩展,函数扩展,对象扩展,数组扩展。 开发环境准备: 编辑器(VS Code, Atom,Sublime)或者IDE(Webstorm) 浏览器最新的Chrome 字符串的扩展: 模板字符串,部分新的方法,新的unicode表示和遍历方法: 部分新的字符串方法 padStart,padEnd,repeat,startsWith,endsWith,includes 字...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
web前端javascript+jquery知识点总结
Javascript javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ,语法同java类似,是一种解释性语言,边执行边解释。 JavaScript的组成: ECMAScipt 用于描述: 语法,变量和数据类型,运算符,逻辑控制语句,关键字保留字,对象。 浏览器对象模型(Br
Qt实践录:开篇
本系列文章介绍笔者的Qt实践之路。
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
为什么听过很多道理,依然过不好这一生?
记录学习笔记是一个重要的习惯,不希望学习过的东西成为过眼云烟。做总结的同时也是一次复盘思考的过程。 本文是根据阅读得到 App上《万维钢·精英日课》部分文章后所做的一点笔记和思考。学习是一个系统的过程,思维模型的建立需要相对完整的学习和思考过程。以下观点是在碎片化阅读后总结的一点心得总结。
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
一条链接即可让黑客跟踪你的位置! | Seeker工具使用
搬运自:冰崖的部落阁(icecliffsnet) 严正声明:本文仅限于技术讨论,严禁用于其他用途。 请遵守相对应法律规则,禁止用作违法途径,出事后果自负! 上次写的防社工文章里边提到的gps定位信息(如何防止自己被社工或人肉) 除了主动收集他人位置信息以外,我们还可以进行被动收集 (没有技术含量) Seeker作为一款高精度地理位置跟踪工具,同时也是社交工程学(社会工程学)爱好者...
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧...... 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
Python学习笔记(语法篇)
本篇博客大部分内容摘自埃里克·马瑟斯所著的《Python编程:从入门到实战》(入门类书籍),采用举例的方式进行知识点提要 关于Python学习书籍推荐文章 《学习Python必备的8本书》 Python语法特点: 通过缩进进行语句组织 不需要变量或参数的声明 冒号 1 变量和简单数据结构 1.1 变量命名 只能包含字母、数字和下划线,且不能以数字打头。 1.2 字符串 在Python中,用引号...
[Pyhon疫情大数据分析] 一.腾讯实时数据爬取、Matplotlib和Seaborn可视化分析全国各地区、某省各城市、新增趋势
思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫、可视化分析、GIS地图显示、情感分析、舆情分析、主题挖掘、威胁情报溯源、知识图谱、预测预警及AI和NLP应用等。第一篇文章将分享腾讯疫情实时数据抓取,获取全国各地和贵州省各地区的实时数据,并将数据存储至本地,最后调用Maplotlib和Seaborn绘制中国各地区、贵州省各城市、新增人数的图形。希望这篇可视化分析文章对您有所帮助!
相关热词 c# id读写器 c#俄罗斯方块源码 c# linq原理 c# 装箱有什么用 c#集合 复制 c# 一个字符串分组 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图
立即提问