day07面向对象复习+课后练习
第一部分:面向对象上
两个要素:类和对象
- 类是对一类事物的描述,是抽象的、概念上的定义
- 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
创建Java自定义类
步骤:
- 定义类(考虑修饰符、类名)
- 编写类的属性(考虑修饰符、属性类型、属性名、初始化值)
- 编写类的方法(考虑修饰符、返回值类型、方法名、形参等)
类的结构:属性和方法
类的成员之一:属性
### 变量的分类:成员变量与局部变量
类和对象的创建
- 创建对象语法: 类名 对象名 = new 类名();
- 使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)
对象的创建和使用:匿名对象
我们也可以不定义对象的句柄,而直接调用这个对象的方法。这样的对象叫做匿名对象。
使用情况
- 如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象。
- 我们经常将匿名对象作为实参传递给一个方法调用。
类的访问机制:
-
在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。
(例外:static方法访问非static,编译不通过。)
- 在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中 定义的成员
成员变量(属性)和局部变量的区别
对象的内存解析
-
堆(Heap),此内存区域的唯一目的就是存放对象实例,几乎所有的对象 实例都在这里分配内存。这一点在Java虚拟机规范中的描述是:所有的
对象实例以及数组都要在堆上分配。 -
通常所说的栈(Stack),是指虚拟机栈。虚拟机栈用于存储局部变量等。
-
局部变量表存放了编译期可知长度的各种基本数据类型(boolean、byte、char 、 short 、 int 、 float 、
long 、double)、对象引用(reference类型,它不等同于对象本身,是对象在堆内存的首地址)。 方法执行完,自动释放。 -
方法区(Method Area),用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
方法举例与声明的格式
什么是方法(method、函数):
- 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中 也称为函数或过程。
- 将功能封装为方法的目的是,可以实现代码重用,简化代码
- Java里的方法不能独立存在,所有的方法必须定义在类里。
![](https://img-blog.csdnimg.cn/img_convert/a12b1715469f367bfe2621a21af9e4f1.png
方法的分类:按照是否有形参及返回值
方法使用中的注意点
- 如果方法有返回值,则必须在方法声明时,指定返回值类型,同时方法中需要使用return关键字来返回指定类型的变量或者常量
- 方法被调用一次,就会执行一次
- 没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可 以不必使用return语句。如果使用,仅用来结束方法。
- 定义方法时,方法的结果应该返回给调用者,交由调用者处理。
- 方法中只能调用方法或属性,不可以在方法内部定义方法
课后练习 1:类的设计
定义Person类
package demo04;
public class Person {
String name;
int age;
String sex;
public void study(){
System.out.println("studying");
}
public void showAge(){
System.out.println("age:"+age);
}
public int addAge(int i){
age+=i;
return age;
}
}
定义测试类
package demo04;
/*要求:(1)创建Person类的对象,设置该对象的name、
age和sex属性,调用study方法,输出字符串
“studying”,调用showAge()方法显示age值,调用
addAge()方法给对象的age属性值增加2岁。
(2)创建第二个对象,执行上述操作,体会同一个类的
不同对象之间的关系
*/
public class PersonTest {
public static void main(String[] args) {
Person p1=new Person();
p1.name="黄景瑜";
p1.age=29;
p1.sex="男";
p1.study();
p1.showAge();
int newAge=p1.addAge(2);
System.out.println(p1.name+"的新年龄为:"+newAge);
System.out.println(p1.age);//20
}
}
代码运行结果:
studying
age:29
黄景瑜的新年龄为:31
31
2.利用面向对象的编程方法,设计类Circle计算圆的面积。
**方式一:无返回值**
package com.atguigu.exer;
/*
利用面向对象的编程方法,设计类Circle计算圆的面积。
*/
public class CircleTest {
public static void main(String[] args) {
Circle c1=new Circle();
c1.radius=5.6;
double area=c1.findArea();
System.out.println(area);
}
}
//圆
class Circle{
//属性(半径)
double radius;
//求圆的面积
public double findArea(){
double area =Math.PI*radius*radius;
return area;
}
}
3.打印矩形面积
package com.atguigu.exer;
/*
1.编写程序,声明一个method方法,在方法中打印一个10*8 的*型矩形,
在main方法中调用该方法。
2.修改上一个程序,在method方法中,除打印一个10*8的*型矩形外,再
计算该矩形的面积,并将其作为
方法返回值。在main方法中调用该方法,接收返回的面积值并打印。
3.修改上一个程序,在method方法提供m和n两个参数,方法中打印一个m*n
的*型矩形,并计算该矩形的面积, 将其作为方法返回值。在main方法中调
用该方法,接收返回的面积值并打印
*/
public class Exer3Test {
public static void main(String[] args) {
Exer3Test test =new Exer3Test();
// test.method();
// test.method();
// System.out.println(test.method());
int area=test.method(12,5);
System.out.println((area));
// System.out.println(test.method(12,5));
}
//第一步:打印矩形
// public void method(){
// for (int i = 0; i < 10; i++) {
// for (int j = 0; j < 8; j++) {
// System.out.print("*");
// }
// System.out.println();
// }
// }
// public int method(){
// for (int i = 0; i < 10; i++) {
// for (int j = 0; j < 8; j++) {
// System.out.print("*");
// }
// System.out.println();
// }
// return 8*10;
// }
public int method(int m,int n){
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 8; j++) {
System.out.print("*");
}
System.out.println();
}
return m*n;
}
}
课后练习 2:对象数组
定义类Student,包含三个属性:学号number(int),年级state(int),成绩
score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:
- 生成随机数:Math.random(),返回值类型double;
-
四舍五入取整:Math.round(double d),返回值类型long。
5.声明一个日期类型MyDate:有属性:年year,月month,日day。创建2个日期
对象,分别赋值为:你的出生日期,你对象的出生日期,并显示信息。
课后练习 3:对象数组的改进
package com.atguigu.exer;
/*定义类Student,包含三个属性:学号number(int),年级state(int),成绩
score(int)。 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:
1) 生成随机数:Math.random(),返回值类型double;
2) 四舍五入取整:Math.round(double d),返回值类型long。
5.声明一个日期类型MyDate:有属性:年year,月month,日day。创建2个日期
对象,分别赋值为:你的出生日期,你对象的出生日期,并显示信息。
*/
public class StudentTest {
public static void main(String[] args) {
//声明Student类型的数组
Student1[] stus=new Student1[20];
for (int i = 0; i < 20; i++) {
//给数组元素赋值
stus[i]=new Student1();
//给Stuent对象的属性赋值
stus[i].number=(i+1);
//年级:[1,6]
stus[i].state=(int)(Math.random()*(6-1+1)+1);
//成绩
stus[i].score=(int)(Math.random()*(100-0+1));
}
StudentTest test =new StudentTest();
//遍历学生数组
test.print(stus);
System.out.println("**********************");
//state=3
test.searchState(stus,3);
System.out.println("++++++++++++++++++++");
test.sort(stus);
}//遍历Student1[]数组操作
public void print(Student1[] stus){
for (int i = 0; i < stus.length; i++) {
// System.out.println(stus[i].number+","+stus[i].state
// +","+stus[i].score);
System.out.println(stus[i].info());
}
}
public void searchState(Student1[] stus,int atate){
for (int i = 0; i < stus.length; i++) {
if(stus[i].state==3){
System.out.println(stus[i].info());
}
}
}public void sort(Student1[] stus){
for (int i = 0; i < stus.length - 1; i++) {
for (int j = 0; j < stus.length-1-i; j++) {
if(stus[j].score>stus[j+1].score){
//如果选用换序,交换的是数组中的元素student对象
Student1 temp=stus[j];
stus[j]=stus[j+1];
stus[j+1]=temp;
}
}
}
}
}
class Student1 {
int number;//学号
int state;//年级
int score;//成绩
//显示学生信息的方法
public String info(){
return "学号"+number+"年级"+state+"分数"+score;
}
}
运行结果
学号1年级3分数69
学号2年级4分数11
学号3年级3分数70
学号4年级4分数71
学号5年级4分数66
学号6年级4分数9
学号7年级5分数18
学号8年级2分数63
学号9年级4分数30
学号10年级2分数70
学号11年级2分数53
学号12年级3分数39
学号13年级2分数37
学号14年级1分数30
学号15年级5分数71
学号16年级6分数23
学号17年级6分数33
学号18年级2分数5
学号19年级2分数40
学号20年级3分数63
**********************
学号1年级3分数69
学号3年级3分数70
学号12年级3分数39
学号20年级3分数63
++++++++++++++++++++
Process finished with exit code 0