Day_02
java中形参的传递方式
不管是基本数据类型还是引用数据类型,java中方法参数的传递方式都为值传递,直接把数值复制一份作为形参。看下面的例子
public class Fun {
public static void main(String[] args) {
int i=0;
String str = "hello";
Fun fun = new Fun();
fun.fun(i);
fun.fun(str);
System.out.println(" "+i+" "+str);
}
void fun(int i){
i++;
}
void fun(String str){
str = "word";
}
}
输出结果:
0 hello
int基本数据类型,保存的就是数值,形参为实参的副本,形参改变不影响实参。
String为引用数据类型,保存的是String对象的物理地址,形参为副本,也指向了这个地址,所以形参改变其中的物理地址不影响实参。
java中的i++,++i
i++ 即后加加,原理是:先自增,然后返回自增之前的值(而不是先返回,后自增)
++i 即前加加,原理是:先自增,然后返回自增之后的值
一个变量也是表达式,多个表达式的加减法运算都是从左到右进行的
例子:
int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++;
System.out.println(k); // 结果:8
表达式从左往右计算
i++ 先自增,返回之前的数值,1+... 此时 i=2;
++i 先自增,返回之后的数值,1+3+... 此时i=3;
++j 先自增,返回之后的数值,1+3+2+... 此时j=2;
j++ 先自增,返回之前的数值 1+3+2+2 此时j=3;
例子二:
int i = 0;
i = i++;
System.out.println("i = " + i); // 结果:0
i++ 先自增,返回之前的数值
参考博客地址:https://blog.csdn.net/android_cai_niao/article/details/106027313
java中final方法的继承
我们知道final修饰的方法是不能被重写的,但是请看下面一个例子:
class Car extends Vehicle
{
public static void main (String[] args)
{
new Car(). run();
}
private final void run()
{
System. out. println ("Car");
}
}
class Vehicle
{
private final void run()
{
System. out. println("Vehicle");
}
}
输出结果为:Car
解释:final修饰的方法不能被重写,例子中,父类run方法为private 不能被子类继承,故子类中的run方法没有重写父类fun方法,new Car(). run();调用的是子类方法
java中==和equals
== 基本数据类型比较的是数值,引用数据类型比较的是地址
equals和==一样,String Integer 中equals能比较引用数据类型的数值是因为方法被重写了。
String和常量池
2.String对象的两种创建方式:
(1)第一种方式: String str1 = "aaa"; 是在常量池中获取对象("aaa" 属于字符串字面量,因此编译时期会在常量池中创建一个字符串对象,如果常量池中已经存在该字符串对象则直接引用)
(2)第二种方式: String str2 = new String("aaa") ; 一共会创建两个字符串对象一个在堆中,一个在常量池中(前提是常量池中还没有 "aaa" 象)。
System.out.println(str1==str2);//false
3.String类型的常量池比较特殊。它的主要使用方法有两种:
(1)直接使用双引号声明出来的String对象会直接存储在常量池中。
(2)如果不是用双引号声明的String对象,可以使用 String 提供的 intern 方法。 String.intern() 是一个 Native 方法,它的作用是: 如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用; 如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。
String s1 = new String("AAA");
String s2 = s1.intern();
String s3 = "AAA";
System.out.println(s2);//AAA
System.out.println(s1 == s2);//false,因为一个是堆内存中的String对象一个是常量池中的String对象,
System.out.println(s2 == s3);//true, s1,s2指向常量池中的”AAA“
4字符串拼接:
String a = "a";
String b = "b";
String str1 = "a" + "b";//常量池中的对象
String str2 = a + b; //在堆上创建的新的对象
String str3 = "ab";//常量池中的对象
System.out.println(str1 == str2);//false
System.out.println(str1 == str3);//true
System.out.println(str2 == str3);//false
一些命令
1、jps:查看本机java进程信息。
2、jstack:打印线程的栈信息,制作线程dump文件。
3、jmap:打印内存映射,制作堆dump文件
4、jstat:性能监控工具
5、jhat:内存分析工具
6、jconsole:简易的可视化控制台
7、jvisualvm:功能强大的控制台
匿名内部类
匿名内部类的创建格式为:
new 父类构造器(参数列表)|实现接口(){
//匿名内部类的类体实现
}
使用匿名内部类时,必须继承一个类或实现一个接口(不能同时)
匿名内部类由于没有名字,因此不能定义构造函数
匿名内部类中不能含有静态成员变量和静态方法
例子:
public static void main(String[] args) {
Thread thread = new Thread(){
@Override
public void run() {
System.out.println("Hello Word");
}
};
thread.start();
}
构造方法
super和this都只能位于构造器的第一行,而且不能同时使用,这是因为会造成初始化两次,this用于调用重载的构造器,super用于调用父类被子类重写的方法
this() 用来调用本类的其他构造方法。让构造方法中的代码可以被使用。 ()里面可以是实参。通过实参与形参的匹配从而决定使用那个构造方法。它只能使用在构造方法里面
接口
接口中每一个方法也是隐式抽象的,接口中的方***被隐式的指定为 public abstract (只能是 public abstract,其他修饰符都会报错)
修饰符只能更大,(更public)返回值和异常只能更小(更子类)
perivate修饰符
public class Test
{
private int a=10;
int b=20;
static int c=1;
public static void main(String arg[])
{
Test t = new Test();
}
}
A选项:t.a
A : 在private 修饰不能在外部类中调用,main 方法属于Test类的方法, 所以 对象 t 可以在他自己的类方法中调用它的private
B : static 方法中没有this 这么一说
节点流和处理流
InputStream是一个基本的输出流类
这里"基本的",其实就是将流分为节点流和处理流,而“基本的”是表示节点流
所以C选项可以看成:InputStream是属于节点输出流;
所以我们就要判断InputStream是节点流还是处理流,是输出流还是输入流
这就涉及到哪些是节点流,哪些是处理流了,而且很明显,他是一个输入流
节点流:
FileInputStream,FileOutputStrean,FileReader,FileWriter
StringReader,StringWriter
ByteArrayInputStream ,ByteArrayOutputStream ,CharArrayReader
PipedInputStream PipedOutputStream PipedReaderPipedWriter
处理流:
BufferedInputStrean,BufferedOutputStream,BufferedReader,BufferedWriter
InputStreamReader,OutputStreamReader
DataInputStream,DataOutputStream
PrintWriter
不知道大家发现没有,节点流的前缀都是名词,如File,String,Char等;处理流的前缀都是动词,如input,print,bufferd等等
所以大家别烦分不清一个流到底是节点流还是处理流,看他前缀是名词还是动词就行了
手敲不易,所以有帮助请左上角走一波

浙公网安备 33010602011771号