java-面向对象一(类与对象的使用,随机数生成)

设计类与创建对象

  • 面向对象与面向过程
    • 面向过程
    • 面向对象
      • 两要素
  • 三条主线
    • java类及其类的成员
    • 面向对象的三大特征
    • 其他关键字
  • 设计类
    • 类的成员一(属性)
    • 类的成员二(方法)
  • 类与对象的使用
  • 例题
    • 第一题.创建一个 Per类,属性:姓名,性别,年龄,通过输入年龄初始化值。输出该对象的信息(姓名 性别 年龄) 方法一:将所有代码写在一个程序内:
    • 第二题:设计圆类 求面积,半径从键盘输入
    • 第三题:定义类Student, 包含三个属性:学号number(int),年级state(int),成绩score(int)。创建20个学生对象, 学号为1到20,年级和成绩都由随机数确问题一:打印出3年级(state值为3)的学生信息。问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息。

面向对象与面向过程

可以看做是:(以人为例子的话)
类=抽象概念的人,对象=实实在在的人

下面用装大象举例说明:

面向过程

强调的是功能行为,以函数为最小单位,考虑怎么做
比如:装大象这一事件
①把冰箱门打开
②抬起大象,塞进冰箱
②把冰箱门关闭

面向对象

将功能封装进对象,强调了具备功能的对象,以类/对象为最小单位,考虑谁来做。
比如:装大象这一事件

人{
打开(冰箱){
冰箱.开开();
}
抬起(大象){
大象.进入(冰箱);
}
关闭(冰箱){
冰箱.闭合();
}
}

冰箱{
开开(){ }
闭合(){}
}
大象{
进入(冰箱){
}
}

我们在创建类的对象对象时:创建累的对象=类的实例化=实例化类

两要素

类:对一类事物的描述,是抽象的、概念上的定义。
对象:是实际存在的该类事物的每个个体,因而也称为实例。
1.面向对象程序设计的重点是设计
2.设计类,就是设计类的成员

三条主线

java类及其类的成员

属性、方法、构造器、代码块、内部类

面向对象的三大特征

封装性、
继承性、
多态性、
(还有一个的话:抽象性)

其他关键字

this
super
static
final
abstract
interface
package
import

设计类

设计类便是设计类的成员

类的成员一(属性)

属性里面含有 成员变量与局部变量
其中,
他们的相同点是:
1.1定义变量的格式:数据类型 变量名=变量值
1.2先声明,后使用
1.3变量都有其对应的作用域
不同点是:
2.1在类中声明的位置的不同
属性:直接定义在类的一-对{ }内
局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量

2.2关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修饰符。
常用的权限修饰符: private、 public、缺省、protected — >封装性
目前,大家声明属性时,都使用缺省就可以了。
局部变量:不可以使用权限修饰符。

