OOP⑷
1.对象数组:
/**
*学生类
*/
public class Student {
// 创建一个对象数组保存3名学生的信息
Student[] stus = new Student[3]; int age; // 年龄
String name; // 姓名 /**
* 无参构造
*/
public Student() {
} /**
* 带参构造
*/
public Student(int age, String name) {
this.age = age;
this.name = name;
} /**
* 循环给对象数组中的每一个元素 赋值
* @param stus 用户传递过来的对象数组
*/
public void addStudent() {
Scanner input = new Scanner(System.in);
for (int i = 0; i < stus.length; i++) {
System.out.println("请您给第" + (i + 1) + "个学生赋值:");
// 需要给数组中的每一个元素对象 实例化
stus[i] = new Student();
System.out.println("姓名:");
stus[i].name = input.next();
System.out.println("年龄:");
stus[i].age = input.nextInt();
} } /**
* @param students 需要遍历的数组名称
*/
public void showStudent() {
System.out.println("所有的学生信息显示如下:");
for (Student stu : stus) {
System.out.println(stu.name + ":" + stu.age);
}
} /**
* 查询学生
*/
public void finStudent(int begin, int end, String name) {
// 定义一个标记
boolean flag = false;
for (int i = begin - 1; i < end; i++) {
if (stus[i].name.equals(name)) {
flag = true; // 找到了 为true
break;
}
}
if (flag) {
System.out.println("找到了");
} else {
System.out.println("您查询的学生不存在!");
}
} /**
* @param oldName 学生以前的姓名
* @param newName 更改之后的姓名
*/
public void changeName(String oldName, String newName) {
// 定义一个标记 看是否更改成功
boolean flag = false;
for (int i = 0; i < stus.length; i++) {
if (stus[i].name.equals(oldName)) {
stus[i].name = newName;
flag = true;
break;
}
}
if (flag) {
System.out.println("修改成功");
} else {
System.out.println("没有找到!无法修改");
}
} }
public class StudentTest { /**
* 需求:
* 01.现在有3名学生!创建一个对象数组保存这3名学生的信息!并且输出!
* 02.让用户输入一个开始和结束位置!以及学生的姓名! 我们判断是否有该学生!
*
*
* 分析:
* 01.3名学生,每一个学生都是一个对象!那么第一步创建一个学生类!!!
* 并且 给类中增加属性和构造方法
* 02.什么是数组? 一组相同数据类型的数据集合!
* int [] nums=new int[3];
*
* 什么是对象数组?
* 3名学生 是3个对象! 类型一样,类型都是Student类型!
* Student [] students=new Student[3];
* 现在students数组中的每一个元素 是什么?
* students[0] 是一个Student对象!
* students[1] 是一个Student对象!
* students[2] 是一个Student对象!
* 03.怎么给对象数组中的每一个元素(Student对象)的属性赋值呢?
* 前提 每一个元素 都需要实例化!
* 因为这个对象数组中的每一个元素 不再是普通的数值了,而是一个Student类型的对象!
* 对象没有实例化,是不能使用的!
* 否则会产生NullPointerException(空指针异常)
* null.不出来任何东西!
*/
public static void main(String[] args) { // 实例化Student类
Student stu = new Student();
stu.addStudent(); // 循环新增学生信息
// 看到输入的所有 学生信息
stu.showStudent();
// 根据开始和结束位置,去数组中查询 有没有该学生
Scanner input = new Scanner(System.in);
System.out.println("请输入开始查询的位置:");
int begin = input.nextInt();
System.out.println("请输入结束查询的位置:");
int end = input.nextInt();
System.out.println("请输入查询的学生姓名:");
String name = input.next();
// 根据用户的输入找到指定的学生
stu.finStudent(begin, end, name); System.out.println("请输入需要修改的学生姓名:");
String oldName = input.next();
System.out.println("请输入新姓名:");
String newName = input.next();
stu.changeName(oldName, newName);
// 看到输入的所有 学生信息
stu.showStudent(); } }
2.封装:
/**
* 学生类
*
* 面向对象的三大特性!
* 01.封装
* 概念:将类的某些信息隐藏在类内部!不允许其他类直接访问,而是通过该类提供的方法来访问隐藏的信息!
* 目的:隐藏类的内部细节! 安全!
*
* 步骤:
* 001.把所有的属性 私有化
* 002.创建属性对应的set和get方法 shift +alt +s +r 快速生成类中所有变量的set和get方法
* 003.在对应的set或者get方法中 增加逻辑判断!确保数据的有效性!
*
*
* 02.继承
* 03.多态
*
*/
public class Student {
private int age; // 年龄
private String name; // 姓名
private char sex; // 性别 /**
* get() 是为了别人获取值
* set() 是为了给属性赋值
* shift +alt +s +r 快速生成类中所有变量的set和get方法
*
*/
public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public char getSex() {
return sex;
} /**
* @param sex 用户传递来的 用户性别
* 如果用户输入的是不健康的数据!
* 我们默认sex='男'
*/
public void setSex(char sex) {
if (sex == '男' || sex == '女') {
this.sex = sex;
} else {
// 不健康输入
this.sex = '男';
}
} }
public class StudentTest { public static void main(String[] args) {
Student stu = new Student();
stu.setSex('c'); // ͨ¹ýset()ÊôÐÔ¸³Öµ
// ͨ¹ýget()È¡Öµ
System.out.println(stu.getSex());
}
}
/**
* 学生类
*/
public class Student { int age; // 年龄
String name; // 姓名 /**
* shift +alt +s +o 快捷键 生成 有参和无参构造
*/
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
} public Student() {
super();
} /**
* 学生自我介绍的方法
*/
public void showInfo() {
System.out.println("我的姓名是:" + name);
System.out.println("我的年龄是:" + age);
} public void showInfo(Student stu) {
stu.age = 888; // 改变参数的值
stu.name = "小白";
System.out.println("参数的姓名是:" + stu.name);
System.out.println("参数的年龄是:" + stu.age);
} /**
* 学生睡觉的方法
*/
public void sleep() {
System.out.println(name + "在睡觉");
} /**
* @param stu 用户传递来的学生对象
* @return 是否长大了
*/
public void changeStudent(Student stu) {
// 定义一个标记
boolean flag = false;
if (stu.age > 20) {
flag = true;
} if (flag) {
System.out.println("你已经长大了!");
} else {
System.out.println("你还年轻!");
} } }
public class StudentTest {
public static void main(String[] args) {
// 创建学生类对象
Student stu = new Student();
stu.age = 20;
stu.name = "小黑";
// 自我介绍
stu.showInfo();
// 调用对象的睡觉方法
stu.sleep();
System.out.println("----------------------------");
stu.showInfo(stu);
// 调用学生是否长大的方法
stu.changeStudent(stu);
} }
/**
* 方法重载
* 01.在一个类中
* 02.方法名相同
* 03.参数列表不同
* 04.与方法的修饰符和返回值类型 无关!
*
*
* 其实就是一个静态的多态!
* 都是买东西,但是根据传递参数的不同得到一个不同的结果!
*/
public class Student {
int age; /**
* 构造的重载
*/
public Student() {
} public Student(int age) {
this.age = age;
} /**
* 买东西 什么都不给
*/
public void buy() { } /**
* 买东西 给钱 没找零
*/
public void buy(double money) { } /**
* 买东西 给钱 ,给东西
*/
public void buy(double money, String someThing) { } }
/**
* 一个类在被jvm加载的时候,首先会加载类中所有由static修饰的方法,属性,代码块!
* 并把这个数据放进堆中的静态存储区!便于我们访问!
*
* static 可以修饰的内容
* 01.属性 静态属性
* 02.方法 静态方法
* 03.代码块 静态代码块
*
*
* 特点:
* 01. 有static修饰的内容,在整个程序运行期间,只存在一份!
* 02. 有static修饰的属性和方法,直接可以通过类名.属性 /类名.方法
* 03. static修饰的方法中 不能访问 非static修饰的的属性!
* 04.非static修饰的方法中能访问 static修饰的的属性!
*
*
* 例子:
* 之前说过 一个类可以创建N个对象!
* 每个对象都是独一无二的!
*
* 现在 我们实现N个对象 共享一个属性!
*
*/
public class Student { static int age; // 静态变量
String name; /**
* 创建一个static修饰的静态方法
* 之前的方式:
* 01.通过类创建对象
* 02.通过对象.方法访问
*
* 现在
* 直接通过类名.方法
*/ public static void sayHello() {
System.out.println("我是一个静态方法");
} public static void main(String[] args) {
Student stu1 = new Student();
stu1.age = 50;
stu1.name = "小黑";
Student stu2 = new Student();
stu2.age = 30;
stu2.name = "小白"; System.out.println("stu1的年龄:" + stu1.age);
System.out.println("stu2的年龄:" + stu2.age);
System.out.println("stu1的姓名:" + stu1.name);
System.out.println("stu2的姓名:" + stu2.name); /**
* 在 age前 加一个修饰符 static
* 虽然没有给stu3对象的age属性赋值!
* 但是因为age是static修饰的!
* 所以所有对象共享这个属性!
* 只要有一个对象改变了这个age属性!
* 那么所有对象的这个age属性都随之发生变化!
*/
Student stu3 = new Student();
stu3.age = 60;
System.out.println("stu3的年龄:" + stu3.age); Student.sayHello(); } }
/**
* 验证静态代码块和普通代码块的执行顺序
* 静态代码块优先执行!
*
* 如果有多个静态代码块或者普通代码块
* 按照书写的顺序执行!
*/
public class StaticBlock { public StaticBlock() {
System.out.println(" 无参构造");
} {
System.out.println("普通代码块1");
} {
System.out.println("普通代码块2");
} static {
System.out.println("静态代码块1");
}
static {
System.out.println("静态代码块2");
} public static void main(String[] args) {
// 实例化对象
StaticBlock s = new StaticBlock();
} }
/**
* 书写实体类的步骤
* 01.定义属性
* 02.快捷键生成set get
* 03.快捷键生成 有参 无参构造
* 04.生成toString()
*/
public class Student {
private int age;
private String name; // 属性 /**
* set和get方法名称后的第一个单词 首字母小写 ===》属性名
*
* 01.this调用本类的构造方法时,只能存在构造方法中的第一行!
* 02.this还可以访问我们的属性和方法 可以存在任何位置!
*/
public Student() {
this(50, "小黑"); // 调用本类的带参构造
} public Student(int age, String name) {
// this(); 调用本类的无参构造
this.age = age;
this.name = name;
} // set get方法
public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }
public class StudentTest { public static void main(String[] args) { Student stu = new Student();
System.out.println(stu.getName());
System.out.println(stu.getAge()); }
}
OOP⑷的更多相关文章
- c#面向对象基础技能——学习笔记(二)基于OOP思想研究对象的【属性】
字段(成员变量): 字段只能从对象中访问实例字段,无法直接从类中访问(换言之,不创建实例就不能访问),可以理解为:字段一般用在内部数据交互使用,当需要为外部提供数据时,(要优先使用自动实现的属性而不是 ...
- 一个简单oop的changeTab
好多地方都会用到这样一个效果“点击tab切换内容页”,根据自己的想法实现了一下,写了个简单的插件.以前写代码都是标准的函数式编程,现在觉得面向对象编程看起来比较爽,并且更容易维护,于是就用oop的思想 ...
- Python OOP(面向对象编程)
一OOP的作用 在Python中,类是面向对象设计(OOP)的主要工具.通过使用类这种工具,OOP可以: 1.分解代码,最小化代码的冗余. 2.通过定制现有的代码,来编写新的程序,而不用在原处进行修改 ...
- OOP,WEB开发实用小技巧
偶然读到一篇博客,记录一下心得.这种设计对于新手来说一般是想不到的,它充分的发挥了OOP语言的特性,让代码专用而清爽.这是不是重构的思想呢? 我们在写业务层的时候,有很多方法是重复功能的,我们就可以使 ...
- 从OOP的角度看Golang
资料来源 https://github.com/luciotato/golang-notes/blob/master/OOP.md?hmsr=toutiao.io&utm_medium=tou ...
- 玩转JavaScript OOP[2]——类的实现
概述 当我们在谈论面向对象编程时,我们在谈论什么?我们首先谈论的是一些概念:对象.类.封装.继承.多态.对象和类是面向对象的基础,封装.继承和多态是面向对象编程的三大特性. JavaScript提供了 ...
- Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系
Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...
- iOS - 对OOA、OOD、OOP的理解
很多人在求职的时候,会遇到一个这样的问题:“对OOD/OOP有较深的理解”,这个时候有人就会问OOD.OOP是什么呢?那么今天咱们就一块来看一下OOA.OOD.OOP到底是什么! (一)OOA--面向 ...
- OOP感悟
行内讲的最多的就是出来一年内基本靠copy,一年后才基本懂得如何去写代码,而理解领悟oop,需要的时间却不定. 我工作中,我发现很多人拿着面向对相当的语言作者做着面向过程的事情,不需要知其所以然,只要 ...
- 初识JAVA之OOP
有一段时间没发博客了,每次手打还是很累,但感觉很充实.. 最近发现很多初学者到了面向对象编程这个知识点时,不太清楚类是如何转化成为对象的,很是困扰,今天我在这里谈谈我的理解,大家一起来研究学习... ...
随机推荐
- d3 .each()
d3.select("xxx") .each(function (d) { //this表示当前element 而 d表示绑定的数据 something(this); }); 注意 ...
- pycharm设置连接github
pycharm与guthub连起来,推送代码会方便一些 教程很多,转发一个:https://www.cnblogs.com/feixuelove1009/p/5955332.html
- ffmpeg 加 logo
How to add a watermark or logo to any corner or the center of a video with FFMPEG. ffmpeg –i video.m ...
- breakthroughs in statistics | 统计学历史
<breakthroughs in statistics>- 这本书理解透了,统计方面应该可以封神了. 亚马逊上有卖,貌似还有好几卷. Breakthroughs in Statistic ...
- 使用jquery.mobile和WebSQL实现记事本功能
1.记事本列表页 1.1.页面结构与样式: <div data-role="page" id="home"> <div data-role=& ...
- salt相关
salt安装 https://docs.saltstack.com/en/latest/topics/installation/index.html#quick-install salt远程 ...
- jquery父、子、兄弟节点查找
js var test = document.getElementById("test"); var parent = test.parentNode; // 父节点 var ch ...
- 如何在mmseg3添加词库
一.了解几个文件 ll /usr/local/mmseg/etc/mmseg.ini uni.lib 编译后的词库,给sphinx 用的unigram.txt 原词库给人看的, 在这里面人工添加自 ...
- NIM 博弈 牛客小白月赛2 E-是是非非
题目链接 分析:一个裸的NIM博弈 对于一个Nim游戏的局面(a1,a2,...,an),它是P-position(即当前局面先手必败)当且仅当a1^a2^...^an=0,其中^表示异或(xor)运 ...
- hdu-3671-tarjin/割点方案
http://acm.hdu.edu.cn/showproblem.php?pid=3671 给出一幅无向图,询问有多少种移除点对的方案使得剩下的连通分量个数大于1. 和上一题差不多的思路直接做n次t ...