6.Static类

目录

6.Static类

6.1.静态static关键字概述

6.2.静态static关键字修饰成员变量

6.3.静态static关键字修饰成员方法

6.4.静态static内存图

6.5.静态代码块


6.Static类

6.1.静态static关键字概述

1.学生类(姓名,年龄,学号,所在教室); 学生对象(姓名,年龄,学号,所在教室);

2.对于姓名、年龄、学号来说,每一个对象都要自己独立的数据。

3.对于所在教室,这些对象都在同一个教室,应该共享同一份数据,而不是每个对象都要有教室属性。

4.因此,要求只在类中保存唯一一份,那所有本类的对象共享同一份数据

5.一旦使用static关键字,那么该内容不再属于对象自己,而是属于类,所以本类所有对象共享该内容,谁都可以任意更改这个内容。

6.2.静态static关键字修饰成员变量

1.如果一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。

  多个对象共享这个数据,谁都可以修改该数据(为避免修改可以设置常量)。

2.下面是在学生类中将成员变量room设置为静态static,所有本类对象拥有同一份room数据

 将成员变量idCounter学号计数器设置为静态,在构造器中加入累加器并赋值给当前对象学号this.id,

 这样每创建一个对象,虽然没有给学号赋值,也实现了学号自增。

Student学生类:

public class Student {
    private String name;
    private int age;
    static String room;
    private int id; //学号
    //学号计数器,每当new一个新对象的时候,计数器++;学号自动
    private static int discounters=0;

    public Student(){this.id= ++idCounter;}
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        this.id= ++idCounter;
    }
    public int getId() {return id;}
    public void setId(int id) {this.id = id;}
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public int getAge() {return age;}
    public void setAge(int age) {this.age = age;}
}

主类
public class Static1 {
    public static void main(String[] args) {
        Student one=new Student("zhangsan",20);
        one.room="320教室";
        System.out.println("姓名:"+one.getName()
                +",年龄:"+one.getAge()
                +",教室:" +one.room
                +",学号:"+one.getId());  //学号使用累加器自动生成
        Student two=new Student("lisi",25);
        System.out.println("姓名:"+two.getName()
                +",年龄:"+two.getAge()
                +",教室:" +two.room
                +",学号:"+two.getId());  //学号使用累加器自动生成
    }
}

6.3.静态static关键字修饰成员方法

static关键字修饰成员方法:

1.一旦static修饰成员方法,那么就变为静态方法。

2.静态方法不属于对象,而是属于类。

3.若没有static关键字,那么必须首先创建对象才能使用方法,

  但对于静态方法,可以通过对象进行调用,也可以直接通过类名调用

  推荐使用类名调用,可以明确知道是静态方法。

  obj.methodStatic();这种写法在编译之后会被javac翻译为"类名.静态方法"

4.无论是成员变量还是成员方法,如果有static,都推荐使用类名进行调用。

5.对于本类当中的静态方法,可以省略类名
 

6.注意事项:

1.静态只能访问静态,不能直接访问非静态成员方法可以访问静态

原因是:内存中是【先】有静态内容,【后】有非静态内容

2.静态方法中不能使用this.

原因:this代表当前对象,通过谁调用的方法,谁就是当前对象。

静态和对象没有关系,静态是属于类的。

public class MyClass {
    int num; //成员变量
    static int numStatic;//静态变量

    //成员方法
    public void method(){
        System.out.println("这是一个普通的成员方法");
        //成员方法可以访问成员变量
        System.out.println(num);
        //成员方法可以访问静态变量
        System.out.println(numStatic);
    }

    //静态方法
    public static void methodStatic(){
        System.out.println("这是一个静态方法");
        //静态方法可以放静态变量
        System.out.println(numStatic);
        /*静态方法不能直接访问非静态【重点】
        * System.out.println(num);
        * */
    }
}



public class Static2 {
    public static void main(String[] args) {
        //1.对于非静态方法,首先创建对象
        MyClass obj=new MyClass();
        //然后才能调用方法
        obj.method();
        //2.对于静态方法,可以使用对象调用,推荐使用类名调用,可以明确知道是静态方法。
        //不推荐。这种写法在编译之后会被javac翻译为"类名.静态方法"
        obj.methodStatic();
        //推荐使用
        MyClass.methodStatic();
        //3.对于本类当中的静态方法,可以省略类名
        method();
        Static2.method();//完全等效
    }
    public static void method(){
        System.out.println("自己的方法");
    }
}

6.4.静态static内存图

1.内存方法区中存放的是Student.class字节码文件,它有一个静态属性static String room,在方法区中还有一块静态区,存放静态成员,room数据就在静态区    中,当Student.room="101教室"时,就会在静态区给room赋值。


