Java基础篇

父类子类构造函数

子类的构造函数会隐式调用父类的无参构造函数,子类若想调用父类的构造函数需在子类的构造函数的第一行使用super调用父类的构造函数。

public class Person {

    private String name;

    public Person() {
        System.out.println("无参构造");
    }

    public Person(String name) {
        this.name = name;
        System.out.println("构造函数");
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

public class Student extends Person {
    private String sex;
    private String age;

    public Student() { }

    public Student(String name, String sex, String age) {
        super(name);
        this.sex = sex;
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
String、StringBuffer、StringBuilder

String字符串存储在字符串常量区,任何对String进行的修改都会产生一个新的对象,String是final的
StringBuffer和StringBuilder都是可变的,可以对同一个对象进行修改。区别是StringBuilder是线程不安全的,线程使用StringBuffer时会先对其加锁。

类不允许多继承,接口允许多继承

CopyOnWriteArrayList适用于写少读多的并发场景。
ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,读与读之间可以并发执行。在读多写少的情况下可以提高效率。
ConcurrentHashMap是同步的HashMap,读写都加锁。

volatile只保证多线程操作的可见性,不保证原子性。

一个线程执行的过程有三个阶段:
加载(复制)主存数据到操作栈 --> 对操作栈数据进行修改 --> 将操作栈数据写回主存
volatite关键字,让编译器不去优化代码使用缓存等,以保证线程在“加载数据阶段”加载的数据都是最新的
eg:
某一时刻i=6是最新的值,volatile保证线程A,B都同时加载了这个最新的值,
然后A执行i(A)+1=7,然后将7写回主存,
B也执行i(B)+1=7,然后也将7写回内存,
这样,执行两次加法,i却只增加了1

静态分配与动态分配

分配是针对方法而言的,指的是方法确定的过程,根据发生实际分为静态分配和动态分配。
相关的非虚方法和虚方法
非虚方法:指的是在解析阶段可以确定方法的唯一版本,符合的有静态方法、私有方法、构造器、final方法。
虚方法:非私有方法。

静态分配的典型例子是方法的重载。

Person a = new Student()可以这样来理解,Person是变量a的静态类型,Student是变量a的实际类型,a的静态类型在编译期间就可以确定,而a的实际类型只有在运行期间才可以确定。
对于方法重载而言,方法的签名及方法名都一样,只能通过形参去确定,而形参是在编译期间就能确定的静态类型,即方法重载是通过静态分配确定的。

/**
 * 静态分派
 *
 */
public class StaticDispatch {
        
    static class Human {
         
    }
     
    static class Man extends Human {
         
    }
     
    static class Women extends Human {
         
    }
    
    public void sayHello(Human guy) {
        System.out.println("hello, guy!");
    }
     
    public void sayHello(Man guy) {
        System.out.println("hello, man!");
    }
     
    public void sayHello(Women guy) {
        System.out.println("hello, women!");
    }
     
    
    public static void main(String[] args){
        
        Human man = new Man(); 
        Human women = new Women();
         
        StaticDispatch sd = new StaticDispatch();
        sd.sayHello(man);   
        sd.sayHello(women);
 
    }
 
}

动态分配与另一个特征息息相关,重写
/**
 * 动态分派
 *
 */
public class DynamicDispatch {
        
    static abstract class Human {
        protected abstract void sayHello();
    }
    
    static class Man extends Human {
        
        @Override
        protected void sayHello() {
            System.out.println("hello man!");
        }        
    }
     
    static class Women extends Human {
     
        @Override
        protected void sayHello() {
            System.out.println("hello women!");
        }        
    }
     
    
    public static void main(String[] args){
        
        Human man = new Man();
        Human women = new Women();
         
        man.sayHello();
        women.sayHello();
        
        man = new Women();
        man.sayHello();
 
    }
 
}

其输出会是

hello man!
hello women!
hello women!
类加载过程

加载 ——验证——准备——解析——初始化
加载:通过类的全限定名来获取类的二进制字节流,将字节流的静态存储结构转化为方法区的运行时数据结构,在内存中生成一个代表这个类的java.lang.Class对象作为方法区这个类的各类数据的访问入口。
验证:确保Class文件的字节流符合当前虚拟机的要求,文件格式验证、元数据验证、字节码验证、符号引用验证。
准备:为类变量分配内存并且初始化。
解析:
初始化:执行类构造器<clinit>()

静态块,非静态块,构造方法执行顺序

静态块——非静态块——构造方法

public class StaticBlockTest {

    {
        System.out.println("normal test");
    }

    static {
        System.out.println("static test");
    }

    public StaticBlockTest() {
    }

    public static void main(String[] args) {
        StaticBlockTest test = new StaticBlockTest();

        StaticBlockTest another = new StaticBlockTest();
    }

}

输出结果:

static test
normal test
normal test

another example

public class StaticBlockingTest {

    {
        System.out.println("构造块");
    }

    public static StaticBlockingTest a = new StaticBlockingTest();

    public static  StaticBlockingTest b = new StaticBlockingTest();

    static {
        System.out.println("静态构造块");
    }

    public StaticBlockingTest() {
        System.out.println("构造函数");
    }

    public static void main(String[] args) {
        StaticBlockingTest c = new StaticBlockingTest();
    }
}

输出结果

构造块
构造函数
构造块
构造函数
静态构造块
构造块
构造函数

其结果与其顺序有关

一个类的构造器可以调用该类的其他构造方法
public class Student extends Person {
    private String sex;
    private String age;

    public Student() {
    }

    public Student(String sex) {
        this.sex = sex;
    }

    public Student(String age, String sex) {
        this(sex);
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}
引用传递
public class Tester{
public static void main(String[] args){
   Integer var1=new Integer(1);
   Integer var2=var1;
   doSomething(var2);
   System.out.print(var1.intValue());
   System.out.print(var1==var2);
}
public static void doSomething(Integer integer){
    integer=new Integer(2);
    }
}

输出

1true
image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容