构造方法-静态与非静态-随机函数
构造方法
-
构造方法不能用对象调用
class Person { public Person(){ } } 注意:如果我们没有给出构造方法,系统将自动提供一个无参构造方法, 如果我们给出了构造方法,系统将不再提供默认的无参构造方法, 这个时候,如果我们还想使用无参构造方法,就必须自己给出。 建议,永远自己给出无参构造方法!!! /************************************************************/ class Demo { public static void main(String[] args) { Person p1 = new Person(); p1.show(); System.out.println("-----------------"); Person p2 = new Person("张三",23); p2.show(); } } class Person { private String name; private int age; public Person() { System.out.println("空参的构造"); } public Person(String name, int age) { this.name = name; this.age = age; System.out.println("有参的构造"); } public void show() { System.out.println(name + "------" + age); } }
完整的学生类案例
class Demo {
public static void main(String[] args) {
Student s1 = new Student (); // 使用空参构造
s1.setName("张三"); //设置姓名
s1.setAge(23); //设置年龄
System.out.println("我的姓名是:" + s1.getName() + ",我的年龄是:" + s1.getAge());
//getxxx()获取属性值,可以打印,也可以赋值给其他变量,做其他操作
Student s2 = new student("李四",24); //使用有参构造
s2.show(); //只是为了显示属性值
}
}
class Student {
private String name;
private int age;
public Student() {} //无参构造
public Student(String name,int age) { //有参构造
this.name = name;
this.age = age;
}
public void setName(String name) { //设置姓名
this.name = name;
}
public String getName() { // 获取姓名
return name;
}
public void setAge(int age) { //设置年龄
this.age = age;
}
public int getAge() { //获取年龄
return age;
}
public void show() {
System.out.println("我的姓名是:" + name + ",我的年龄是:" + age);
}
}
一个问题
class Demo {
public static void main(String[] args) {
Student s = new student ();
s.show();
}
}
class Student {
private String name = "张三";
private int age = 23;
public Student() {
name = "李四";
age = 24;
}
public void show() {
System.out.println(name + "-----------" + age);
}
}
//测试的结果是:李四--------------24
为何不是:张三--------------23 ?
答:相当于构造方法的赋值覆盖了原有的赋值
Student s = new Student();
1、Student.class加载进内存
2、栈中声明一个Student类型引用s
3、在堆内存创建对象
4、给对象中属性默认初始化值
5、属性进行显示初始化
6、构造方法进栈,对对象中的属性赋值,构造方法弹栈
7、将对象的地址值赋值给s
Static关键字的特点(掌握)
-
特点:
- 随着类的加载而加载
- 优先于对象存在
- 被类的所有对象共享
-
应用:共有属性用静态,非共有属性用非静态
-
调用:可以用对象名.调用。也可以用类名.调用(推荐使用类名.调用)
class Demo { int num1 = 10; //非静态的成员变量 static int num2 = 20; //静态的成员变量 public void print1() { //非静态的成员方法,既可以访问静态的成员也可以访问非静态的 System.out.println(num1); System.out.println(num2); } public static void print2() { //静态的成员方法 //System.out.println(num1); 静态的成员方法不能访问非静态 System.out.println(num2); } }
-
static的注意事项
- 在静态方法中没有this关键字:
- 静态是随着类的加载而加载,this是随着对象的创建而存在。
- 静态比对象先存在。
- 静态方法只能访问静态的成员变量和静态的成员方法(简记:静态只能访问静态)
- 在静态方法中没有this关键字:
-
非静态方法在调用的时候必须创建对象调用
工具类中使用静态
- 如果一个类中所有方法都是静态的,需要再多做一步,私有构造方法,目的是不让其他类创建对象
- 直接类名.调用即可
随机函数
-
System.out.println((int)(Math.random()*100)+1) //可以输出1-100的随机数