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等等
所以大家别烦分不清一个流到底是节点流还是处理流,看他前缀是名词还是动词就行了
手敲不易,所以有帮助请左上角走一波

posted @ 2022-01-22 16:54  YR_3  阅读(21)  评论(0)    收藏  举报