面向对象1
一、Java面向对象学习的三条主线:(第4-6章)
1.Java类及类的成员:属性、方法、构造器﹔代码块、内部类
2.面向对象的三大特征:封装性、继承性、多态性、(抽象性)
3.其它关键字:this、 super. static、final、abstract、interface、 package
面向过程(POP)与面向对象(OOP)
- 二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
- 面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
二、“人把大象装进冰箱”
1.面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。
- 把冰箱门打开
- 抬起大象,塞进冰箱
- 把冰箱门关闭
2.面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
人{
打开(冰箱){
冰箱.开开();
}
抬起(大象){
大象.进入(冰箱);
}
关闭(冰箱){
冰箱.闭合();
}
}
=======
冰箱{
开开(){}
闭合(){}
}
======
大象{
进入(冰箱){}
}
面向对象的思想概述
- 程序员从面向过程的执行者转化成了面向对象的指挥者
- 面向对象分析方法分析问题的思路和步骤:
-
- 根据问题需要,选择问题所针对的现实世界中的实体。
- 从实体中寻找解决问题相关的属性和功能,这些属性和功能就形成了概念世界中的类。
- 把抽象的实体用计算机语言进行描述,形成计算机世界中类的定义。即借助某种程序语言,把类构造成计算机能够识别和处理的数据结构。
- 将类实例化成计算机世界中的对象。对象是计算机世界中解决问题的最终工具。
一般具体操作是过程,名词是类
- 类(Class)和对象(Object)是面向对象的核心概念。
- 类是对一类事物的描述,是抽象的、概念上的定义
- 对象是实际存在的该类事物的每个个体,因而也称为实例(instance)。
- 面向对象程序设计的重点是类的设计
- 设计类,就是设计类的成员。
属性=成员变量= field =域、字段
方法=成员方法=函数=method
二、类和对象的使用(面向对象思想落地的实现):
- 创建类,设计类的成员
- 创建类的对象
- 通过对象.属性或对象.方法调用对象的结构
将p1变量保存的对象地址值赋给p3,导致p1和p3指向了堆空间中的同一个对象实体。
Person p3 = p1//地址值相同
类中属性的使用
属性(成员变量)与局部变量
1.相同点:
1.1定义变量的格式:数据类型 变量名=变量值
1.2先声明,后使用
1.3变量都有其对应的作用域
2.不同点:
2.1 在类中声明的位置的不同
- 属性:直接定义在类的一对{}内
- 局部变量:声明在方法内、方法形参、代码块内、构造器形参、构造器内部的变量
2.2关于权限修饰符的不同
属性:可以在声明属性时,指明其权限,使用权限修饰符。
- 常用的权限修饰符:private、public、缺省、protected
- 目前,大家声明属性时,都使用缺省就可以了。(默认,可以不写)
局部变量:不可以使用权限修饰符。(相对于使用了方法的修饰符)
2.3默认初始化值的情况:
属性:类的属性,根据其类型,都有默认初始化值。
- 整型(byte、 short、 int、 long) : 0
- 浮点型(float. double) : 0.0
- 字符型(char) :0 (或'\ue000')
- 布尔型( boolean): false
- 引用数据类型(类、数组、接口): null
局部变量:没有默认初始化值。
- 意味着,我们在调用局部变量之前,一定要显式赋值。
- 特别地:形参在调用时,我们赋值即可。
- 00即在使用之前一定要赋值
2.4在内存中加载的位置:
属性:加载到堆空间中(非static)
局部变量:加载到栈空间
类中方法的声明和使用
- 方法:描述类应该具有的功能。
- 比如:Math类:sqrt( ) \ random() ...
Scanner类: nextXxx() ...
Arrays类: sort() \ binarySearch() \ toString() \ equals()
2.方法的声明:权限修饰符 返回值类型 方法名(形参列表){
方法体
}
3.说明:
3.1关于权限修饰符:
- java规定的4种权限修饰符: private、public、缺省、protected
3.2返回值类型:有返回值Ms没有返回值
- 如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量。
- 如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就;使用不使用return.但是,如果使用的话,只能“return;"表示结束此方法的意思。
3.2.2我们定义方法该不该有返回值?
- 题目要求
- 凭经验:具体问题具体分析
3.3 方法名:属于标识符,遵循标识符的规则和规范,“见名知意”
3.4 形参列表:方法可以声明0个,1个,或多个形参。
格式:数据类型1 形参1, 数据类型2 形参2,...
3.4.2 我们定义方法时,该不该定义形参?
- 题目要求
- 凭经验:具体问题具体分析
3.5方法体:方法功能的体现。
return关键字的使用:
1.使用范围:使用在方法体中
2.作用:
- 结束方法
- 针对于有返回值类型的方法,使用"return数据"方法返回所要的数据。
3.注意点:return关键字后面不可以声明执行语句。
5.方法的使用中,可以调用当前类的属性或方法
特殊的:方法A中又调用了方法A:递归方法。
方法中,不可以定义方法。
package com.xin.OOPTest;
/*
要求:
(1)创建Person类的对象,设置该对象的name、age和sex属性,调用study方法,输出字符串studying”,调用showAge()方法显示age值,
调用addAge()方法给对象的age属性值增加2岁。
(2)创建第二个对象,执行上述操作,体会同一个类的不同对象之间的关系。
*/
public class Person {
String name;
int age;
/**
* sex:1表明为男性
* sex:0表明为女性
*/
int sex;
public void study(){
System.out.println("studying");
}
public void showAge(){
System.out.println("age:"+age);
}
/**
*
* @param i 为增加年龄
* @return
*/
public int addAge(int i){
age+=i;
return age;
}
}
/*
public static void main(String[] args) {
Person person = new Person();
person.name="tom";
person.age=18;
person.sex=1;
person.study();
person.showAge();//alt+左与右往返//ctrl+点击
int newAge = person.addAge(5);
System.out.println(person.name+"新年龄"+newAge);
person.showAge();
System.out.println("===========");
Person person1 = new Person();
person1.age=10;
person1.showAge();
}
*/
*4.对象数组题目:
定义类Student,包含三个属性:学号number(int),年级state(int),成绩score(int)。创建20个学生对象,学号为1到20,年级和成绩都由随机数确定。
问题一:打印出3年级(state值为3)的学生信息。
问题二:使用冒泡排序按学生成绩排序,并遍历所有学生信息
提示:
1)生成随机数:Math.random(),返回值类型double;
2)四舍五入取整:Math.round( double d),返回值类型long。
package com.xin.OOPTest;
public class Student {
public static void main(String[] args) {
//声明一个Student类型数组 00数组
Student1[] s = new Student1[20];
for (int i = 0; i < s.length; i++) {
//给数组元素赋值
s[i] = new Student1();
//给Student对象的属性赋值
s[i].number=i+1;
//年级
s[i].state=(int)(Math.random()*6+1) ;
//成绩
s[i].score =(int)(Math.random()*(100+1));
}
//遍历
for (int i = 0; i < 20; i++) {
s[i].info();
}
System.out.println("===========");
for (int i = 0; i < 20; i++) {
if (s[i].state == 3) {
s[i].info();
}
}
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){
//如果需要换序,交换的是Studengt对象
Student1 temp=s[j];//声明一个临时Student的对象
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
//遍历
for (int i = 0; i < 20; i++) {
s[i].info();
}
}
}
class Student1{
int number;//学号
int state;//年级
int score;//成绩
//显示学生信息方法
public void info(){
System.out.println("学号"+number + ", 年级" +state+ ", 成绩" + score);
}
}
此代码是对StudentTest.java的改进:将操作数组的功能封装到方法中
00000000000经典
package com.xin.OOPTest;
public class Student {
public static void main(String[] args) {
//声明一个Student类型数组 00数组
Student1[] s = new Student1[20];//学生对象数组
for (int i = 0; i < s.length; i++) {
//给数组元素赋值
s[i] = new Student1();
//给Student对象的属性赋值
s[i].number=i+1;
//年级
s[i].state=(int)(Math.random()*6+1) ;
//成绩
s[i].score =(int)(Math.random()*(100+1));
}
Student student = new Student();//主函数对象
student.print(s);
System.out.println("===========");
//查找Studend1数组中指定的年级学生信息
student.searchState(s,3);
System.out.println("===========");
//冒泡排序成绩
student.sort(s);
}
//遍历
public void print(Student1[] s){
for (int i = 0; i < 20; i++) {
s[i].info();
}
}
/**
* 查找Studend1数组中指定的年级学生信息
* @param s 要查找的数组
* @param state 要找的年级
*/
public void searchState(Student1[] s,int state){
for (int i = 0; i < 20; i++) {
if (s[i].state == 3) {
s[i].info();
}
}
}
/**
* 给数组Student1排序
* @param s Student1的对象
*/
public void sort(Student1[] s){
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){
//如果需要换序,交换的是Studengt对象
Student1 temp=s[j];//声明一个临时Student的对象
s[j]=s[j+1];
s[j+1]=temp;
}
}
}
//遍历
for (int i = 0; i < 20; i++) {
s[i].info();
}
}
}
class Student1{
int number;//学号
int state;//年级
int score;//成绩
//显示学生信息方法
public void info(){
System.out.println("学号"+number + ", 年级" +state+ ", 成绩" + score);
}
}
标签:int,Student1,面向对象,对象,方法,public
From: https://www.cnblogs.com/xin-zhi-suo-xiang/p/17558599.html