黑马java课程
Posted zhangbo2008
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了黑马java课程相关的知识,希望对你有一定的参考价值。
课程叫做27天学通java零基础 java 安装: 必须装jdk-7u72-windows-i586.exe 注意必须安装32位的就是i586这个.因为x64的不向下兼容.会有意向不到的bug 配置Path的方法 1.直接写Path里面 2.或者先建立一个系统变量叫做JAVA_HOME 然后在Path里面写%JAVA_HOME%in;即可. jdk1.5之后不用配置classpath了! 最好也不要配置这个classpath,因为不灵活.一旦你在别处放class就bug! path和classpath的区别: path记录的是如可执行文件的位置, dos里面运行可执行文件时候,现在当前目录找,如果没有就进入path目录里面寻找. classpath是把.class文件放的位置. 故人西辞富士康 为学技术去蓝翔 蓝翔毕业包分配 你妈还是富士康 2018-11-23,21点19 学习流程: 先看27天学通java 零基础 然后看java web 24天.这些视频 goto 和const也都是关键字,不能作为名字 包名命名: com.heima.包的作用 单引号中只能放单个字符,单个数字或者单个符号.不放也不行. 因为,把正数的首尾改成1表示负数后,两个数相加不是0.所以引入补码计算法. Long x=888888888L 表示强类型转换成Long System.out.println(12345+5432l); 注意上面最后的不是1而是L的小写. 所以最后加L强制转换最好加L,因为l太像1了. 如果非要区分注意l的横是平的,1的横是向下的. 只要是float f=12.3F; 后面的F是必须的,否则会识别成double类型. 经典题: byte b=(byte)(126+4) System.out.println(b);//打印-126 分析,首先b等于130 因为是b所以 是2进制 1000 0010 这个数字. 首位是1所以他表示的是负数. 注意计算机中存的数都是按照补码来存的!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!. 所以需要把这个麻求他的源码也就是 1000 0001 取反 1111 1110 除去首位符号位,就是111 1110 这个用windows 自带的计算器切换到程序员模式, 选2进制,输入111 1110即可,看到在dex 10进制模式下输出的就是126,所以算上符号位,我们最后输出的结果是-126! 下面我们算byte b2=(byte)300; System.out.println(b2) 1.byte 与byte进行运算时候会提升为int 2.float 占4个字节,32个二进制位 1位是符号位, 8位指数为 其中0代表0 255代表无穷大,1-254表示指数 表示-126到127 23位是尾数为 浮点型数据类型,FLOAT 数据类型用于存储单精度浮点数或双精度浮点数。浮点数使用 IEEE(电气和电子工程师协会)格式。浮点类型的单精度值具有 4 个字节,包括一个符号位、一个 8 位 excess-127 二进制指数和一个 23 位尾数。尾数表示一个介于 1.0 和 2.0 之间的数。由于尾数的高顺序位始终为 1,因此它不是以数字形式存储的。 所以最大是2.0^127次幂.也就是尾数表达数字的指数表达数字次幂!!!!!!!!!! double 最大是2^1024 字符串与任何相加都得到的是看做2个字符串相加结果! 2018-11-24,13点08 还是用vs code好,首先sublime的编码问题非常麻烦,第二sublime不支持调试,第三sublime写c++写java对于input都不支持.第四:运行各种文件还需要切换编译器,vscode自动能识别,加断电也非常方便. java里面char可以保存一个中文,因为java的编码默认是utf-8 比如char i=‘中‘;可以的 int x=4; int y=(x++)+(++x)+(x*10); 答案y=70 当byte与int进行混合运算,赋值给int会损失精度报错 但是byte类型用++可以.因为系统会自动强制转换. 相同的道理 short s=1;s+=1; System.out.println(s);可以运行, 道理一样.也是+=1是一个运算符,java内部自动加了一个强制转换符. 性质a与b异或2次那么答案是a if 语句如果后面不写大括号,那么有意想不到的bug, 他只控制他后面的一句话,但是如果后面写int x=10;这种句子不行. 因为他表示的是2句话.但是加上大括号就可以了. 分好和大括号.有大括号就不写分号,有分号就不写大括号. 例如: if (age>10){int x=10;} if (age>10) x=3; for (int i=1;i<=10;i++){ System.out.println(i); } System.out.println(i); 注意for 语句执行完之后就析构i这个变量了.所以外面的print(i)是没有用的. 但是while循环后,里面的变量不会清空,还是存在的! 这就是标号的作用!!!!!!!!!!!!!! 下面一个点是很有用的Mark 来跳出外层循环. import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Main { public static void main(String[] args) { outer: for (int i = 1;i <= 10 ;i++ ) { //a就是标号,只要是合法的标识符即可 System.out.println("i = " + i); inner: for (int j = 1;j <= 10 ;j++ ) { System.out.println("j = " + j); break outer; } } } } 输出结果是i=1 j=1.用法:就是在for循环的左边写上outer: 然后break后面跟上outer;即可.就能直接跳出外层循环. 数组的初始化值: byte,short,int,long默认都是0 浮点型默认都是0.0 布尔类型都是false char默认是‘u0000‘ 引用类型的默认是null.比如二维数组,里面每一个一维数组默认值就是null 如果直接打印数组的名字那么返回类似一个 [[email protected] 这个理解:[表示是一个数组,几个括号[就代表几维数组, I表示内容是int @没用 后面的是16进制的地址值 java内存的分配 栈(局部变量),堆(数组和对象),方法区,本地方法区,寄存器 数组的写法: int []arr=new int[]{11,22,34,44,56}; int []arr2={11,22,33,44,55};这个是简写模式,这个模式声明和赋值之不能写在一行.否则报错. 这个java课程是黑马教育. 当数组引用赋值为null之后,再去调用数组中元素,就会出现NullPointerException 空指针异常. 下面写一个二维数组的内存分配流程: 首先把main函数压栈 之后调用int[][]arr=new int[3][2]; 压入main这个子块里面. 之后堆中开辟3个null组成的连续块, 之后这3个null分别变成一个地址. 每一个地址表示堆中开辟的1个长度为2的连续空间的地址.这个空间就是一维数组,还是上来都是0,然后随着赋值运算把0替换成赋值的数. 运行Car c1=new Car(); 时候先在方法区建立Car这个类的Car.class 才能调用这个c1语句建立c1. 引用数据类型的总结: 数组,类,接口,枚举 匿名对象 Car c1=new Car();就是普通的创建对象 new Car.run();就是匿名对象的调用方法. 被public的可以被类外面访问 被private的只能被类内部访问. 经典的public private例子: class Person{ String name; private int age; public void setAge(int a){ age=a; } } 这个例子就是常用的套路,把数据前面写上private,来限制这个类外面直接用等号来定义这个属性的值.用一个public函数来访问这个privat值来修改,这样更安全. 这就是封装的意义.用private来限制使用.更安全. this应用场景,用于区分局部变量和成员变量重名. 构造方法不能被对象调用. 当给与了有参数的构造,那么系统的无参构造自动不给了,所以如果写了有can的构造方法,那么无参的构造方法也要写上!防止bug 修改属性值,开发中用setXXX函数更多,因为他更灵活! 静态static关键字的特点 1.随着类的加载而建立 2.优于对象存在 3.被所有对象共享. 注意静态方法不能访问非静态变量! 构造代码块(对象创立就运行,优先于构造函数,比静态代码块靠后执行),静态代码块(随着类的加载而加载,且优先于主方法执行,类记载过了就不运行了,所以只运行一次), 开发原则: 高内聚,低耦合 尽量自己完成自己的事情,减少对其他类的依赖! 继承类的构造方法: 一定会继承父类的构造方法! 证明: 原因是默认会有一句super(); 如果写this(可以加参数);表示利用自己的其他不含参数构造方法,但是如果所有都用this就会死循环bug,所以至少有一个不用this才可以,所以super()始终要运行一次. 经典习题: class Test2_Extends { public static void main(String[] args) { Zi z = new Zi(); } /* 1,jvm调用了main方法,main进栈 2,遇到Zi z = new Zi();会先将Fu.class和Zi.class分别加载进内存,再创建对象,当Fu.class加载进内存 父类的静态代码块会随着Fu.class一起加载,当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载 第一个输出,静态代码块Fu,第二个输出静态代码块Zi 3,走Zi类的构造方法,因为java中是分层初始化的,先初始化父类,再初始化子类,所以先走的父类构造,但是在执行 父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的所以 第三个输出构造代码块Fu,第四个输出构造方法Fu 4,Fu类初始化结束,子类初始化,第五个输出的是构造代码块Zi,构造方法Zi */ } class Fu { static { System.out.println("静态代码块Fu"); } { System.out.println("构造代码块Fu"); } public Fu() { System.out.println("构造方法Fu"); } } class Zi extends Fu { static { System.out.println("静态代码块Zi"); } { System.out.println("构造代码块Zi"); } public Zi() { System.out.println("构造方法Zi"); } } 很经典的题目: 顺序总结:先是所有的静态代码块按照父子顺序跑完,然后跑构造代码块父构造函数父,最后是构造代码块子构造函数子. 记忆当然很麻烦.分析原则.记住原则自己分析才实用性强. 1.首先是先有类才有对象,所以类必须都生成完毕才能走对象的构造. 所以静态代码块优于一切 2.之后才是对象的建立,涉及到构造函数,这时候先父全弄完才能弄子的. 3.对于父的对象建立,需要先构造代码块再构造函数.因为构造代码块的目的就是在构造函数之前做点什么. vscode还有好处是按住ctrl左键点一下就能找到这个变量的定义位置. 林夕和鸟就是梦鸽 唱红歌搞定林夕和鸟女士 final 修饰类,那么他就不能有子类 final修饰方法,那么他的子类就不能重写这个方法. final修饰变量,那么他就是常量.一般写法是public static final NUM=3.14 重载叫类内部自己写重名的来覆盖之前类里面写的函数. 多态里面蛋疼的: 成员变量: 编译看左边(父类),运行看左边(父类) 成员方法: 编译看左边(父类),运行看右边(子类),这个叫动态绑定 但是静态方法.就算不上重写.还是 编译看左边(父类),运行看左边(父类) ClassCastException 类型强制转化异常. 利用instanceof来判断再保证转化的正确. 抽象类可以由非抽象方法. 为甚么要用抽象类,因为设置抽象类就是设置了限制. 定义好抽象类,那么写的子类就必须继承这些规则.达到了项目限制员工的功能. 面试题: 一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?答案:可以,这么做的目的只有一个,就是不让其他类创建本类的对象. 面试题2: abstract和那些关键字不能共存? 1.abstract和static不能共存. 因为abstratct修饰的方法没有方法体.所以static没意义 2.不能和final共存. 因为final没法继承.但是abstract必须被继承 3.private也不行 因为继承的访问问题.同上 接口的含义:对外提供一种规则的就叫接口. 一流公司卖接口 2流公司卖品牌 3流卖服务 接口一般用法:#跟抽象类用法都一样! class Demo1_Interface{ public static void main(String[] args){ Inter i=new Demo(); i.print(); } } interface Inter{ public abstract void print(); } class Demo implements Inter{ public void print(){//这行的声明必须public System.out.println("print"); } } 但是:接口里面的变量都是publi static final 的 包的使用: package com.heima;//必须写在第一行.只能写一个,开发项目必须写.把class文件放这个目录下 //带包的类的运行方法,在com统计目录时候cmd打开输入 java com.heima.Demo1.class 方便生成.class和文件夹的方法,直接在目录中 cmd 输入javac -d . Demo1.java 包的控制例子: package com.heima; import com.baidu.Person; class Demo1_package{ public static void main(String[] args){ Person p=new Person("张三",23); } }
以上是关于黑马java课程的主要内容,如果未能解决你的问题,请参考以下文章