前言
b站java课程学习笔记整理。
b站视频: 黑马程序员全套Java教程_Java基础入门视频教程,零基础小白自学Java必备教程
99. 类和对象
没有对象就new
一个!
对象
类
属性
行为
一个具体的 东西
有相同的属性 和行为 的对象 的集合
对象的特征,每个属性都有特定的值
对象能干什么
我的手机
手机类
手机的价格是229元
可以打电话
100. 类的定义
类是java的基本组成单位。类的组成:属性和行为。
属性:在类中通过成员变量 来体现(类中方法外的变量)。
行为:在类中通过成员方法 来体现(和前面的方法相比**去掉static
**关键字即可)。
定义:
101. 对象的使用
对象的使用:
102. 学生
首先定义一个学生类,然后在学生测试类中定义一个对象(具体的学生),在学生类中完成成员变量和方法的使用。
成员变量:姓名,年龄。
成员方法: 学习,做作业。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package 学生;public class Student { String name; int age; public void doHomework () { System.out.println("他可以做作业" ); } public void goToSchool () { System.out.println("他上学去" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package 学生;public class StudentTest { public static void main (String[] args) { Student x = new Student(); x.age = 24 ; System.out.println("年龄为" + x.age); x.name = "Jiangeng" ; System.out.println("名字为" + x.name); x.doHomework(); x.goToSchool(); } }
不难解释之前的Scanner
用法了!
import java.util.Scanner;
意思就是导入java
下util
下Scanner
类,因为要用到这个包里的class
。
Scanner sc = new Scanner(System.in);
创建一个sc
对象,sc
对象属于Scanner
这个类。
int input = sc.nextInt();
调用了sc
的成员方法。
注意,如果在使用成员变量时不赋值,输出的是默认值。string
是null
,数值类是0
;
103. 单个对象的内存图
总结: new
的使用使用堆内存储存,对象代表的是堆内存的地址。
104. 多个对象的内存图
105. 多个对象指向相同内存图
和数组那个例子一样。
106. 成员变量和局部变量的区别
比较:
区别
成员变量
局部变量
类中位置不同
类中方法外
方法内或者方法声明上
内存中位置不同
堆内存
栈内存
生命周期不同
随着对象的存在而存在
随着方法的存在而存在
初始化值
可以有系统给的默认的
没有默认的
107-108. private
可以修饰成员变量和成员方法。作用是保护成员不被别的类使用,被private
修饰只能在本类使用。
如果想被别的类使用,可以:
提供get变量名()
方法,用于获取成员变量的值,用public
修饰。
提供set变量名()
方法,用于设置成员变量的值,用public
修饰。
109. this
解决名字相同 时,局部变量无法赋值给成员变量的问题。 this被哪个方法调用,指定的就是哪个对象。(对象.xxx不就是成员变量的读取么!)
110. this内存原理
核心思想就是This
是指调用方法的对象。
This
用法实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package 学生;public class Student { private int age; public int getAge () { return age; } public void setAge (int age) { this .age = age; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 package 学生;public class StudentTest { public static void main (String[] args) { Student x = new Student(); x.setAge(23 ); System.out.println("年龄为" + x.getAge()); } }
111. 封装
封装是面向对象的三大对象之一(封装,继承,多态)。 封装原则:使用private
修饰,然后使用get
、set
方法。
封装的好处:提高了代码的安全性和复用性。
112. 构造方法
构造方法本质上是对调用这个类创建一个对象进行了条件约束(必须满足什么样的条件才能创建对象)。
113. 构造方法的注意事项
当一个类中没有写构造方法,系统会给一个无参的构造方法。如果已经定义了有参构造,系统就不会再提供无参的构造了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 package 学生;public class Student { private int age; private String name; public String getName () { return name; } public void setName (String name) { this .name = name; } public int getAge () { return age; } public void setAge (int age) { this .age = age; } public Student (String name, int age) { System.out.println("使用带参方法定义" ); this .name = name; this .age = age; } public Student () { System.out.println("使用无参方法定义" ); } public void getInfo () { System.out.println("学生名为" + name); System.out.println("学生年龄为" + age); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 package 学生;public class StudentTest { public static void main (String[] args) { Student x = new Student(); x.setAge(23 ); x.setName("Jiangeng" ); x.getInfo(); Student y = new Student("Jiangeng" , 23 ); y.getInfo(); } }
总结:对象的构造方法本质上也是一种成员方法,书写的格式和书写成员方法的相同,只不过构造方法的方法名要和类名一致。本质上也是一种重载。
在自己写代码时建议手动给出无参方法构建。
114. 标准类的制作
115. API
API应用程序编程接口:厂商提供给应用程序编程的接口,把这些类称为api。Java API指的是 Java JDK中提供各种功能的Java类。
之前用的nextInt()就是使用了API。
116. API练习-帮助文档
根据帮助文档学习Scanner
使用。
文档地址:点这里
sc.nextLine();
按下Ctrl Alt V
自动生成对象。
117. String
118. String构造方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package 字符串构建;public class StringDemo { public static void main (String[] args) { String s1 = new String(); System.out.println("s1:" + s1); char [] chs = {'a' , 'b' , 'c' }; String s2 = new String(chs); System.out.println("s2:" + s2); byte [] byts = {97 , 98 , 99 }; String s3 = new String(byts); System.out.println("s3:" + s3); String s4 = "abc" ; System.out.println("s4:" + s4); } }
119. String对象的特点
总结:new
的会新建一个地址值,直接赋值相同字符串的话只会指向之前生成好的地址值。
120. 字符串的比较
直接==
比较的是地址值是否相同。比较内容是否相同用equals()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 package 字符串的比较;public class StringCompare { public static void main (String[] args) { char [] chr = {'a' ,'b' ,'c' }; String s1 = new String(chr); String s2 = new String(chr); String s3 = "abc" ; String s4 = "abc" ; System.out.println(s1==s2); System.out.println(s1==s3); System.out.println(s3==s4); System.out.println(); System.out.println(s1.equals(s2)); System.out.println(s1.equals(s3)); System.out.println(s3.equals(s4)); } }
121. 用户登录
需求:已知用户名和密码,用程序实现登录。一共三次机会,登陆成功后给出提示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 package 登陆系统;import java.util.Scanner;public class LogIn { private String account = "zhanghu" ; private String password = "mima" ; Scanner sc = new Scanner(System.in); public void login () { for (int i = 0 ; i < 3 ; i++) { System.out.println("请输入账号" ); String account = sc.nextLine(); System.out.println("请输入密码" ); String password = sc.nextLine(); if (account.equals(this .account) && password.equals(this .password)) { System.out.println("登陆成功!" ); break ; } else { if (i == 2 ) { System.out.println("登陆失败,你的账号已经被锁定!" ); break ; } System.out.println("账号密码错误!你还有" + (3 - i - 1 ) + "次机会!" ); } } } }
1 2 3 4 5 6 7 8 9 package 登陆系统;public class LoglInTest { public static void main (String[] args) { LogIn demo = new LogIn(); demo.login(); } }
122. 遍历字符串
要求: 程序输入一个字符串,在控制台遍历
学到的命令:line.charAt()
获取字符串中的某一个字符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package 遍历字符串;import java.util.Scanner;public class bianlistring { public static void main (String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入字符串!" ); String input = sc.nextLine(); for (int i = 0 ; i < input.length(); i++){ System.out.print(input.charAt(i)); } } }
123. 案例:统计字符次数
需求:键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数。
注意:既然 ==
直接比较的是ASCII值,那么<=
也是可以直接比较地址值!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package 统计字符串;import java.util.Scanner;public class CalculateChar { public static void main (String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入字符串!" ); String input = sc.nextLine(); int countCapital = 0 ; int countLetter = 0 ; int countNum = 0 ; int countNone = 0 ; for (int i = 0 ; i < input.length(); i++) { if (input.charAt(i) >= 'A' && input.charAt(i) <= 'Z' ) { countCapital++; } else if (input.charAt(i) >= 'a' && input.charAt(i) <= 'z' ) { countLetter++; } else if (input.charAt(i) >= '0' && input.charAt(i) <= '9' ) { countNum++; } else { countNone++; } } System.out.println("大写字母的个数是" +countCapital+",小写字母的个数是" +countLetter+",数字的个数是" +countNum+",无法识别的字符个数是" +countNone); } }
124. 案例:拼接字符串
需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package 字符串拼接;public class StringTogether { public String joint (int [] arr) { String temp = "[" ; for (int i = 0 ; i < arr.length; i++) { temp += arr[i]; if (i != arr.length - 1 ) { temp += "," ; } else { temp += "]" ; } } return temp; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 package 字符串拼接;public class JointTest { public static void main (String[] args) { int [] inputArr = {1 , 2 , 3 }; StringTogether test = new StringTogether(); System.out.println(test.joint(inputArr)); } }
注意: 字符串直接加数组中的int
数值,是可以的。本质上和sout("字符" + 数字)
可以正常输出是一个道理。数字被自动转换为字符了。
125. 案例:字符串反转
键盘录用一个字符串,调用该方法,实现字符串反转。
1 2 3 4 5 6 7 8 9 10 11 package 字符串反转;public class StringConvert { public String convert (String line) { String temp = "" ; for (int i = line.length()-1 ; i >= 0 ; i--){ temp += line.charAt(i); } return temp; } }
1 2 3 4 5 6 7 8 9 10 11 package 字符串反转;import java.util.Scanner;public class ConvertTest { public static void main (String[] args) { Scanner sc = new Scanner(System.in); String input = sc.nextLine(); StringConvert test = new StringConvert(); System.out.println(test.convert(input)); } }
126. 帮助文档查看String方法
String replace(char oldChar, char newChar)
用新字符newChar
替换所有的 旧字符oldChar
。
String replace(CharSequence target, CharSequence replacement)
用新字符串replacement
替换所有的 旧字符串target
。
String replaceAll(String regex, String replacement)
用新字符串replacement
替换所有的 正则模式匹配的串。——(替换的是模糊字串)
String replaceFirst(String regex, String replacement)
用新字符串replacement
替换第一个 正则模式匹配的串。——(替换的是模糊字串)
如果未找到,则返回原来的字符串。
127. StringBuilder
普通的字符串拼接耗时并且浪费堆内存空间。
StringBuilder
可以解决这个问题。本质上是一个可变的字符串容器。
128. StringBuilder的构建方法
主要有两种构建方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package StringBuilderDemo;public class StringBuilderDemo { public static void main (String[] args) { StringBuilder sb = new StringBuilder(); System.out.println("sb:" +sb); System.out.println("length:" +sb.length()); StringBuilder sb2 = new StringBuilder("hello" ); System.out.println("sb2:" +sb2); System.out.println("length2:" +sb2.length()); } }
129. StringBuilder的添加和反转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package StringBuilderDemo;public class StringBuilderAddReverse { public static void main (String[] args) { StringBuilder sb = new StringBuilder(); StringBuilder sb2 = sb.append("hello" ); System.out.println("sb:" + sb); System.out.println("sb2:" + sb2); System.out.println(sb == sb2); StringBuilder sb3 = new StringBuilder(); sb3.append("hello " ); sb3.append("world" ); System.out.println(sb3); StringBuilder sb4 = new StringBuilder(); sb4.append("hello " ).append("world" ); System.out.println(sb4); sb4.reverse(); System.out.println("reversed sb4 " + sb4); } }
130. StringBuilder和String相互转换
StringBuilder
里面有反转和添加方法很好用,所以将String
转化为StringBuilder
。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package StringBuilder的转换;public class Converse { public static void main (String[] args) { StringBuilder sb = new StringBuilder(); sb.append("hello" ); String s = sb.toString(); System.out.println(s); String s1 = "hello" ; StringBuilder sb1 = new StringBuilder(s1); System.out.println(sb1); } }
131. 拼接字符串:升级版
案例:使用StringBuilder
把一个数组中的元素拼接成字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package 字符串的拼接升级版;public class Joint { public static void main (String[] args) { int [] arr = {1 , 2 , 3 , 4 }; System.out.println("输出的数组是" + joint(arr)); } public static String joint (int [] arr) { StringBuilder sb = new StringBuilder("[" ); for (int i = 0 ; i < arr.length; i++) { sb.append(arr[i]); if (i != arr.length - 1 ) { sb.append("," ); } } sb.append("]" ); String line = sb.toString(); return line; } }
132. 反转字符串:升级版
键盘输入字符串,控制台输出反转。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 package StringBuilder反转;import java.util.Scanner;public class StringBuilderReverse { public static void main (String[] args) { Scanner sc = new Scanner(System.in); String input = sc.nextLine(); System.out.println("反转后的字符串是:" +reverse(input)); } public static String reverse (String s) { StringBuilder sb = new StringBuilder(s); sb.reverse(); String backLine = sb.toString(); return backLine; } }
133. 帮助文档方法查看StringBuilder的用法
看帮助文档。