java学习笔记

 

 

课前预备

  • 要注意代码能力

  • 面向对象分析能力

  • 内存底层和源码分析习惯

  • 调试和查错能力

javaSE: java standard edition即是java的基础

面向对象进阶是难点,不要慌

表格思想:普通表,多表关联,查询表

类与对象:表结构(表头)对应类,一行数据对应对象。用C语言对比,类就是结构体,对象就是一个结构体变量

如何准备简历、面试

绝对不能抄,态度很重要。

基本信息,专业技能,求职意向(想当什么投什么),详细的工作履历项目经验(要出彩),曾获奖励,自我评价

奖学金也是奖励啊,注意去拿。

接到面试电话,要查询对方公司信息以及业务,做面试准备(公司行业是否有前景,公司历史和结构,公司产品和项目)

投简历时看招聘信息,看什么条件优先

研究该公司产品:用户群体,pc与app端功能比较,对比同类产品

面试官喜欢什么样的人

  • 秉性良好,谈吐正常(表现
    • 精心自我介绍,突出实践经验
    • 看起来成熟,大方,无小动作
    • 干净整洁
    • 不说任何人坏话,会把事情搞砸
  • 工作态度端正,工作认真的人
    • 是否以公司事务为重
    • 加班,看你的技术地位,需要就该加
    • 大大方方谈薪水,要觉得自己值这个钱
  • 热爱职业,有职业规划
    • 工作快乐
    • 至少规划三年合理的职业规划,不放大不缩小
  • 热爱学习,喜欢提升自己
    • 利用业余时间参加职业培训
    • 最近对新技术感兴趣,与面试官感兴趣

技术面试不该问

  1. 工资,五险一金
  2. 加班
  3. 面试结果,别问能不能上

必须问的一个:面试官问:您还有问题吗?

问产品问题,技术问题,贵司的解决方案如何

软实力

硬实力是技术能力,长期慢慢提高

软实力是沟通、管理能力

是职场晋升的关键,要注意训练,短时间可以提高

  1. 基础实力(形象气质,声音魅力)决定人生基础
  2. 人际沟通(沟通力,说服力)决定能否到中层
  3. 领导能力(情商,影响力,逆境能力)决定能否晋升高层

训练声音魅力

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关键字调用

  • 方法名和类名一致

  • 返回值是本类,不能自定义返回值

  • 不写的话,编译器自动定义一个无参的构造方法