2.3默认初始化值的情况:
属性:类的属性,根据其类型,都有默认初始化值。
整型(byte、short、int、long) :0
浮点型(float、double) : 0.0
字符型(char) : 0 (或’ \u0000 ')
布尔型(boolean) : false
引用数据类型(类、数组、接口) : null
局部变量:没有默认初始化值。
意味着,我们在调用局部变量之前,-定要显式赋值。
特别地:形参在调用时,我们赋值即可。

2.4 在内存中加载的位置:
属性:加载到堆空间中(非static)
局部变量:加载到栈空间

类的成员二(方法)

方法是:描述类具有的功能

比如: Math类: sqrt()\random() …
Scanner类: nextXxx( )
Arrays类: sort() \ binarySearch() \ toString() \ equals()
1.方法的类型可以看做 是否有形参以及返回值

无返回值 有返回值
无形参 void 方法名(){} 返回值的类型 方法名(){}
有形参 void 方法名(形参列表){} 返回值的类型 方法名(形参列表){}

2.方法的声明:权限修饰符 返回值类型 方法名(形参列表){
方法体
}
3.说明:
3.1关于权限修饰符:默认方法的权限修饰符先都使用public
Java规定的4种权限修饰符: private、public、缺省、protected

3.2返回值类型:有返回值Vs没有返回值

3.2.1如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量: "return 数据”。
如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就使用return.但是,如果使用的话,只能return;"表示结束此方法的意思。
3.2.2我们定义方法该不该有返回值?
①题目要求
②凭经验:具体问题具体分析

3.3方法名:属于标识符,遵循标识符的规则和规范,“见名知意”

3.4形参列表:方法可以声明0个,1个,或多个形参。
3.4.1格式:数据类型1 形参1 ,数据类型2 形参2,… .
3.4.2我们定义方法时,该不该定义形参?
①题目要求
②凭经验:具体问题具体分析

3.5方法体:方法功能的体现。

4.return关键字的使用:
1.使用范围:使用在方法体中
2.作用:①结束方法
②针对于有返回值类型的方法,使用"return数据"方法返回所要的数据。
3.注意点: return关键字后面不可以声明执行语句。
方法的使用
5.方法的使用中,可以调用当前类的属性或方法

特殊的:方法A中又调用了方法A:递归方法。

方法中,不可以定义方法。
在这里插入图片描述

类与对象的使用

有以下三个步骤:
1.创建类:设计类的成员
2.创建类的对象
3.通过“对象.属性”或“对象.方法”调用对象的结构

在创建了类的对象时,存在对象内存的相关知识
对象的内存解析
堆(Heap):存放对象实例
栈(Stack):存储局部变量
方法区(Method Area):存储已经被虚拟机加载的类信息、常量、静态变量、即使便器编译后的代码等数据
当一个类有多个对象时:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200410103703969.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjU1ODEzNw==,size_16,color_FFFFFF,t_70

例题

第一题.创建一个 Per类,属性:姓名,性别,年龄,通过输入年龄初始化值。输出该对象的信息(姓名 性别 年龄) 方法一:将所有代码写在一个程序内:

package xiang;
import java.util.Scanner;//导入Scanner类
public class Person{
public static void main(String[] args) {
	// 键盘输入
	Scanner reader=new Scanner(System.in);//Scanner类创建对象	
	 String N="sanma";
	 String S="男";
	 int A=reader.nextInt();
		//创建Per 类对象
	Per person=new Per(N,S,A);	
	//调用属性
	person.name=N;
	person.sex=S;
	person.age=A;
	//调用方法
	person.Name();
	person.Sex();
	person.Age();	
	}
}


//创建Per这个类
  class Per{

	//设计类成员-属性
	String name;
	String sex;
	int age;
	//设计类成员-方法
	public void Name(){//获取姓名
		System.out.print("姓名是:");
		System.out.println(name);
	}
	public void Sex(){//获取性别
		System.out.print("性别是:");
		System.out.println(sex);
	}
	public int Age(){//获取年龄
		System.out.println("年龄是:"+age);
		return age;
	}
	
	//含参数构造器 初始化属性值
	Per(String n,String s,int a){
		name=n;
		sex=s;
		age=a;
	}
}

输出结果是:
java-面向对象一(类与对象的使用,随机数生成)_第1张图片
方法二,另外写一个测试该类的程序:
创建类:

package xiang;
//创建Per这个类
  class Per{

	//设计类成员-属性
	String name;
	String sex;
	int age;
	//设计类成员-方法
	public void Name(){//获取姓名
		System.out.print("姓名是:");
		System.out.println(name);
	}
	public void Sex(){//获取性别
		System.out.print("性别是:");
		System.out.println(sex);
	}
	public int Age(){//获取年龄
		System.out.println("年龄是:"+age);
		return age;
	}
	
	//含参数构造器 初始化属性值
	Per(String n,String s,int a){
		name=n;
		sex=s;
		age=a;
	}
}

测试类:

package xiang;
import java.util.Scanner;//导入Scanner类
public class persontest {

	public static void main(String[] args) {	
		// 键盘输入
		Scanner reader=new Scanner(System.in);//Scanner类创建对象	
		 String N="sanma";
		 String S="男";
		 int A=reader.nextInt();
			//创建Person 类对象
		Per person=new Per(N,S,A);	
		//调用属性
		person.name=N;
		person.sex=S;
		person.age=A;
		//调用方法
		person.Name();
		person.Sex();
		person.Age();
	}

}

第二题:设计圆类 求面积,半径从键盘输入

package xiang;
//设计类 求圆的面积,用输入半径的值求
import java.util.Scanner;
public class circle {

	public static void main(String[] args) {
		//创cir对象
		cir c=new cir();
		
		System.out.println("请输入半径:");
		//创建Scanner对象
		Scanner scanner=new Scanner(System.in); 
		//接收数据
		double R=scanner.nextDouble();
		//调用redius属性
		
		c.radius=R;//我之前的写法是:R=c.radius;是错误的写法 应该是将右边的值赋给左边
					//之前那样的话 输入的R值没有成功赋给radius
		//调用area方法
		double S=c.area();
	System.out.println("圆的面积为:"+S);
		
	}

}
//创建cir类
class cir{
	double radius;//设计类的属性
	
	//设计类的方法:求圆的面积
	public double area() {//注意返回值的类型 是double
		double s;
		s=radius*radius*3.14;
		//System.out.println("圆的面积为:"+s);
		return s;
	}	
}

运行结果:java-面向对象一(类与对象的使用,随机数生成)_第2张图片
关于赋值那一块,感觉自己掌握的不好:
最初写完代码运行时:
java-面向对象一(类与对象的使用,随机数生成)_第3张图片
错误:radius没赋值上:我写的代码是:R=c.radius;
改正之后:c.radius=R;
应该是将右边的值赋给左边

测试
//方式一:
int area = test. method( ) ;
System. out. println(“面积为:”+ area);
//方式二:
System. out print1n(test. method()) ;

第三题:定义类Student, 包含三个属性:学号number(int),年级state(int),成绩score(int)。创建20个学生对象, 学号为1到20,年级和成绩都由随机数确问题一:打印出3年级(state值为3)的学生信息。问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息。

提示:
1)生成随机数: Math.random(), 返回值类型double;
2)四舍五入取整: Math.round(double d),返回值类型long。

