可以看做是:(以人为例子的话)
类=抽象概念的人,对象=实实在在的人
下面用装大象举例说明:
强调的是功能行为,以函数为最小单位,考虑怎么做
比如:装大象这一事件
①把冰箱门打开
②抬起大象,塞进冰箱
②把冰箱门关闭
将功能封装进对象,强调了具备功能的对象,以类/对象为最小单位,考虑谁来做。
比如:装大象这一事件
人{
打开(冰箱){
冰箱.开开();
}
抬起(大象){
大象.进入(冰箱);
}
关闭(冰箱){
冰箱.闭合();
}
}
冰箱{
开开(){ }
闭合(){}
}
大象{
进入(冰箱){
}
}
我们在创建类的对象对象时:创建累的对象=类的实例化=实例化类
类:对一类事物的描述,是抽象的、概念上的定义。
对象:是实际存在的该类事物的每个个体,因而也称为实例。
1.面向对象程序设计的重点是设计
2.设计类,就是设计类的成员
属性、方法、构造器、代码块、内部类
封装性、
继承性、
多态性、
(还有一个的话:抽象性)
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
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;
}
}
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;
}
}
运行结果:
关于赋值那一块,感觉自己掌握的不好:
最初写完代码运行时:
错误:radius没赋值上:我写的代码是:R=c.radius;
改正之后:c.radius=R;
应该是将右边的值赋给左边
测试
//方式一:
int area = test. method( ) ;
System. out. println(“面积为:”+ area);
//方式二:
System. out print1n(test. method()) ;
提示:
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);
}
}
输出的结果为:
写这个程序 遇到下面几个错误:
1.创建20个学生对象时,语法错误
正确的写法:
先声明20个数组对象,在使用。
2.取随机数时,公式错误
改为:
s[i].score=(int)(Math.random()*(150-0+1));
3.冒泡排序时,错误,将他们的分数交换
改为:应该是交换学生这个人