一.构造方法
1.概述
创建对象时,给对象中的成员进行初始化
2.特点
方法名与类名相同
没有返回值类型,连void也没有
没有具体的返回值
3.注意事项
如果没有给出构造方法,系统将提供一个无参数的构造方法
如果写出了有参数的构造方法,系统将不再提供无参数的构造方法
4.赋值方式
在写出了全参数和无参数的构造方法后(即构造方法的重载),给成员变量赋值的两种方式
如果这个时候我们给出了有参数构造方法,系统将不再提供默认的无参构造方法。
这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
1)setXxx()方法
2)构造方法
案例:
package org.westos.demo;
public class MyTest2 {
public static void main(String[] args) {
Person person=new Person();
//通过get,set方法来设置值
person.setName("李四");
person.setAge(18);
System.out.println(person.getAge());//18
System.out.println(person.getName());//李四
person.show();//李四 18
System.out.println("=========================");
//通过构造方法来设置值
Person person2=new Person("王五",88);
System.out.println(person2.getAge());//88
System.out.println(person2.getName());//王五
person2.show();//王五 88
}
}
class Person{
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
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 void show(){
System.out.println(name);
System.out.println(age);
}
}
案例一:
定义一个长方形(Rectangle)类,定义求周长(length)和面积(area)的方法,
然后定义一个测试类Test,进行测试。
package org.westos.demo;
import java.util.Scanner;
//定义一个长方形(Rectangle)类,定义求周长(length)和面积(area)的方法,
// 然后定义一个测试类Test,进行测试。
public class MyTest {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入宽");
int i = sc.nextInt();
System.out.println("请输入高");
int j = sc.nextInt();
Rectangle r=new Rectangle();
System.out.println(r.getLength(i,j));
System.out.println(r.getArea(i,j));
}
}
class Rectangle{
public int getLength(int width,int hight){
return (width+hight)*2;
}
public int getArea(int width,int hight){
return width*hight;
}
}
案例二:
定义一个员工(Employee)类,自己分析出几个成员,然后给出成员变量,构造方法,getXxx()/setXxx()方法,以及一个显示所有成员信息的方法。并测试。
错误示例:
这里错在成员变量与局部变量重名,get和set方法打印完之后就弹栈了,所以set方法并没有改变值
package org.westos.demo;
//定义一个员工(Employee)类,自己分析出几个成员,然后给出成员变量,构造方法,getXxx()/setXxx()方法,
// 以及一个显示所有成员信息的方法。并测试。
public class MyTest2 {
public static void main(String[] args) {
Emploee e=new Emploee("张三",29);
e.getId();//29
e.getName();//张三
e.show();//张三 29
System.out.println("==========================");
e.setId(2);
e.setName("李四");
e.getId();//29
e.getName();//张三
e.show();//张三 29
}
}
class Emploee{
String name;
int id;
public Emploee(){
}
public Emploee(String name,int id){
this.name=name;
this.id=id;
}
public void getName(){
System.out.println(name);
}
public String setName(String name){
return name;
}
public void getId(){
System.out.println(id);
}
public int setId(int id){
return id;
}
public void show(){
System.out.println(name);
System.out.println(id);
}
}
正确示例:
package org.westos.demo;
public class MyTest3 {
public static void main(String[] args) {
//定义一个员工(Employee)类,自己分析出几个成员,然后给出成员变量,构造方法,getXxx()/setXxx()方法,
// 以及一个显示所有成员信息的方法。并测试。
Employee e=new Employee("张三",29);
e.getId();//29
e.getName();//张三
e.show();//张三 29
System.out.println("==========================");
e.setId(2);
e.setName("李四");
e.getId();//2
e.getName();//李四
e.show();//李四 2
}
}
class Employee{
String name;
int id;
public Employee(){
}
public Employee(String name,int id){
this.name=name;
this.id=id;
}
public void getId(){
System.out.println(id);
}
public void setId(int id){
this.id=id;
}
public void getName(){
System.out.println(name);
}
public void setName(String name){
this.name=name;
}
public void show(){
System.out.println(name);
System.out.println(id);
}
}
二.static关键字
1.概述:
1. static:静态的,可以修饰成员变量也可以修饰成员方法
2. static修饰成员变量,此变量就作为一个共享变量,位于方法区中,会被该类的所有对象共享
案例:
package org.westos.demo;
public class MyTest4 {
public static void main(String[] args) {
Person p1=new Person();
p1.name="张三";
p1.age=28;
Person p2=new Person();
p2.name="李四";
p2.age=38;
Person p3=new Person();
p3.name="王五";
p3.age=48;
System.out.println(p1.name);//张三
System.out.println(p1.age);//48
System.out.println("===========");
System.out.println(p2.name);//李四
System.out.println(p2.age);//48
System.out.println("============");
System.out.println(p3.name);//王五
System.out.println(p3.age);//48
}
}
class Person {
public String name;
//1. static:静态的,可以修饰成员变量也可以修饰成员方法
//2. static修饰成员变量,此变量就作为一个共享变量,位于方法区中,会被该类的所有对象共享
public static int age=18;
}
2.带static对象的内存图
3. static关键字的特点
(1)随着类的加载而加载
(2)优先于对象存在
(3)被类的所有对象共享
(4)一般推荐通过类名调用(类名.成员变量名),无需new对象来调用
(5)静态修饰的内容一般称为:类成员
public class MyTest5 {
public static void main(String[] args) {
System.out.println(Student.age);//0
}
}
class Student{
public String name;
public static int age;
}
4.注意事项:
a:在静态方法中是没有this关键字的
如何理解呢?
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。
b:静态方法只能访问静态的成员变量和静态的成员方法
简单记:静态只能访问静态,非静态可以访问静态的也可以访问非静态的
案例:
package org.westos.demo;
public class MyTest6 {
public String name;
public static int age=18;
public void show(){
//非静态方法中可以访问静态变量和静态方法
System.out.println(name);
System.out.println(age);
}
//静态方法无法访问非静态变量
public static void show2(){
//System.out.println(name);//错误,静态方法无法访问非静态变量
System.out.println(age);
}
//非静态方法中可以访问静态方法和非静态方法
public void show3(){
show();
show2();
}
//静态方法中只能访问静态方法
public static void show4(){
// show();报错
show2();
//show3();报错
show4();
}
}
5.静态变量和成员变量的区别
1.内存中位置不同:
成员变量在堆内存,静态变量在方法区的静态区,局部变量在栈内存
2.所属不同:
成员变量属于对象,随着对象的加载而加载,随着对象的消失而消失
静态变量属于类,也被称为类对象,随着类的加载而加载,随着类的消失而消失
局部变量属于方法,随着方法的加载而加载,随着方法的消失而消失
3.调用不同:
静态变量可以通过类名调用,也可以通过对象调用,推荐使用类名调用
成员变量只能通过对象名调用
三.Math类
1:Math类概述
类包含用于执行基本数学运算的方法
2:Math类特点
由于Math类在java.lang包下,所以不需要导包。
可以直接通过类名来调用方法
没有构造方法,因为它的成员全部是静态的。
3:获取随机数的方法
public static double random():返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
Math.random:是一个(0,1)之间的数
4:我要获取一个1-100之间的随机数
int number = (int)(Math.random()*100)+1;
猜数字案例一:
package org.westos.demo;
import java.util.Scanner;
public class MyTest7 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入你猜的数字");
int num = sc.nextInt();
double random = Math.random();
System.out.println(random);//是一个(0,1)之间的小数
int n=(int)random*100+1;
while (true){
if (num>n){
System.out.println("猜大了");
break;
}else if (num<n){
System.out.println("猜小了");
break;
}else{
System.out.println("猜对了");
break;
}
}
}
}
改进:要求最多猜五次,每次打印出剩余次数
package org.westos.demo;
import java.util.Scanner;
public class MyTest8 {
public static void main(String[] args) {
int n=(int)(Math.random()*100+1);
int count=5;
while (true){
Scanner sc = new Scanner(System.in);
System.out.println("请输入你猜的数");
int num = sc.nextInt();
if (num>n){
System.out.println("猜大了");
count--;
}else if (num<n){
System.out.println("猜小了");
count--;
}else{
System.out.println("猜对了");
break;
}
if (count>0) {
System.out.println("还有" + count + "机会");
}else {
System.out.println("没有机会了");
}
}
}
}