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<T extends Number> { // 上限只能是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<Integer> message = new Message<Integer>(); // 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<T extends UserInfo>{ // 向上转型,必须是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<Contact>(new Contact("杭州","120","3242"));
System.out.println(person);
Person person1 = new Person<Introduction>(new Introduction("tom",12,"sex"));
System.out.println(person1);
}
}