面向对象之离散知识点合计
文章目录
1. 面向对象的基本概念
1. 概念理解
以树结构去理解,每上一层root分支视为class,下层结构则是它的三要素:封装、继承、多态;值得注意的是,下层结构是对上层结构的改写,有利于代码的扩展性;这里,如果您觉得树结构帮助不到您,那使用超市的货架会有很大作用。
2. class调用
2.1 创建对象
调用时,首先你要有一个对象,没有怎么办?new一个就可以了
类似于Person p = new Person();格式即可
总结下来就是:类名 对象名 = new 类名();
2.2 使用对象
区分成员变量和成员方法
2.2.1使用成员变量
使用成员变量,类似p.brand;
格式就是:对象名.变量名
2.2.2 使用成员方法
形如p.call();
格式:对象名.方法名();
2.3 举例说明
package com.demo1;
public class PhoneDemo {
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
p.Brand = "IPhone";
p.price = 5999.00;
//使用成员变量
String brand = p.Brand;
Double price =p.price;
System.out.println(brand);
System.out.println(price);
/**System.out.println(p.Brand);
System.out.println(p.price);*/
//使用成员方法
p.call();
}
}
class Phone{
//成员变量
double price;
String Brand;
//成员方法
void call(){
System.out.println("打电话");
}
}
//结果展示
IPhone
5999.0
打电话
3. 内存图
这里从程序执行过程描述;包含四大块:堆、栈、data segment、code segment
3.1程序执行过程
3.2 内存结构描述
这里有写的比较好的;引荐一下内存图概念描述、JVM内存示意图、 JVM内存结构,我就不写了,自己动手画一画,一遍就足够理解
4. 变量
4.1 局部变量与成员变量
这个总结下来就是一句话,看括号,括号即作用域。
5. 封装
5.1 private关键字
权限修饰符这里可以参见查看第四条
a.是一个权限修饰符
b.可以修饰成员(成员变量和成员方法)
c.作用是保护成员不被别的类使用,被private修饰的成员只有在本类中才能访问
d.如果其他类需要访问被private修饰的成员变量,可以使用getter,setter方法。具体格式为get变量名();set变量名(参数);使用public修饰。
tip:idea中getter,setter快捷键:alt+insert
譬如:
创建一个被private修饰的成员变量的类
package com.demo2;
public class person {
private int age;
private String name;
public void setAge(int age) {
//可以在类中加入判断
if (age<0 || age>200){
System.out.println("请输入正确年龄:");
}else
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
然后去调用
package com.demo2;
public class PrivateDemo {
public static void main(String[] args) {
person p = new person();
p.setAge(12);
p.setName("bob");
System.out.println(p.getAge() + "," + p.getName());
}
}
输出结果
//传值12,bob
12,bob
//传值-12,bob
0,bob//注意这里0是age(int)类型的默认值
5.2 this关键字
这个其实上边getter,setter已经用到了,使用时注意一点就可以了,那就是this指代的是成员变量,this.name=name中,this.name是成员变量中的name,而后边的name 是局部变量的name。可以引荐this关键字小结
简单描述----来自黑马教程
1.this指代的变量是成员变量
2.什么时候使用this?解决局部变量隐藏成员变量
3.this代表所在类的对象引用。方法被哪个对象调用,this就指代哪个对象。
5.3 this内存原理
6. 构造函数
是一种特殊的方法,用于创建对象
//格式
public class 类名 {
修饰符 类名(参数)
}
package com.test01;
public class Student {
String name;
int age;
//构造方法
public Student(String name,int age){
this.name = name;
this.age = age;
}
public void show(){
System.out.println("name:"+name+","+"age:"+age);
}
}
package com.test01;
/*测试类
* */
public class demo01 {
public static void main(String[] args) {
Student s = new Student("liqingxia",14);
s.show();
}
}
//结果展示
name:liqingxia,age:14
注意事项:1.如果没有构造方法,系统将采用默认的构造方法,类似于public student(){};如果定义了,就采用构造的
2.构造方法可以重载,根据需要的参数编写
7. API 文档
8. 快捷键
idea快键键ctrl+alt+v自动生成编码格式,自动补全
ctrl+alt+L规范格式
alt+insert setter/getter方法
9. String
9.1 String 练习之用户登录
package com.demo1.tst01;
//模拟用户登录
import java.util.Scanner;
public class login {
public static void main(String[] args) {
String username = "ab";
String password = "1234";
for (int i = 0; i < 3; i++) {
//调用scanner
Scanner s = new Scanner(System.in);
System.out.println("请输入账号:");
String s1 = s.nextLine();
System.out.println("请输入密码:");
String s2 = s.nextLine();
if (s1.equals(username) && s2.equals(password)) {
System.out.println("登陆成功");
break;//这里break很重要哦!
} else {
if (2 - i == 0) {
System.out.println("您的账户被锁定");
//i,0,1,2
//次数: 2,1,0
} else
System.out.println("账号或者密码输入错误,请重新输入!");
System.out.println("您还有" + (2 - i) + "次机会");
}
}
}
}
//结果展示
请输入账号:
13
请输入密码:
13
账号或者密码输入错误,请重新输入!
您还有2次机会
请输入账号:
13
请输入密码:
13
账号或者密码输入错误,请重新输入!
您还有1次机会
请输入账号:
13
请输入密码:
13
您的账户被锁定
您还有0次机会
//
请输入账号:
aa
请输入密码:
aa
账号或者密码输入错误,请重新输入!
您还有2次机会
请输入账号:
ab
请输入密码:
1234
登陆成功
9.2 String练习之打印字符串
import java.util.Scanner;
public class String02 {
public static void main(String[] args) {
System.out.println("请输入字符串:");
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
for (int i=0;i<line.length();i++){
System.out.println(line.charAt(i));
}
}
}
//output
请输入字符串:
adfsgh
a
d
f
s
g
h
9.3 String练习之统计字符串个数
package com.test02_string;
import java.util.Scanner;
//统计字符串个数
public class string_test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
int bigCount = 0;
int smallCount = 0;
int numberCount = 0;
for (int i=0;i<line.length();i++){
char ch = line.charAt(i);
if (ch>='a'&&ch<='z'){
smallCount++;
}else if (ch>='A'&&ch<='Z'){
bigCount++;
}else if (ch>='0' && ch<='9'){
numberCount++;
}
}
System.out.println("该字符串中有小写字母"+smallCount+"个");
System.out.println("该字符串中有大写字母"+bigCount+"个");
System.out.println("该字符串中有数字"+numberCount+"个");
}
}
//output
请输入一个字符串:
sawret245364uSDAFSGDHF
该字符串中有小写字母7个
该字符串中有大写字母9个
该字符串中有数字6个
9.4 字符串拼接
package com.test02_string;
//字符串拼接,将{1, 2, 3, 4}输出为[1,2,3,4]
public class string_test02 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4};
String s = printArray(arr);
System.out.println(s);
}
public static String printArray(int[] arr) {
String s = " ";
s += "[";
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
s += arr[i];
} else {
s += arr[i];
s += ",";
}
}
s += "]";
return s;
}
}
9.5 字符串反转
package com.test02_string;
//字符串拼接
public class string_test02 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4};
String s = printArray(arr);
System.out.println(s);
}
public static String printArray(int[] arr) {
String s = " ";
s += "[";
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
s += arr[i];
} else {
s += arr[i];
s += ",";
}
}
s += "]";
return s;
}
}
//output
请输入一个字符串进行反转:
uyf
fyu
9.6 StringBuilder
9.6.1 StringBuilder用例
StringBuilder返回它本身
StringBuilder sb = new StringBuilder();
sb.append("hllo");
//链式结构,sb.append().append()...=sb;
sb.append("hello").append(10).append("java");
System.out.println(sb);
//反转
sb.reverse();
System.out.println(sb);
//output
hllohello10java
avaj01ollehollh
9.6.2 StringBuilder与String转化
// String转化 StringBuilder
String s = "hello"
StringBuilder sb = new StringBuilder(s);
System.out.println(s);
//StringBuilder转化String;通过toString()连接
System.out.println(sb.toString());
9.6.2.1 应用
9.6.2.1.1 input:{1,2,3};output:[1,2,3]
package com.test02_string;
//input:{1,2,3};output:[1,2,3]
public class stringBuilder {
public static void main(String[] args) {
int[] arr = {1,2,3};
System.out.println(arrayToString(arr));
}
public static String arrayToString(int[] arr){
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i=0;i<arr.length;i++){
if (i == arr.length-1){
sb.append(arr[i]);
}else
sb.append(arr[i]).append(",");
}
sb.append("]");
String s1 = sb.toString();
return s1;
}
}
//output
[1,2,3]
9.6.2.1.2 input:abc;output:cba
package com.test02_string;
import java.util.Scanner;
//reverse string
public class stringBuilder1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
System.out.println(myreverse(sc.nextLine()));
}
public static String myreverse(String s){
//string--StringBuilder--reverse--toString--string
/* StringBuilder s3 = new StringBuilder(s);
s3.reverse();
String s4 = s3.toString();
return s4;*/
return new StringBuilder(s).reverse().toString();
}
}
//output
请输入一个字符串:
askdjfsgv
vgsfjdksa
9.6 StringBuffer
StringBuffer和StringBuilder用法上差不离,区别在于:
StringBuffer线程安全,StringBuilder线程不安全;
性能上:StringBuffer较StringBuilder慢一些
10. Arraylist
10.1 Arraylist构建和添加
//构建
ArrayList<String> array = new ArrayList<>();
//添加
array.add("hello");
array.add("world");
//删除
array.remove("hello");
array.remove(0);//直接用索引
//修改
array.set(1,"java");
//统计个数
array.size();
//获取元素
array.get(0);
package com.arraylist.ts1;
import java.util.ArrayList;
public class tst {
public static void main(String[] args) {
ArrayList<String> array = new ArrayList<>();
System.out.println(array.add("hello"));
array.add("hello");
array.add("world");
System.out.println(array);
System.out.println(array.add("hello"));
System.out.println("array:"+array.add("hello"));
}
}
//output
true
[hello, hello, world]
true
array:true
10.2 遍历Array
for (int i=0;i<array.size();i++){
System.out.println(array.get(i));
}
10.3 案例
10.3.1 存储学生对象并遍历
package com.arraylist.ts1.test;
import java.util.ArrayList;
public class tst01 {
public static void main(String[] args) {
//创建集合对象
ArrayList<student> students = new ArrayList<>();
//创建学生对象
student s1 =new student("bob",12);
student s2 = new student("sam",14);
//添加学生对象到集合中
students.add(s1);
students.add(s2);
//输出
for (int i=0;i<students.size();i++){
student s = students.get(i);
System.out.println(s.getAge()+","+s.getName());
}
}
}
package com.arraylist.ts1.test;
public class student {
private String name;
private int age;
public student(){}
public student(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//output
12,bob
14,sam
10.3.2 将10.3.1改写成方法
package com.arraylist.ts1.test;
import java.util.ArrayList;
import java.util.Scanner;
public class tst01 {
public static void main(String[] args) {
ArrayList<student> array = new ArrayList<student>();
addname(array);
for (int i=0;i<array.size();i++){
student s = array.get(i);
System.out.println(s.getAge()+","+s.getName());
}
/** //创建集合对象
ArrayList<student> students = new ArrayList<>();
//创建学生对象
student s1 =new student("bob",12);
student s2 = new student("sam",14);
//添加学生对象到集合中
students.add(s1);
students.add(s2);
//输出
for (int i=0;i<students.size();i++){
student s = students.get(i);
System.out.println(s.getAge()+","+s.getName());
}*/
}
public static void addname(ArrayList<student> array){
Scanner sc = new Scanner(System.in);
System.out.println("please enter your name: ");
String name = sc.nextLine();
System.out.println("please enter your age: ");
int age = sc.nextInt();
student s = new student();
s.setAge(age);
s.setName(name);
array.add(s);
}
}
```java
//output
please enter your name:
bob
please enter your age:
12
12,bob
11.项目实战
11.1 学生管理系统
package com.arraylist.ts2;
import java.util.ArrayList;
import java.util.Scanner;
public class studentManager {
public static void main(String[] args) {
//创建集合对象,用于存储学生数据
ArrayList<student> array = new ArrayList<student>();
while (true) {//while循环为true返回
System.out.println("----------欢迎来到学生管理系统----------");
System.out.println("1 添加学生");
System.out.println("2 删除学生");
System.out.println("3 查看所有学生");
System.out.println("4 修改学生");
System.out.println("5 退出");
System.out.println("请输入你的选择: ");
//键盘录入
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
//Switch循环
switch (line) {
case "1":
//System.out.println("添加学生");
addStudent(array);
break;
case "2":
//System.out.println("删除学生");
deleteStudent(array);
break;
case "3":
//System.out.println("查看所有学生");
findAllStudent(array);
break;
case "4":
//System.out.println("修改学生");
changeStudent(array);
break;
case "5":
System.out.println("退出");
System.exit(0);//jvm退出
}
}
}
public static void addStudent(ArrayList<student> array) {
Scanner sc = new Scanner(System.in);
//为了sid被while循环外调用
String sid;
//为了让程序能够回到这里,使用循环实现
while (true) {
System.out.println("请输入学生学号: ");
sid = sc.nextLine();
boolean flag = isUsed(array, sid);
if (flag) {
System.out.println("你输入的学号已被占用,请重新输入: ");
} else {
break;
}
}
System.out.println("请输入学生姓名: ");
String name = sc.nextLine();
System.out.println("请输入学生地址: ");
String address = sc.nextLine();
System.out.println("请输入学生年龄: ");
int age = sc.nextInt();
//创建学生对象
student s = new student();
//键盘录入值赋给成员变量
s.setName(name);
s.setSid(sid);
s.setAddress(address);
s.setAge(age);
//将学生对象添加到集合中
array.add(s);
//提示添加成功
System.out.println("添加学生成功");
}
public static void findAllStudent(ArrayList<student> array) {
if (array.size() == 0) {
System.out.println("无数据,请添加数据后查看");
return;
}
//显示表头信息
System.out.println("学号\t姓名\t年龄\t地址");
for (int i = 0; i < array.size(); i++) {
student s = array.get(i);
System.out.println(s.getSid() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getAddress());
}
}
public static void deleteStudent(ArrayList<student> array) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你想删除的学生的学号: ");
String line = sc.nextLine();
//创建索引用于删除
int index = -1;
//循环找到需要删除的学号
for (int i = 0; i < array.size(); i++) {
student s = array.get(i);
if (s.getSid().equals(line)) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("学生信息不存在");
} else {
array.remove(index);
//给出删除提示
System.out.println("删除成功");
}
}
public static void changeStudent(ArrayList<student> array) {
Scanner sc = new Scanner(System.in);
//提示
System.out.println("请输入需要修改的学生的学号: ");
String line = sc.nextLine();
//键盘录入要修改的学生信息
System.out.println("请输入修改的姓名: ");
String name = sc.nextLine();
System.out.println("请输入修改的地址: ");
String address = sc.nextLine();
System.out.println("请输入修改的学号: ");
String sid = sc.nextLine();
System.out.println("请输入修改的年龄: ");
int age = sc.nextInt();
//创建学生对象
student s = new student();
s.setAge(age);
s.setAddress(address);
s.setSid(sid);
s.setName(name);
//遍历集合修改对应的学生信息
for (int i = 0; i < array.size(); i++) {
student student = array.get(i);
if (student.getSid().equals(line)) {
array.set(i, s);
break;
}
}
}
public static boolean isUsed(ArrayList<student> array, String sid) {
//学号相同为true,不同为false
boolean flag = false;
for (int i = 0; i < array.size(); i++) {
student student = array.get(i);
if (student.getSid().equals(sid)) {
flag = true;
break;
}
}
return flag;
}
}
package com.arraylist.ts2;
public class student {
private String name;
private String address;
private String sid;
private int age;
public student() {
}
public student(String name, String address, String sid, int age) {
this.name = name;
this.address = address;
this.sid = sid;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}