Day06 课堂笔记
标签(空格分隔): java基础
阶段总结+往后学习大纲
1,java语法知识(1-5)
- day01
- 计算机软件硬件 安装JDK和配置环境变量 java概述 写了小程序HelloWorld
注释 关键字 标识符
- 计算机软件硬件 安装JDK和配置环境变量 java概述 写了小程序HelloWorld
- day02
- 常量 进制(原反补) 变量 数据类型 类型转换 运算符
- day03
- 运算符 Scanner屏幕录入对象 流程语句(if-switch结构)
- day04
- 循环结构(for while do-while) 方法(函数) 定义 怎么调用
- day05
- 一维数组 二维数组
- day01
2,面向对象思想(6-10)
- 面向对象思想-面向过程思想
- 什么是类 - 类的组成
- 什么是对象 - 对象和类的关系
- 三大特征 : 封装 继承 多态
- 内部类 包
- 3,API的学习(11-14)
- 4,集合(15-18)
- 5,IO流(19-23)
- 6,多线程(24-25)
- 7,网络编程(26)
- 8,反射+新特性(27)
面向对象思想
面向过程与面向对象有哪些区别与联系?最好能举例说明
- 面向对象:注重的是对象
- 面向过程:注重的是过程
举例 :
学生要学习编程? - 面向过程 : 学生自己找资料 一步步自学成才
面向对象 : 找个好的培训机构,选个帅的好的老师,调用老师的教学方法
面向过程 : 代表语言 C语言 ,函数(方法)
面向对象 : 代表语言 java语言 , C++,维护代码非常方便
经典案例: 把大象装进冰箱
- 面向过程思想:
(1)打开冰箱
(2)放进大象
(3)关上冰箱
面向对象思想:
以后在咱们的开发中,你要是想让你的代码具有面向对象的思想,你必须从以下几点开始考虑:
- (1)这个需求涉及到哪些类
- (UML 建模语言:分析需求里面有哪些类)
- 名词提炼法 : 大象 冰箱
- (2)这个类有哪些内容(属性/行为)
- 冰箱 : 打开冰箱 关闭冰箱
- 大象 : 装进
- (3)类和类之间的关系
大象类 冰箱类 测试类
- (1)这个需求涉及到哪些类
面向对象的思想特点有哪些?(面试时候讲的)
- (1)更符合我们生活中的思想(懒人思想)
- (2)把复杂的事情变得简单化
- (3)从执行者变成指挥者,角色发生转变
面向对象的三大特征分别是什么?
封装 继承 多态
类和对象
什么是类,什么是对象?他们在生活中的体现分别是什么。
- 类:一组相关属性和行为的集合
- 对象:该类事物的具体体现
举例
类 : 人
对象 : 具体到某个人
什么是成员变量,什么是成员方法?
- 成员变量 : 定义在类中,方法外的变量 属性
- 成员方法 : 对象的行为
学习编程语言?
- 主要是用编程语言来描述这个世界,解决生活中问题
- 怎么用编程语言描述?
- 在java中,我们要去描述生活中的事物,我们就需要使用类class去描述
- 描述生活中的事物的时候,需要描述什么呢?
- 属性 行为
举例 :
人 属性: 三围 体重 身高 名字
行为 : 吃饭 睡觉 打dota 打lol 开车….
- 属性 行为
- 在java中,事物的属性和行为是怎么描述的?
- 属性:在java中对应 成员变量
- 行为:在java中对应 成员方法
学生类的定义(非常非常非常重要)
/*
* A:案例演示
* 属性:姓名,年龄,性别
* 行为:学习,睡觉
* B:我们如何描述现实世界事物
* 属性 就是该事物的描述信息(事物身上的名词)
* 行为 就是该事物能够做什么(事物身上的动词)
* C:Java中最基本的单位是类,Java中用class描述事物也是如此
* 成员变量 就是事物的属性
* 成员方法 就是事物的行为
* D:定义类其实就是定义类的成员(成员变量和成员方法)
* a:成员变量 和以前定义变量是一样的,只不过位置发生了改变。在类中,方法外。
* b:成员方法 和以前定义方法是一样的,只不过把static去掉,后面在详细讲解static的作用。
*/
class Student {
String name; //姓名
int age; //年龄
String gender; //性别
public void study() { //定义学习的方法
System.out.println("学生学习");
}
public void sleep() { //定义睡觉的方法
System.out.println("学生睡觉");
}
}
手机类的定义
/*
* 模仿学生类,让学生自己完成
* 属性:品牌(brand)价格(price)
* 行为:打电话(call),发信息(sendMessage)玩游戏(playGame)
*/
class Phone {
String brand; //品牌
int price; //价格
public void call() { //打电话
System.out.println("打电话");
}
public void sendMessage() { //发信息
System.out.println("发信息");
}
public void playGame() { //玩游戏
System.out.println("玩游戏");
}
}
对象怎么使用?怎么创建?(非常非常非常重要)
描述一个事物的时候,我们要定义一个类,但是如果我们要使用这个类的时候,我们另外需要定义一个测试类,这个测试类必须具有main方法,因为main方法是程序的入口,如果没有main方法无法执行.
我们要描述类,要使用类,最少要写两个类!- (1)你描述的事物那个类
- (2)测试类,具有主方法main方法
使用类的时候,我们怎么使用?
- 要使用一个类,必须先创建对象!
创建对象的格式?
格式 类名 对象名 = new 类名();
解释:对象名 :其实就是标识符
类名 : Student Person Phone
举例:Student s = new Student();
- 要使用一个类,必须先创建对象!
- 创建完对象之后,怎么去用?
- 调用成员变量,怎么调用?
对象名.成员变量名;
解释:成员变量名就是你定义成员变量的时候起的名字 name age
举例 :s.name = "超帅"
s.age = 18;
- 调用成员方法,怎么调用?
对象名.成员方法名;
解释 :方法名 就是你定义方法的时候起的名字 study() sleep()
举例:s.study(); s.sleep();
- 调用成员变量,怎么调用?
类的写法(必须会写)
第一步: 先写类 class Student {}
第二步: 在大括号里面 书写成员变量 String name; int age;
第三步: 写成员方法,public void study(){ System.out.println("学习");
}
测试类的写法(必须会写)
- 前提条件:要有main方法
举例如下:
手机类的测试类
class Demo2_Phone {
public static void main(String[] args) {
//创建对象 格式 类名 对象名 = new 类名();
Phone p = new Phone();
//调用对象中的属性并赋值
//格式 对象名.成员变量名 = 初始化值;
p.brand = "锤子";
p.price = 998;
System.out.println(p.brand + "..." + p.price);
//调用成员方法
//格式 对象名.成员方法名();
p.call();
p.sendMessage();
p.playGame();
}
}
学生类的测试类
class Demo1_Student {
public static void main(String[] args) {
//创建对象的格式:类名 对象名 = new 类名();
//对象名:其实就是合法的标识符,如果是一个单词所有字母小写,如果是多个单词,从第二个单词开始首字母大写
Student s = new Student();
//* D:如何使用成员变量呢?
//* 对象名.变量名
s.name = "张三";
s.age = 23;
System.out.println(s.name + "..." + s.age);
//* E:如何使用成员方法呢?
//* 对象名.方法名(...)
s.study();
s.sleep();
}
}
汽车类的写法
汽车类(Car)
属性:车的颜色(color),车的轮胎个数(num)
行为:车会跑(run)
class Car {
String color;
int num;
public void run(){
System.out.println("老司机开车了...没时间解释,赶紧上车!");
}
}
class Demo1_Car {
public static void main(String[] args) {
Car c1 = new Car(); //创建对象
//调用属性并赋值
c1.color = "red"; //为车的颜色赋值
c1.num = 8; //为车的轮胎数赋值
//调用行为
c1.run();
Car c2 = new Car(); //创建对象
c2.color = "black"; //为车的颜色赋值
c2.num = 4; //为车的轮胎数赋值
c2.run();
//c2 = null; //用null把原来的地址值覆盖掉了
//c2.run(); //c2里面记录的是null,所以报出空指针异常
Car c3 = c2;
c3.run();
}
}
/*
车的属性
车的颜色
车的轮胎数
车的行为
车运行
*/
class Car {
//成员变量
String color; //车的颜色
int num; //车的轮胎数
public void run() { //车运行
System.out.println(color + "..." + num);
}
}
- 内存加载 (会画出来)
- 栈内存
方法进栈内存 局部变量 - 堆内存
new出来对象 - 方法区
字节码文件(.class文件) 代码
- 栈内存
- 执行流程:
- 第一步:DemoCar.class 加载到内存区下的方法区区域
- 第二步:找到main方法,main方法进入栈内存
- 第三步:开始读取main方法里面的代码 ,顺序读取
Car c1 = new Car();
读取的时候,会去找Car类,如果有,就把Car类加载到方法区
注意:如果是第一次加载,在方法区没有这个类,就会把这个类加载,如果方法区里面已经有了这个类,这个时候就不会再次加载这个类,而是直接使用!不管之后的类创建多少次对象,这个类都只是加载一次
如果没有,报错!
Car c1 是在main方法里面,在栈内存里面 - 第四步:Car类加载完毕,new Car();
一看到new这个关键字,就回去堆内存分配空间;然后把对应的成员变量信息分别初始化;先默认初始化—>显式初始化 - 第五步:分配完空间之后,加载完所有的成员变量信息后,会把地址值给到栈内存中的那个对象引用 Car c1,也就相当于说c1保存了堆内存中new Car出来的地址值
- 第六步:代码顺序往下执行,开始显式赋值;如果在这里调用了方法,这个方法也是进入栈内存!
class Demo1_Car {
public static void main(String[] args) {
Car c1 = new Car(); //创建对象
//调用属性并赋值
c1.color = "red"; //为车的颜色赋值
c1.num = 8; //为车的轮胎数赋值
//调用行为
c1.run();
Car c2 = new Car(); //创建对象
c2.color = "black"; //为车的颜色赋值
c2.num = 4; //为车的轮胎数赋值
c2.run();
//c2 = null; //用null把原来的地址值覆盖掉了
//c2.run(); //c2里面记录的是null,所以报出空指针异常
Car c3 = c2;
c3.run();
}
}
/*
车的属性
车的颜色
车的轮胎数
车的行为
车运行
*/
class Car {
//成员变量
String color; //车的颜色
int num; //车的轮胎数
public void run() { //车运行
System.out.println(color + "..." + num);
}
}
关于java垃圾回收
- 当一个对象没有任何的引用指向的时候,它会在堆内存中变成垃圾,这个时候会等待垃圾回收机制进行回收,但是并不一定马上就会被回收,等到一定的时间,就会自动清理.
- 我们如果希望把一个对象变成垃圾,可以怎么做?
那就把这个对象的引用赋值为null;null常量专门给引用数据类型赋值. - 在java中,我们不需要手动把引用赋值为null,为什么?因为java中有垃圾回收机制,它会自动帮我们清理垃圾,和C语言这种不一样.
- 当主方法方法弹栈后,所有的引用都会消失,也就意味着所有的对象都失去了引用,这个时候,所有对象就自动变成垃圾,等待回收!
成员变量和局部变量(理解,知道区别)
局部变量:声明在方法上或者在方法中的变量称为局部变量
成员变量:类中,方法外
成员变量与局部变量有什么区别?
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置 | 类中,方法外 | 方法声明上,方法体内 |
内存位置 | 堆内存中 | 栈内存中 |
生命周期 | 随着对象的创建而存在,随着对象的消失而消失 | 随着方法的调用而进栈,随着方法的弹栈(消失)而消失 |
初始化值 | 有默认初始化值 | 没有 |
在使用变量的过程中, 查找变量的顺序是什么?
注意:就近原则
class Man {
String name; //成员变量;
int age; //成员变量; 默认值为 0
public void drive(){ //开车方法
int age = 10; //局部变量 在方法里面
System.out.println(age); //这里使用age,就会优先使用最近的变量
}
}
方法的形式参数是类名的时候如何调用?(非常非常非常重要)
数据类型 :基本数据类型 和 引用数据类型
基本:四类八种
引用数据类型:数组 类 接口 枚举
class Man {
String name;
int age;
public void drive(Student s){ //形式参数 是在小括号里面
//这个方法应该如何调用?怎么调用呢?
}
}
案例解释
class Student_Demo {
public static void main(String[] args) {
Student s = new Student();
s.setName("罗健");
s.setAge(28);
//怎么调用方法? 单独调用 赋值调用 输出调用
//没有返回值的方法只能使用单独调用 格式: 方法名(传入方法需要的对应数据类型参数);
teachDrive(s);
Person p = new Person();
p.setName("健康");
p.setAge(19);
teachLookGirl(p); //Student_Demo.java:10: 错误: 无法将类 Student_Demo中的方法 teachLookGirl应用到给定类型;
}
//方法:功能 这个功能描述的,老司机带学生开车
public static void teachDrive(Student s){
System.out.println("老司机教" + s.getName() + "开车了,没时间解释了,赶紧上车!" );
}
public static void teachLookGirl(Person p){
System.out.println("老司机教" + p.getName() + "看美女了,没时间解释了,赶紧上车!");
}
}
//Person类
class Person
{
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
//传递的参数是类类型时候
class Student
{
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
总结 :如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
class Demo1_Student {
public static void main(String[] args) {
print(10);
Student s = new Student(); //创建对象,并将对象的地址值赋值给s
print(s);//0x0011
}
public static void print(int x) { //基本数据类型当作形式参数
System.out.println(x);
}
public static void print(Student stu) { Student stu = 0x0011; //引用数据类型当作形式参数
stu.name = "张三";
stu.age = 23;
stu.speak();
}
}
/*
* A:方法的参数是类名public void print(Student s){}//print(new Student());
* 如果你看到了一个方法的形式参数是一个类类型(引用类型),这里其实需要的是该类的对象。
*/
class Student {
String name; //姓名
int age; //年龄
public void speak() {
System.out.println(name + "..." + age);
}
}
匿名对象(知道怎么用,能看懂,也会用)
匿名: 没有名字 实名
有什么用?
一般怎么用? 传递参数使用 或者调用一次方法的时候使用
什么是匿名对象,有什么特点?
木有名字的对象就叫匿名对象,特点就是没名字
什么时候可以使用匿名对象?
(1)当我们需要调用一次,仅仅一次的时候,我们就可以使用匿名对象
(2)匿名对象可以当做参数传递
匿名对象最大的作用?
节省代码,将两行代码改成一行。
举例
class Student {
String name; //姓名
int age; //年龄
public void speak() {
System.out.println(name + "..." + age);
}
public void drive(){
System.out.println("开车");
}
}
class Test{
public static void main(String[] args){
//没有匿名对象前的做法
Student s = new Student();
s.speak();
s.speak(); //节省空间
//有了匿名对象后,就可以一行代码搞定 ,仅调用方法一次的时候才用
new Student().speak();
new Student().drive();
}
}
举例 : 当参数传递的时候
Student s = new Student(); //深圳宝安红灯区1号XXX路
s new Student()
XXX家地址 深圳宝安黄灯区1号XXX路
public void test(Student s){ //罗健家地址
s.drive();
}
假设我是一个不知道匿名对象是什么的程序员,我可不可以不用匿名对象?
可以!
封装(非常非常非常重要)
什么是封装?有什么好处?
隐藏事物的属性(成员变量)和实现细节,对外提供公共的访问方式
好处:
提高代码的安全性
提高代码的复用性
隐藏了实现细节
封装的原则是什么?
将不需要对外提供的属性都隐藏起来,然后提供公共访问方式
被private修饰的成员有什么特点?
(1)只能在本类中访问,在其他类中不能被访问
举例:
class Student{
private String name;
private int age;
//set / get方法
public void setName(String xingming){ //xingming = "张三"
name = xingming;
}
public void setAge(int nianling){
if(age < 0 || age > 100){
System.out.println("你设置不对,年龄没有负数!");
}else{
age = nianling;
}
}
//获取的也要书写
public void drive(){
System.out.println(name + "开车");
}
}
class Test{
public static void main(String [] args){
Student s = new Student();
// s.name = "张三"; //不允许这样访问,因为name已经被private修饰,所以无法在这个类中访问
//只能使用公开访问方式来赋值
s.setName("张三");
//s.age = -10;
s.setAge(-10);
}
}
封装指的就是private,这句话对吗?
不对,private只是封装的一种
(思考题)getter/setter方法一定要成对出现吗?
不一定要成对出现,可能以后开发中只需要设置,不需要获取,但是大部分情况下,都是成对出现,开发中几乎都是成对的.
分页技术:
this关键字
this关键字解决什么问题?有什么用?不用行不行?
如果不用,我们可以改变局部变量声明的那个变量名
this关键字是什么?用途是什么?
this代表当前对象的引用
用途: 区分成员变量和局部的重名问题
class Demo_this {
public static void main(String[] args) {
//this代表的就是当前对象,谁调用了方法,this就是谁
Student s = new Student();
s.setName("张三");
s.setAge(18);
s.drive();
}
}
class Student
{
//成员变量
private String name;
private int age;
//提供公共的访问方式
//set方法 没有学习this之前的做法
/*
public void setName(String xingming){
name = xingming;
}
public void setAge(int nianling){
age = nianling;
}*/
//使用this关键字后,方法就变得见名知意了,这个时候,用户更加清楚这个方法是干什么用!
public void setName(String name){ //张三
//区分成员变量名和局部变量名
this.name = name;
}
public void setAge(int age){
this.age = age;
}
//get方法
public String getName(){ //只是获取数据,不需要传入参数
return name;
}
public int getAge(){
return age;
}
public void drive(){
System.out.println(name + ".." + age + "在开车...");
}
}
案例
class Demo2_Phone {
public static void main(String[] args) {
Phone p1 = new Phone();
p1.setBrand("三星");
p1.setPrice(5288);
System.out.println(p1.getBrand() + "..." + p1.getPrice());
p1.call();
p1.sendMessage();
p1.playGame();
}
}
/*
手机类
属性:品牌brand,价格price
行为:打电话call,发短信sendMessage,玩游戏,playGame
*/
class Phone { //java bean
private String brand; //品牌
private int price; //价格
public void setBrand(String brand) { //设置品牌
this.brand = brand;
}
public String getBrand() { //获取品牌
return this.brand; //this.可以省略,你不加系统会默认给你加
}
public void setPrice(int price) { //设置价格
this.price = price;
}
public int getPrice() { //获取价格
return price;
}
public void call() { //打电话
System.out.println("打电话");
}
public void sendMessage() { //发短信
System.out.println("发短信");
}
public void playGame() { //玩游戏
System.out.println("玩游戏");
}
}
课外补充
class Person_Demo {
//程序入口
public static void main(String[] args) {
//第一层 用户注册 MVC三层结构
Person p = new Person();
p.setName("张三");
p.setPhoneNum("188888888");
p.setPassWord("123456");
p.setEmail("8888@qq.com");
//第二层 需要调用service层传递数据 逻辑判断
//业务逻辑判断
//第三层 调用持久层ORM层 对数据的持久化操作 mysql数据库
String name = p.getName();
String phoneNum = p.getPhoneNum();
String password = p.getPassword();
String email = p.getEmail();
//使用持久化技术把这些数据存储到数据库表中 ---JDBC连接数据库
System.out.println("存储姓名:" + name);
System.out.println("存储手机号码:" + phoneNum);
System.out.println("存储密码:" + password);
System.out.println("存储邮箱:" + email);
}
}
class Person
{
private String name;
private String phoneNum;
private String password;
private String email;
public void setName(String name){
this.name = name;
}
public void setPhoneNum(String phoneNum){
this.phoneNum = phoneNum;
}
public void setPassWord(String password){
this.password = password;
}
public void setEmail(String email){
this.email = email;
}
public String getName(){
return name;
}
public String getPhoneNum(){
return phoneNum;
}
public String getPassword(){
return password;
}
public String getEmail(){
return email;
}
}