2.注意:Student.room="101教室"根据类名访问静态成员变量的时候,全程和对象没关系,只和类有关系。就算使用对象调用静态变量room,即one.room,编译时也会先翻译成Student.room,然后再去方法区中找到Student的静态room,然后在静态区找到room.

 

6.5.静态代码块

1.静态代码块:
1.静态代码块格式:
  public class 类名{
     static{
       //静态代码块内容
     }
  }


2.特点:
   1.第一次用到本类时(通常是使用该类创建对象),静态代码块执行唯一的一次
     即只有第一次创建对象时执行静态代码块。当第二次创建对象时静态就不会再执行了
     Person son=new Person();
     Person son1=new Person();
     静态代码块在Person类中,在Static_Person类中创建对象


   2.静态内容总是优先于非静态内容,所以静态代码块比构造方法先执行。

3.静态代码块典型用途:用来一次性地对静态成员变量进行赋值。

public class Person {
    static{
        System.out.println("静态代码块执行。");
    }
    public Person(){
        System.out.println("构造函数执行。");
    }
}


public class Static3_Person {
    public static void main(String[] args) {
        Person son=new Person();
        Person son1=new Person();
        /*输出:
        静态代码块执行。
        构造函数执行。
        构造函数执行。*/
    }
}
 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"class MyDialog41(wx.Dialog): def init(self, parent): wx.Dialog.init(self, parent, id=wx.ID_ANY, title=u"订单信息", pos=wx.DefaultPosition, size=wx.Size(600, 400), style=wx.DEFAULT_DIALOG_STYLE) self.Center() self.panel = wx.Panel(self) self.panel.SetBackgroundColour('white') wx.StaticText(self.panel, -1, "买家电话:", (20, 20)) self.t1 = wx.TextCtrl(self.panel, pos=(90, 20), size=(120, 25)) wx.StaticText(self.panel, -1, "客服人员编号", (20, 60)) wx.StaticText(self.panel, -1, "订单编号", (100, 60)) wx.StaticText(self.panel, -1, "订单金额", (180, 60)) wx.StaticText(self.panel, -1, "订餐方式", (260, 60)) wx.StaticText(self.panel, -1, "食物名称", (340, 60)) wx.StaticText(self.panel, -1, "地址", (420, 60)) wx.StaticText(self.panel, -1, "份数", (500, 60)) def OnClick(self, e): dialog41 = MyDialog41(None) btn = wx.Button(parent=dialog41.panel, label="查询", pos=(240, 20), size=(70, 25)) btn.Bind(wx.EVT_BUTTON, dialog41.find) dialog41.ShowModal() def find(self, event): conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='wm', charset='utf8') cursor = conn.cursor() try: sql = "select * from book" cursor.execute(sql) rs = cursor.fetchall() h = 80 for row in rs: if row[0] == self.t1.GetValue(): h = h + 20 server_id = row[1] order_id = row[2] order_money = row[3] order_way = row[4] name_way = row[5] local_way = row[6] count_way = row[7] wx.StaticText(self.panel, -1, server_id, (20, h)) wx.StaticText(self.panel, -1, order_id, (100, h)) wx.StaticText(self.panel, -1, order_money, (180, h)) wx.StaticText(self.panel, -1, order_way, (260, h)) wx.StaticText(self.panel, -1, name_way, (340, h)) wx.StaticText(self.panel, -1, local_way, (420, h)) wx.StaticText(self.panel, -1, count_way, (500, h)) except: conn.rollback() finally: cursor.close() conn.close()"逐行解释代码
