面向对象知识2
1.构造方法概述
- 构造方法概述和作用
创建对象,给对象中的成员进行初始化 - 构造方法格式特点
- 方法名与类名相同
- 没有返回值类型,连void都没有
- 没有具体的返回值
2.构造方法的重载问题
- 构造方法注意事项
- 如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
- 如果我们给出了有参数构造方法,系统将不再提供默认的无参构造方法。
注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法
- 给成员变量赋值的两种方式
- setXxx()与getXxx()方法
- 构造方法
3.一个老师的类以及对象
- 类
public class Teacher {
private String name;
private int age;
public Teacher() {
System.out.println("空参构造");
}//构建空参构造
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}//构建有参构造
//为无参构造提供get set 方法
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;
}
- 对象(采用有参和无参两种方式调用成员变量)
ublic class MyTest {
public static void main(String[] args) {
//采用空参构造来创建对象
Teacher t = new Teacher();
t.setName("沈");
t.setAge(18);
System.out.println(t.getName());
System.out.println(t.getAge());
//采用有参构造来创建对象
Teacher teacher1 = new Teacher("老沈", 20);
System.out.println(teacher1.getName());
System.out.println(teacher1.getAge());
}
}
4.一个标准手机的类以及对象
- 类
public class Phone {
private String name;
private int price;
public Phone() {
System.out.println("空参");
}//构造空参
public Phone(String name, int price) {
this.name = name;
this.price = price;
}//构造有参
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setP(int price) {
this.price = price;
}
}
- 对象
public class MyTest {
public static void main(String[] args) {
//采用空参构造来创建对象
Phone p = new Phone();
p.setName("华为");
p.setP(5000);
System.out.println(p.getName());
System.out.println(p.getPrice());
//采用含参构造来创建对象
Phone teacher1 = new Phone("苹果", 5000);
System.out.println(teacher1.getName());
System.out.println(teacher1.getPrice());
}
}
5.创建一个对象的步骤
- 加载.class文件进内存
- 在栈内存为s开辟空间
- 在堆内存为学生对象开辟空间
- 对学生对象的成员变量进行默认初始化
- 对学生对象的成员变量进行显示初始化
- 通过构造方法对学生对象的成员变量赋值
- 学生对象初始化完毕,把对象地址赋值给s变量
6.长方形类与对象练习
package westos3.demo4;
public class Rectangle {
//定义成员属性
private double width;
private double height;
public Rectangle() {
}
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
public double getWidth() {
return width;
}
public void setWidth(double width) {
this.width = width;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
//方法
//定义获取周长的方法
public double getPerimeter() {
return (this.width + this.height) * 2;
}
//定义获取面积的方法
public double getArea() {
return width * height;
}
}
public class Mytest {
public static void main(String[] args) {
Rectangle rectangle=new Rectangle();
rectangle.setLength(5,8);
System.out.println(rectangle.getLength());
rectangle.setArea(5,8);
System.out.println(rectangle.getArea());
}
}
7.static关键字
-
static关键字的特点
- 随着类的加载而加载
- 优先于对象存在
- 被类的所有对象共享
- 可以通过类名调用(本身也可以通过对象名调用)推荐使用类名调用。
-
static的注意事项
- 在静态方法中是没有this关键字的
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在,所以静态中不可能有后来才出现的对象的this关键字。 - 静态方法只能访问静态的成员变量和静态的成员方法
静态只能访问静态,非静态可以访问静态的也可以访问非静态的
- 在静态方法中是没有this关键字的
-
举例说明
public class St {
public double num = 20;
public static int a = 120;
//非静态方法,既可以访问非静态的,也可以访问静态的。
public void show() {
System.out.println(num);
System.out.println(a);
}
public void show1() {
System.out.println(num);
System.out.println(a);
this.show();
this.test();
St.test();
}
//静态方法中,只能访问到静态成员,访问不到非静态成员。
//被静态所修饰的成员,是随着类的加载而加载,是优先于对象而存在。
//静态的只能访问静态的。
public static void test() {
// System.out.println(num);(访问不到)
System.out.println(a);
}
//静态的只能访问静态的。
public static void test1() {
//静态方法里面不能存在this关键字,this代表一个对象,是后来才有的,静态方法里面访问不到
System.out.println(a);
}
}
8.静态变量和成员变量的区别
- 所属不同
- 静态变量属于类,所以也称为类变量
- 成员变量属于对象,所以也称为实例变量(对象变量)
- 内存中位置不同
- 静态变量存储于方法区的静态区
- 成员变量存储于堆内存
- 内存出现时间不同
- 静态变量随着类的加载而加载,随着类的消失而消失
- 成员变量随着对象的创建而存在,随着对象的消失而消失
- 调用不同
- 静态变量可以通过类名调用,也可以通过对象调用,推荐使用类名调用
- 成员变量只能通过对象名调用
9.如何使用JDK提供的帮助文档
- 找到文档,打开文档
- 点击显示,找到索引,出现输入框
- 你应该知道你找谁?举例:Scanner
- 看这个类的结构(需不需要导包)
- java.lang包下的内容不需要我们手动导入其它包下的内容需要我们手动导入
类 API文档
成员变量 字段摘要
构造方法 构造方法摘要
成员方法 方法摘要
- java.lang包下的内容不需要我们手动导入其它包下的内容需要我们手动导入
- 看这个类的说明(简单的了解一下)
- 看开始版本
- 看构造方法
- 看成员方法
- 是否是static的,如果是我们就不需要创建对象,直接可以使用类名调用该方法;看返回值,返回值是什么我就使用什么接收
- 看参数列表: 参数的个数 , 参数的类型 ; 要什么参数我是用的时候,就传递什么参数
10.Math类的随机数功能
- Math类概述
- 类包含用于执行基本数学运算的方法
- Math类特点
- 由于Math类在java.lang包下,所以不需要导包。
- 没有构造方法,因为它的成员全部是静态的。
- 获取随机数的方法
- public static double random():返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
11.猜数字小游戏案例
- 输出一个随机数,用户共有5次机会去猜出数字
import java.util.Scanner;
public class GuessNumber {
public static void main(String[] args) {
int num = (int) (Math.random() * 100 + 1);//math随机数输出的是0-1之间的小数,所以需要强制类型转换
Scanner sc = new Scanner(System.in);
for(int i=4;i>=0;i--)//用for循环定义5次机会 {
System.out.println("请输入一个整数 1---100");
int userNum = sc.nextInt();
if (userNum > num) {
System.out.println("猜大了");
System.out.println("还剩"+i+"次机会");//提示还剩几次机会
} else if (userNum < num) {
System.out.println("猜小了");
System.out.println("还剩"+i+"次机会");
} else {
System.out.println("恭喜你猜对了");
}
}
}
}