package xiang;
//第三题:定义类Student, 包含三个属性:学号number(int),年级state(int),成绩score(int)。
//创建20个学生对象, 学号为1到20,年级和成绩都由随机数确定,
//问题一:打印出3年级(state值为3)的学生信息。
//问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息。
//提示:
//1)生成随机数: Math.random(), 返回值类型double;
//2)四舍五入取整: Math.round(double d),返回值类型long。
public class Studenttest {
	public static void main(String[] args) {
//		创建20个对象
		Student[] s=new Student[20];//声明20个Student类型的数组!!!
		
		System.out.println("年级为3的学生有:");
		for(int i=0;i<s.length;i++)
		{
			s[i]=new Student();//创建对象!
			s[i].number=i+1;
			//设有1-9个年级
    		s[i].state=(int)(Math.random()*(9-1+1)+1);//生成随机年级
			//设分数 是0-150分
			s[i].score=(int)(Math.random()*(150-0+1));//生成随机分数
		//	s[i].show();//调用show方法,遍历学生信息	
		
			if(s[i].state==3)//当年级为3的时候 输出学生信息
			{
				s[i].show();
			}	
		}	
		
		System.out.println("学生成绩从小到大排列为:");
//		冒泡排序学生成绩 并遍历所有学生信息
		for(int i=0;i<s.length-1;i++)
		{
			for(int j=0;j<s.length-1-i;j++)
			{
				
				if(s[j].score>s[j+1].score)
				{
					Student temp;
					temp=s[j];
					s[j]=s[j+1];
					s[j+1]=temp;
				}
			}
		}
		//遍历学生信息
		for(int i=0;i<s.length;i++)
		{
			s[i].show();
		}
	}
}
//定义类Student
class Student{
	//设计属性
	int number;//学号
	int state;//年级
	int score;//成绩
	//设计方法
	public void show() {//显示信息
		System.out.println("学生的学号是:"+number+", "+"年级是:"+state+", "+"成绩是:"+score);		
	}	
}

输出的结果为:
java-面向对象一(类与对象的使用,随机数生成)_第4张图片
写这个程序 遇到下面几个错误:
1.创建20个学生对象时,语法错误java-面向对象一(类与对象的使用,随机数生成)_第5张图片
正确的写法:
在这里插入图片描述先声明20个数组对象,在使用。
2.取随机数时,公式错误java-面向对象一(类与对象的使用,随机数生成)_第6张图片
改为:
s[i].score=(int)(Math.random()*(150-0+1));
3.冒泡排序时,错误,将他们的分数交换
java-面向对象一(类与对象的使用,随机数生成)_第7张图片
java-面向对象一(类与对象的使用,随机数生成)_第8张图片
改为:应该是交换学生这个人
java-面向对象一(类与对象的使用,随机数生成)_第9张图片

你可能感兴趣的:(java-面向对象一(类与对象的使用,随机数生成))