最新发布
06-07
这段代码是一个基于wxPython的GUI程序,用于查询订单信息。以下是逐行解释: 1. `class MyDialog41(wx.Dialog):`:定义一个名为MyDialog41的wx.Dialog类。 2. `def __init__(self, parent):`:定义MyDialog41类的构造函数,其中parent是父窗口。 3. `wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title=u"订单信息", pos=wx.DefaultPosition, size=wx.Size(600, 400), style=wx.DEFAULT_DIALOG_STYLE)`:调用wx.Dialog的构造函数,设置窗口的一些参数。 4. `self.Center()`:将窗口居中显示。 5. `self.panel = wx.Panel(self)`:创建一个wx.Panel对象作为窗口的子窗口。 6. `self.panel.SetBackgroundColour('white')`:设置子窗口的背景颜色为白色。 7. `wx.StaticText(self.panel, -1, "买家电话:", (20, 20))`:在子窗口上创建一个静态文本控件,显示文本“买家电话:”,并设置位置为(20, 20)。 8. `self.t1 = wx.TextCtrl(self.panel, pos=(90, 20), size=(120, 25))`:在子窗口上创建一个文本框控件,用于输入买家电话号码,设置位置为(90, 20),大小为(120, 25),并将其赋值给实例变量t1。 9. `wx.StaticText(self.panel, -1, "客服人员编号", (20, 60))`:在子窗口上创建一个静态文本控件,显示文本“客服人员编号”,并设置位置为(20, 60)。 10. `wx.StaticText(self.panel, -1, "订单编号", (100, 60))`:在子窗口上创建一个静态文本控件,显示文本“订单编号”,并设置位置为(100, 60)。 11. `wx.StaticText(self.panel, -1, "订单金额", (180, 60))`:在子窗口上创建一个静态文本控件,显示文本“订单金额”,并设置位置为(180, 60)。 12. `wx.StaticText(self.panel, -1, "订餐方式", (260, 60))`:在子窗口上创建一个静态文本控件,显示文本“订餐方式”,并设置位置为(260, 60)。 13. `wx.StaticText(self.panel, -1, "食物名称", (340, 60))`:在子窗口上创建一个静态文本控件,显示文本“食物名称”,并设置位置为(340, 60)。 14. `wx.StaticText(self.panel, -1, "地址", (420, 60))`:在子窗口上创建一个静态文本控件,显示文本“地址”,并设置位置为(420, 60)。 15. `wx.StaticText(self.panel, -1, "份数", (500, 60))`:在子窗口上创建一个静态文本控件,显示文本“份数”,并设置位置为(500, 60)。 16. `def OnClick(self, e):`:定义一个名为OnClick的方法,用于处理查询按钮的点击事件。 17. `dialog41 = MyDialog41(None)`:创建一个MyDialog41对象,并将父窗口设置为None。 18. `btn = wx.Button(parent=dialog41.panel, label="查询", pos=(240, 20), size=(70, 25))`:在MyDialog41的子窗口上创建一个按钮控件,显示文本“查询”,并设置位置为(240, 20),大小为(70, 25),并将其赋值给变量btn。 19. `btn.Bind(wx.EVT_BUTTON, dialog41.find)`:将按钮的点击事件绑定到MyDialog41对象的find方法上。 20. `dialog41.ShowModal()`:显示MyDialog41对象的模态对话框。 21. `def find(self, event):`:定义一个名为find的方法,用于查询并显示订单信息。 22. `conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='wm', charset='utf8')`:连接MySQL数据库,其中host、port、user、passwd、db、charset分别表示主机名、端口号、用户名、密码、数据库名、字符集。 23. `cursor = conn.cursor()`:创建游标对象。 24. `try:`:开始try语句块。 25. `sql = "select * from book"`:定义SQL语句,查询book表中的所有记录。 26. `cursor.execute(sql)`:执行SQL语句。 27. `rs = cursor.fetchall()`:获取查询结果集。 28. `h = 80`:定义变量h,用于设置每个订单信息的显示位置。 29. `for row in rs:`:遍历查询结果集。 30. `if row[0] == self.t1.GetValue():`:判断买家电话号码是否与输入的电话号码一致。 31. `h = h + 20`:如果一致,将变量h的值加上20。 32. `server_id = row[1]`:获取订单的客服人员编号。 33. `order_id = row[2]`:获取订单编号。 34. `order_money = row[3]`:获取订单金额。 35. `order_way = row[4]`:获取订餐方式。 36. `name_way = row[5]`:获取食物名称。 37. `local_way = row[6]`:获取地址。 38. `count_way = row[7]`:获取份数。 39. `wx.StaticText(self.panel, -1, server_id, (20, h))`:在子窗口上创建一个静态文本控件,显示订单的客服人员编号,位置为(20, h)。 40. `wx.StaticText(self.panel, -1, order_id, (100, h))`:在子窗口上创建一个静态文本控件,显示订单编号,位置为(100, h)。 41. `wx.StaticText(self.panel, -1, order_money, (180, h))`:在子窗口上创建一个静态文本控件,显示订单金额,位置为(180, h)。 42. `wx.StaticText(self.panel, -1, order_way, (260, h))`:在子窗口上创建一个静态文本控件,显示订餐方式,位置为(260, h)。 43. `wx.StaticText(self.panel, -1, name_way, (340, h))`:在子窗口上创建一个静态文本控件,显示食物名称,位置为(340, h)。 44. `wx.StaticText(self.panel, -1, local_way, (420, h))`:在子窗口上创建一个静态文本控件,显示地址,位置为(420, h)。 45. `wx.StaticText(self.panel, -1, count_way, (500, h))`:在子窗口上创建一个静态文本控件,显示份数,位置为(500, h)。 46. `except:`:如果try语句块中出现异常,执行except语句块。 47. `conn.rollback()`:回滚事务。 48. `finally:`:无论try语句块是否执行成功,都会执行finally语句块。 49. `cursor.close()`:关闭游标对象。 50. `conn.close()`:关闭数据库连接。 以上是这段代码的逐行解释。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值