该复习笔记是基于传智播客的Java基础视频-深入简出精华版,链接: https://pan.baidu.com/s/1bp7NuOJ,建议刚刚入门的小白不要看,因为涉及太多的细节了,看多了反而让你容易放弃Java之路,刚刚入门的小白推荐下面这一套视频-链接:https://pan.baidu.com/s/1pLuAj5x
博主声明一下:我不是传智播客的什么托,只是一个菜鸟,现在在补着Java基础,搞了一套传智播客的Java视频以及Android视频,所以笔记可能会常出现这些字眼,请言语讽刺我是托的麻烦你闭嘴哈
JAVA之旅(一)——基本常识,JAVA概念,开发工具,关键字/标识符,变量/常量,进制/进制转换,运算符,三元运算-博客-云栖社区-阿里云
D:常量
字面值常量
其中较为特殊的是:
字符常量 用单引号括起来的内容,里面只能放单个数字,单个字母或单个符号
空常量 null(数组部分讲解)
自定义常量(面向对象部分讲)
B:有符号数据表示法的几种方式
「C基础」位运算 - Liquor - 博客园
参考技术好文章:Java基础案列斥候7300新浪博客
注意事项:
- 进行混合运算的时候,byte,short,char不会相互转换,都会自动类型提升为int类型,其他类型进行混合运算的是小的数据类型提升为大的
byte,short,char – int – long – float – double- 任何数据类型用+与字符串相连接都会产生新的字符串
- System.out.println(“hello”+’a’+1); //运算结果:helloa1
- System.out.println(‘a’+1+”hello”); //运算结果:98hello
||跟|区别和上面的一样的意思,虽然最终结果是一样的,但||左边是true,右边就不执行了
Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^) - 坦GA的博客 - CSDN博客
位运算符^的特点:一个数据对另一个数据位异或两次,该数本身不变。
/*
* 位异或运算符的特点
* ^的特点:一个数据对另一个数据位异或两次,该数本身不变。
*/
//System.out.println(5 ^ 10 ^ 10); //结果是5
//System.out.println(5 ^ 10 ^ 5); //结果是
/*
* 请自己实现两个整数变量的交换(不需要定义第三方变量)
* 注意:以后讲课的过程中,我没有明确指定数据的类型,默认int类型。
*/
int x = 10;
int y = 5;
//需要第三方变量,开发推荐用这种
/*int temp;
temp = x;
x = y;
y = temp;*/
//不需要定义第三方变量,有弊端,有可能会超出int的取值范围
/*x = x + y; //10 + 5 = 15
y = x - y; //15 - 5 = 10
x = x - y; //15 - 10 = 5*/
//不需要第三方变量,通过^来做
x = x ^ y; // 10 ^ 5
y = x ^ y; // 10 ^ 5 ^ 5 y = 10
x = x ^ y; // 10 ^ 5 ^ 10 x = 5
基本数据类型可以接收byte,short,char,int
引用数据类型可以接收枚举(JDK1.5),String字符串(JDK1.7)
[I@19bb25a
[代表是数组,几个就代表几维
I代表是int类型
@是固定的
19bb25a代表的是数组的地址值
引用数据类型的值传递,改变原值,因为即使方法弹栈,但是堆内存数组对象还在,可以通过地址继续访问
Java中到底是传值还是传址?
1,既是传值,也是传地址,基本数据类型传递的值,引用数据类型传递的地址
2,java中只有传值,因为地址值也是值(出去面试都说这种,支持者是高司令(java之父))
D:初始化值不同
注意事项:
Java面向对象思想和三大特性:java面向对象思想和三大特性 - 黑马飞的博客 - 博客频道 - CSDN.NET
B:为什么呢?
所以,子类初始化之前,一定要先完成父类数据的初始化。
其实:
A:方法重写注意事项
c:父类静态方法,子类也必须通过静态方法进行重写
子类重写父类方法的时候,最好声明一模一样。
A:方法重写的面试题
方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的
方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。
子类对象调用方法的时候:
B 多态前提
C 访问成员变量和成员方法的区别
D 向上转型和向下转型
abstract不可以和static,final,private等共用
* A 抽象类的成员特点
* a 成员变量:可以是变量也可以是常量,abstract不可以修饰成员变量
* b 构造方法:有(每个类都有一个默认的构造方法,无论类是否抽象)
* c 成员方法:可以是抽象方法(强制要求子类做的事情),也可以是非抽象方法的(子类继承的事情,提高代码的 复用性,可以重写)
b:外部类要访问内部类的成员,必须创建对象。
外部类名.内部类名 对象名 = 外部类对象.内部类对象;(例如:Outer.Inner inner =new Outer(). new Inner();)
d:成员内部类被静态修饰后的访问方式是:
局部内部类在访问他所在方法中的局部变量必须用final修饰,为什么?
因为当调用这个方法时,局部变量如果没有用final修饰,他的生命周期和方法的生命周期是一样的,当方法弹栈,这个局部变量也会消失,那么如果局部内部类对象还没有马上消失想用这个局部变量,就没有了,如果用final修饰会在类加载的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
但是jdk1.8取消了这个事情,所以我认为这是个bug
B:本质是什么呢?
C:注意:
D:问题讨论
public static void main(String[] args) {
new Outer.Inter().interPrint();//成了静态内部类之后,我就可以像香港一样,有自己的对外贸易规则
Outer.Inter.sinterPrint();//sinterPrint是静态方法,类名可以直接调用
new Outer().outerPrint();
}
}
class Outer {
//因为Inter已经成为了静态内部类,所以outPrint方法static不显得重要了(核心:内部类就相当于一个类中的一个特殊属性)
public static void outerPrint() {
Inter inter = new Inter();
inter.interPrint();
}
static class Inter {
public void interPrint() {
System.out.println("我是内部类");
}
public static void sinterPrint() {
System.out.println("我是匿名内部类的静态方法");
}
}
}
注意:Scanner中的nextLine()是键盘录入字符串的方法,可以接收任意类型,遇到\r\n(回车换行)符号就证明是一行,接着结束
解决办法:
* A 创建多一个Scanner对象来录入String类型(这种方法不太建议)
Scanner sc1 = new Scanner(System.in);
int i = sc1.nextInt();
Scanner sc2 = new Scanner(System.in);
String line = sc2.nextLine();
关于常量池的理解:Java常量池的大概理解 - 请叫我大师兄 - 博客频道 - CSDN.NET
String str="abc";//"abc"可以看成是一个字符串对象
str="def"; //String类为final类型,一旦复制就不能改变了,但String是类,可以改变引用地址,此时"abc"就变成了垃圾
//计算机把{97,98...}按照二进制存储起来了
byte[] bytes={97,98,99,100,101};
//接着解码(按照我们编辑器的码表来解码),把{97,98...}等解码出来
String string = new String(bytes);
//将bytes数组的下标2开始(数组从下标0开始),转2个出来
String string1 =new String(bytes, 2, 2);
//常量池没有这个字符串对象,就创建一个,如果有直接用即可
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); //true
System.out.println(s1.equals(s2));//true
第二题:以下这句话在内存中创建了多少个对象?
//"abc"就是一个String对象(在常量池中创建),接着new String对象(在堆内存中创建一个)
String s1=new String("abc");
API文档:String(String original) 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
第三题:判断下面定义为String类型的s1和s2是否相等?
//常量池没有这个字符串对象,就创建一个,如果有直接用即可
String s1 = "abc";//在常量池中
String s2 =new String("abc");//在堆内存中
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2));//true
第四题:判断下面定义为String类型的s1和s2是否相等?
byte b1=3;
byte b2=4;
byte b3=b1+b2;//这里是变量里面的值相加,jvm无法知道里面的值是多少,所以可能会溢出的安全问题,所以需要强制
byte b4=3+4;//jvm有常量优化机制,在编译时候就变成了7,接着把7赋值给b4
String s1="a"+"b"+"c";//jvm常量优化机制,类似byte b4=3+4;
String s2="abc";
System.out.println(s1 == s2); //true,常量优化机制
System.out.println(s1.equals(s2));//true
第五题:判断下面定义为String类型的s2和s3是否相等?
String s1="ab";
String s2="abc"; //在常量池中
String s3= s1+"c";//在堆内存中
System.out.println(s2 == s3); //false
System.out.println(s2.equals(s3));//true
API文档:Java 语言提供对字符串串联符号(”+”)以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。
关于Java常量机制详解的文章:Java常量池的大概理解 - 请叫我大师兄 - 博客频道 - CSDN.NET
注意事项:
A “”跟null区别:
“”是字符串常量,同时也是一个String类的对象,既然是对象,当然可以使用String类的方法
null是空常量,不能调用任何的方法(要不然报NullPointerException),null常量可以给任意的引用数据类型赋值
B 使用equals方法时候注意:
String s1="woaini";
//如果是字符串常量和字符串变量相对,通常都是字符串常量调用方法,将变量当做参数传递,放置空指针异常
if ("admin".equals(s1)) {
System.out.println("字符匹配成功");
}
//Person p=new Person()的时候,其实就是相当于String s=p.toString(),
//toString没有重写的话就是调用Object类的toString方法,输出的包名@哈希值
String s=String.valueOf(p)
concat(String str)方法调用的和传入的都必须是字符串类型
+可以让字符串与任意类型相加,更为强大
链式编程:只要保证每次调用完方法返回的是对象,就可以继续调用
首先计算机按照String转为二进制存储起来,接着getBytes转为byte类型(参考的码表与平台采用的码表有关)
String s1="你好你好";
byte[] bytes = s1.getBytes();//通过gbk码表将字符串转成字节数组
for (byte b : bytes) { //编码:把我们看得懂的转为计算机看得懂的
System.out.print(b+" ");//gbk码表代表一个中文两个字节==一个char
//-60 -29 -70 -61 -60 -29 -70 -61 //gbk代表特点,中文第一个字节肯定是负数
}
String s1="你";
String s2="好";
int num1=s1.compareTo(s2);//20320-22909
System.out.println('你'+0);//20320,查找的是Unicode码表(Unicode包括ASCII码表)
System.out.println(s1+0);//你0
System.out.println('好'+0);//22909
System.out.println(num1);//-2589
渣渣算法:
// 需求:统计大串中小串出现的次数
//不管是黑马还是白马,主要跑得快,都是好马,虽然白马看起来比黑马弱小,但真正跑起来未必比黑马差
String max="buguanshiheimahaishibaima,zhiyaopaodekuai,doushihaoma,suirankanqilai,"
+ "baimabiheimaruoxiao,danzhenzhengpaoqilaibaimaweibibiheimacha";
String min="heima";
int count=0;//计算小串在大串中出现的次数
//判断小串是否在大串出现
if (max.contains(min)) {
//不需要到大串的最后一个索引
for (int i = 0; i <= max.length()-min.length(); i++) {
int index=0;
if ((index=max.indexOf(min))!=-1) {
count++;
max=max.substring(index+min.length());
}
}
}
System.out.println("heima出现的次数:"+count);
改进版算法:
// 需求:统计大串中小串出现的次数
//不管是黑马还是白马,主要跑得快,都是好马,虽然白马看起来比黑马弱小,但真正跑起来未必比黑马差
String max="buguanshiheimahaishibaima,zhiyaopaodekuai,doushihaoma,suirankanqilai,"
+ "baimabiheimaruoxiao,danzhenzhengpaoqilaibaimaweibibiheimacha";
String min="heima";//小串
int index=0;//索引位置
int count=0;//计算小串在大串中出现的次数
//indexOf找到就返回索引值,找不到就返回-1
while((index=max.indexOf(min))!=-1) {
count++;
//切割字符串,把统计入count的min(包括min)的字符串去除
max=max.substring(index+min.length());
}
System.out.println("heima出现的次数:"+count);
}
Java基础复习(二)链接:Java基础复习(二) - it菜鸟的飞行梦 - 博客频道 - CSDN.NET