一个对象的内存图

java内存区域
栈内存堆内存解释

说明

首先加载class文件到方法区,加载对应的变量和方法,然后走栈内存,走main方法,加载Phone p 栈内存开辟一个空间,new一个对象就在堆内存开辟一个空间,在方法区加载对应的属性设置默认值,然后在栈内存继续往下走, 打印sop(null,0,null) 默认属性,栈内存往下执行,设置属性,通过内存地址找到对应的堆内存覆盖默认属性,打印,
栈内存继续执行,p.call(),栈内存通过内存地址找到堆内存,然后堆内存通过内存地址找到方法区,在栈内存执行方向,然后释放

image.png
image.png

成员变量和局部变量的区别

image.png
image.png

对象是具体的东西,只有对象才能调用方法

image.png

this

image.png

static

image.png

image.png

main

image.png
image.png

字符串String是匿名对象

image.png

image.png

image.png

image.png

image.png
手动入池
image.png
面试题 创建几个对象
image.png
一旦创建不可改变
image.png

image.png
image.png
判断字符串是否存在
image.png

image.png
字符串截取
image.png

image.png
image.png

代码块

image.png
image.png
image.png

继承

image.png
image.png
image.png
image.png

this和super

image.png
image.png
image.png
image.png

final

image.png

多态

image.png
image.png
image.png
image.png

程序开发

image.png

多态内存图

image.png

抽象类的概述

image.png

特点

image.png

接口

image.png

特点

image.png
/*
    多态:同一个对象(事物),在不同时刻体现出来的不同状态。
    举例:
        猫是猫,猫是动物。
        水(液体,固体,气态)。
        
    多态的前提:
        A:要有继承关系。
        B:要有方法重写。
            其实没有也是可以的,但是如果没有这个就没有意义。
                动物 d = new 猫();
                d.show();
                动物 d = new 狗();
                d.show();
        C:要有父类引用指向子类对象。
            父 f =  new 子();
            
    用代码体现一下多态。
    
    多态中的成员访问特点:
        A:成员变量
            编译看左边,运行看左边。
        B:构造方法
            创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
        C:成员方法
            编译看左边,运行看右边。
        D:静态方法
            编译看左边,运行看左边。
            (静态和类相关,算不上重写,所以,访问还是左边的)
            
        由于成员方法存在方法重写,所以它运行看右边。
*/
class Fu {
    public int num = 100;

    public void show() {
        System.out.println("show Fu");
    }
    
    public static void function() {
        System.out.println("function Fu");
    }
}

class Zi extends Fu {
    public int num = 1000;
    public int num2 = 200;

    public void show() {
        System.out.println("show Zi");
    }
    
    public void method() {
        System.out.println("method zi");
    }
    
    public static void function() {
        System.out.println("function Zi");
    }
}

class DuoTaiDemo {
    public static void main(String[] args) {
        //要有父类引用指向子类对象。
        //父 f =  new 子();
        Fu f = new Zi();
        System.out.println(f.num);
        //找不到符号
        //System.out.println(f.num2);
        
        f.show();
        //找不到符号
        //f.method();
        f.function();
    }
}

对比

image.png

image.png

链式编程

image.png

权限修饰符

image.png
image.png
image.png
image.png

内部类

image.png
image.png
image.png
image.png
image.png
image.png

匿名内部类

image.png
image.png
image.png
image.png
image.png

匿名内部类开发中使用

image.png

==与equals

==:
基本类型: 比较的是值是否相等
引用类型: 比较的是内存地址是否相等
equals:
应用类型一般比较的是内存地址
一般重写equals 比较的是值是否相等

为了提高类的健壮性 先判断obj是否student的对象,,若果是向下转型,如果不是返回false
格式 对象名 instanceof 类名
判断对象名是否是该类名的一个对象

泛型

image.png
上限
package com.kaishengit;

/**
 * @author Wgs
 * @version 1.0
 * @create:2018/05/15
 */
public class Message { // 上限只能是Number或者子类
    private T t;

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    @Override
    public String toString() {
        return "Message{" +
                "t=" + t +
                '}';
    }

    public static void main(String[] args) {
        Message message = new Message(); // Integer 是 Number的子类
        message.setT(7002);
        System.out.println(message);
    }
}

泛型应用

interface UserInfo{ // 定义一个标示接口,此接口没有任何方法

}

// 定义一个标示信息的类--->联系方式
class Contact implements UserInfo {
    private String address;
    private String telphone;
    private String zipcode;

    public Contact(String address, String telphone, String zipcode) {
        this.address = address;
        this.telphone = telphone;
        this.zipcode = zipcode;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getTelphone() {
        return telphone;
    }

    public void setTelphone(String telphone) {
        this.telphone = telphone;
    }

    public String getZipcode() {
        return zipcode;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    @Override
    public String toString() {
        return "Contact{" +
                "address='" + address + '\'' +
                ", telphone='" + telphone + '\'' +
                ", zipcode='" + zipcode + '\'' +
                '}';
    }
}

// 信息类--->个人基本信息
class Introduction  interface UserInfo{
    private String name;
    private int age;
    private String sax;

    public Introduction(String name, int age, String sax) {
        this.name = name;
        this.age = age;
        this.sax = sax;
    }

// getXxx setXxx ..

    @Override
    public String toString() {
        return "Introduction{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sax='" + sax + '\'' +
                '}';
    }
}

// 定义Person类,Person类中的UserInfo属性的类型使用泛型

class Persons{ // 向上转型,必须是UserInfo 的子类
    private T userInfo;

    public Persons(T userInfo) {
        this.userInfo = userInfo;
    }

    public T getUserInfo() {
        return userInfo;
    }

    public void setUserInfo(T userInfo) {
        this.userInfo = userInfo;
    }

    @Override
    public String toString() {
        return "Persons{" +
                "userInfo=" + userInfo +
                '}';
    }
}



package com.wanggs.generic;

/**
 * Created by wanggs on 2017/7/26.
 */
public class Test {
    public static void main(String[] args) {
        Person person = new Person(new Contact("杭州","120","3242"));
        System.out.println(person);

        Person person1 = new Person(new Introduction("tom",12,"sex"));
        System.out.println(person1);
    }
}

你可能感兴趣的:(一个对象的内存图)