我的java学习笔记
java学习笔记
课前预备
-
要注意代码能力
-
面向对象分析能力
-
内存底层和源码分析习惯
-
调试和查错能力
javaSE
: java standard edition即是java的基础
面向对象进阶是难点,不要慌
表格思想:普通表,多表关联,查询表
类与对象:表结构(表头)对应类,一行数据对应对象。用C语言对比,类就是结构体,对象就是一个结构体变量
如何准备简历、面试
绝对不能抄,态度很重要。
基本信息,专业技能,求职意向(想当什么投什么),详细的工作履历项目经验(要出彩),曾获奖励,自我评价
奖学金也是奖励啊,注意去拿。
接到面试电话,要查询对方公司信息以及业务,做面试准备(公司行业是否有前景,公司历史和结构,公司产品和项目)
投简历时看招聘信息,看什么条件优先
研究该公司产品:用户群体,pc与app端功能比较,对比同类产品
面试官喜欢什么样的人
- 秉性良好,谈吐正常(表现
- 精心自我介绍,突出实践经验
- 看起来成熟,大方,无小动作
- 干净整洁
- 不说任何人坏话,会把事情搞砸
- 工作态度端正,工作认真的人
- 是否以公司事务为重
- 加班,看你的技术地位,需要就该加
- 大大方方谈薪水,要觉得自己值这个钱
- 热爱职业,有职业规划
- 工作快乐
- 至少规划三年合理的职业规划,不放大不缩小
- 热爱学习,喜欢提升自己
- 利用业余时间参加职业培训
- 最近对新技术感兴趣,与面试官感兴趣
技术面试不该问
- 工资,五险一金
- 加班
- 面试结果,别问能不能上
必须问的一个:面试官问:您还有问题吗?
问产品问题,技术问题,贵司的解决方案如何
软实力
硬实力是技术能力,长期慢慢提高
软实力是沟通、管理能力
是职场晋升的关键,要注意训练,短时间可以提高
- 基础实力(形象气质,声音魅力)决定人生基础
- 人际沟通(沟通力,说服力)决定能否到中层
- 领导能力(情商,影响力,逆境能力)决定能否晋升高层
训练声音魅力
Java背景
1995年研发出来,核心优势:跨平台
14年推出JavaSE8.0,这是大部分企业用的版本
JavaSE:标准版,定位在pc上应用
JavaEE:企业版,定位服务端应用
Java的优点:简单性、高性能、分布式、多线程、健壮性
Java的运行机制
Java是解释型和编译型语言的结合,编译器把*.java
编译为字节码文件.class
然后用java虚拟机来解释
JVM(Java Virtual Machine)就是虚拟机,不同系统有不同虚拟机,来实现跨平台
JRE(Java Runtime Environment)包含:java虚拟机、库函数、运行java程序必须文件
JDK(Java Development Kit)包含JRE,多了编译器,调试器
第一个java程序
JDK的安装
下载jdk安装
配置path环境变量
-
新建系统变量:JAVA_HOME:C:\Program Files\Java\jdk-16.0.2
-
在Path添加JAVA_HOME\bin
-
calsspath问题:如果jdk1.5以上就不用管
cmd用java -version
看安装版本
Hello World
- java必须有一个源文件包含public static void main(String args[])方法。这个类成为应用程序的主类
编译:生成一个*.class文件
javac 文件名.java
运行:
java 文件名
//Hello.java
public class Hello {
public static void main(String args[]) {
System.out.println("Hello world!");
}
}
分析:
-
一个源文件至多声明一个public类,其他的类不限个数
-
public class 文件名 {}:类名称与文件名保持一致
-
编译一个.java时,有多少class就会编译出多少字节码文件
-
主方法定义:
public static void main(String args[]){
//从这里开始执行
}
主方法所在的类叫为“主类”,都将采用public class来定义
-
系统输出
System.out.println("");//输出后换行 System.out.print("");//输出后不换行
java使用小规范
- 命名规范
- 包的命名:全部小写(com.blue)
- 类的命名:每一个单词首字母大写(HelloWorld)
- 方法和变量的命名——驼峰原则:首字母小写,后面单词首字母大写(getName)(get)
- 常量的命名:全部大写,常加入下划线(MAX_VALUE)
补充一个文档注释
以/**
开头,以*/
结尾,包含一些JavaDoc标签
/**
*@author 我
*@version 1.01
*/
java采用Unicode字符集,汉字和英文字母一样都是普通字符甚至可以中文变量名
基础语法
变量&常量
-
局部变量:声明在方法内
- 没有默认值,要手动初始化
-
实例变量:声明在类里面
-
类变量(静态变量):当常量用
-
用static关键字声明,也在类里面
-
与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
-
默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。
public static double pi = 3.14;
-
-
常量:只能初始化一次
final double PI = 3.14;
内置数据类型
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte:
- 最小值是 -128(-2^7);最大值是 127(2^7-1);
- 默认值是 0;
- 只有 int 类型的四分之一;
short:
- 最小值是 -32768(-2^15);最大值是 32767(2^15 - 1);
- 是int型变量所占空间的二分之一;
- 默认值是 0;
int:
- 最小值是 -2,147,483,648(-2^31);最大值是 2,147,483,647(2^31 - 1);
- 一般地整型变量默认为 int 类型;
- 默认值是 0 ;
long:
- 最小值是 -9,223,372,036,854,775,808(-2^63);最大值是 9,223,372,036,854,775,807(2^63 -1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是 0L;
- 例子:long a = 100000L,Long b = -200000L;
"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
float:
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;-3.403E38~3.403E38
- float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是 0.0f;
- 例子:float f1 = 234.5f。
double:
-
double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;-1.798E308~1.798E308
-
浮点数的默认类型为 double 类型;
-
double类型同样不能表示精确的值,如货币;
-
默认值是 0.0d;
-
例子:
double d1 = 7D ;double d2 = 7.; double d3 = 8.0; double d4 = 8.D; double d5 = 12.9867;
7 是一个 int 字面量,而 7D,7. 和 8.0 是 double 字面量。
boolean:布尔型
- 只有两个取值:true 和 false;
- 默认值是 false;
char:
- char 类型是一个单一的 16 位 Unicode 字符;
- 最小值是 \u0000(十进制等效值为 0);最大值是 \uffff(即为 65535);
- char 数据类型可以储存任何字符;
有关整型的表示方法
byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。当使用字面量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制, 例如:
int ba = 05;int shiliu = 0x15;int bina = 0B101011;//43long loong = 10180000000L;
语法小tips
补充一下我不知道的就是了
- String类可以直接用+号连接,如果是char就没法加成字符串,不过可以有个强制类型转换的思路:
char c1 = 'a',c2 = 'b';System.out.println(""+c1+c2);
不仅如此甚至可以连接数字
int num = 666;System.out.println("num = " + num);
-
System.out.println()
里面不传参就是打印回车啊 -
Java的String不是
char []
,而是char *
。如果使用==
来做比较,其实是比较两个指针的值。所以我们一般使用
if(a.equals(b))
来比较是否相等 -
实参形参:小小复习一下,形式参数是函数传进来用的变量名称,实际参数是调用时传入的值
-
重载(overload):写C++的时候遇到过,就是换个形式参数定义的同名函数,就是同名的不同函数
-
在java中计算运行时间:使用
System.currentTimeMillis()
来返回一个当前时间,用前后两个量相减就可以得到运行时间,单位毫秒
简单的键盘输入
使用Scanner类获得键盘输入
import java.util.Scanner;public class demo{ public static void main(String args[]){ Scanner s = new Scanner(System.in); System.out.println("输入一行:"); String s1 = s.nextLine();//使用nextLine方法读到一行 System.out.println("读到了"+s1); System.out.println("输入月薪(单位:k)"); int s2 = s.nextInt(); System.out.println("年薪为:" + s2 * 12 + 'k'); }}
使用s.next()
读一个单词,s.nextLine()
读一行,s.nextInt()
读一个数字。
使用s.hasNextXxx()
来判断是否还有输入
System.out.println("接下来请输入数字");if(s.hasNextInt()) { System.out.println("诶,对");} else { System.out.println("啥卵,不识字吗");}
千万别忘了在使用前导入类:import java.util.Scanner;
nextInt()后使用nextLine()跳过的解决办法
输入数字后,我们按下回车键,这时候nextInt()把缓冲区的数字读走了,留下了换行符,用nextLine()的时候把换行符读走了,所以形成了跳过的错觉。如果还要往下读入,应该先使用一个nextLine()把换行符读掉
第一个Java项目
- 通过idea创建一个项目,在project structure里选择你的JDK
桌球游戏小项目
需要import两个东西
import java.awt.*;import javax.swing.*;
在主类的命名后面加上extends JFrame
,这样可以直接使用setSize()等方法
package com.ty01;import java.awt.*;import javax.swing.*;public class BallGame extends JFrame{ Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png"); Image table = Toolkit.getDefaultToolkit().getImage("images/table.jpg"); //当然这里你需要现在项目根目录下创建images文件夹,然后导入这两个图片文件 double x = 200;//设置位置 double y = 200; int spd = 15;//速度 double degree = 3.14 / 3;//弧度制的60度 //绘制窗口 public void paint(Graphics g){ System.out.println("画了一次窗口"); g.drawImage(table,0,0,null); g.drawImage(ball,(int)x,(int)y,null); x += spd * Math.cos(degree);//初中数学 y += spd * Math.sin(degree); //判断上下边界,500是窗口高度;40是桌子边框,30是球直径;最后一个40是标题栏的高度 if(y > 500-40-30 || y < 40+30) degree = -degree;//关于x轴对称就是相反数 //判断左右边界 if(x > 856-30-40 || x < 40) degree = 3.14 - degree;//关于y轴对称就是补角 } //创建窗口 void launchFrame(){ setSize(856, 501); setLocation(100,100); setVisible(true); //实现动画,每秒绘制窗口25次 while(true){ repaint(); try { Thread.sleep(25);//1000ms / 25 = 40ms } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args){ System.out.println("我的小游戏开始了!"); BallGame game = new BallGame(); game.launchFrame(); }}
10步天才思维
- 学习目的
- 是什么用在哪里
- 如何使用
- 深度思维:模拟设计者思维过程
- 广度思维:类比其他概念
- 广度思维:练习已知,底层原理分析
- 广度思维:类比生活中的例子
- 可视化辅助和分析
- 不足
- 创新改进,新组合
面向对象
以一个表格为例,表头是类,表中一行数据是对象,所有对象都有的动作就是方法。
C/C++中类和结构体的区别:(以前的疑惑)
- 结构体使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)(栈的空间相对较小.但是存储在栈中的数据访问效率相对较高)
- Struct变量使用完之后就自动解除内存分配,Class实例有垃圾回收机制来保证内存的回收处理。
- 轻量对象,结构的成本较低。 在表现抽象和多级别的对象层次时,类是最好的选择。
面向过程和面向对象的区别:
- 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了
- 面向对象就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
- 如果是面向对象的设计思想来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
对象是类的实例
一个类有:属性(成员变量),方法,构造方法(构造方法和类名一样,没有返回值,可以省略)
创建一个类:
class testclass{ int id, num;//属性 public void amethod() { System.out.println("this is a test class");//方法 } testclass(){}//构造方法}
如果写在public class 主方法里,注意一个静态方法不能调用动态方法,所以要加static
定义小的类 一般写在最外面
一个类中,不同对象的属性用的不同内存,但方法是用的同一段内存
构造方法(构造器)
-
通过new关键字调用
-
方法名和类名一致
-
返回值是本类,不能自定义返回值
-
不写的话,编译器自动定义一个无参的构造方法