java内存分为5个部分:
1、栈(Stack):存放的都是方法中的局部变量,方法的运行一定要在栈中
2、堆(Heap):凡是new出来的东西都在堆当中。
堆内存里的数据都有默认值和地址值
3、方法区:存储.class相关信息,包含方法的信息
静态数据(类名访问静态成员变量,其值和new的对象无关,只与类有关)
4、本地方法栈:与操作系统有关
5、寄存器:与CPU有关
匿名对象只能使用一次:确定一个对象只使用一次,可以使用匿名对象
字符串常量池(堆中):在程序中直接写上双引号的字符串,就在字符串常量池中
随机 Random r = new Random()
r.nextInt(100) 左闭右开[0,100)
静态代码块:
特点:当第一个执行本类时,静态代码块执行唯一一次
静态内容总是优先于构造方法
static{
}
面对对象三大特征:封装,继承,多态
封装:也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。对数据和方法实现进行隐藏和保护
继承:(多态的前提)是指可以让某个类型的对象获得另一个类型的对象的属性的方法。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力;
extends
(单继承,多级继承(java.lang.object原始父类),多子类)
构造方法上,先调用父类构造方法,在调用子类
1、子类构造方法默认隐含一个super() 调用父类构造方法
2、super(参数) 可以调用重载父类构造方法
3、super的父类构造调用,必须是子类构造方法的第一语句,而且只能调用一个super
super关键字三种用法:
1、在子类成员方法中,访问父类的成员变量 super.name
2、在子类成员方法中,访问父类的成员方法 super.method()
3、在子类成员方法中,访问父类的构造方法 super()
this关键字(访问本类内容):
1、this.name 访问本类中的成员变量
2、this.method() 访问本类的另一个成员方法
3、在本类构造方法中访问本类另一个构造方法 构造方法的本类调用this(name)
也必须是子类构造方法的第一语句
抽象:如果父类中方法不确定如何进行实现,可以只定义不实现,就为抽象方法 abstract
抽象类,抽象方法所在的类为抽象类,在class之前写上abstract
抽象类里可以有抽象方法和普通方法
1、不能直接创建new抽象对象
2、必须用一个子类继承父类
3、子类必须覆盖重写,父类里的所有抽象方法
抽象类可以不包含抽象方法,抽象方法所在类必须是抽象类
接口(interface)引用类型:是一种公共的规范接口
包含
1、常量 public static final 可以省略,不写也是常量 必须进行赋值
2、抽象方法 接口中的抽象方法,修饰符必须是两个固定的关键字 public abstract
省略性写法:public method() abstract method() method( ) 全是抽象方法
java8
3、默认方法 public default method(){} 可以实现方法 解决接口升级问题
4、静态方法 public static method(){} 可以实现方法 与对象无关只与接口相关
不能通过接口实现类对象来调用接口的静态方法,可以直接通过接口名称调用
java9
5、私有方法 抽取公共方法,来解决多个默认方法之间重复代码问题,但又不能让实现类使用,所以私有化
1、普通私有方法 private method(){}
2、静态使用方法 private static method(){}
接口必须通过实现类实现 implements (多实现),接口之间是多继承的
1、接口是没有静态代码块或者构造函数的
2、抽象方法是单继承,接口可以继承多个
3、如果继承多个接口,有相同抽象方法,只需覆盖重写一次即可
4、要覆盖重写接口里所有的抽象方法,否则所在类必须是抽象类abstract
5、如果实现的多接口,有重复的默认方法,必须对默认方法进行覆盖重写
6、当父类与接口默认方法产生冲突,优先使用父类的方法
多态:就是指一个类实例的相同方法在不同情形有不同表现形式
多态性的体现:父类引用指向子类应用 父类名称 对象名 = new 子类名称
编译看左,运行看左
访问成员变量:
1、通过对象名访问成员变量:看等号左边是谁,优先用谁,没有向上查找(父类成员变量)
2、通过成员方法访问成员变量:该方法属于谁,优先用谁
编译看左,运行看右(成员变量不在此)
访问成员方法:父子都有先用子,没有向上查找
对象向上转型:(就是多态写法)
右侧创建一个子对象,把他当父类看待,向上转型一定是安全的,从小范围转向大范围
Animal cat = new Cat() int-->double
一但对象向上转型为父类,就无法调用子类原有的特定内容
对象向下转型【还原】:
子类名称 对象名 = (子类名称)父类对象
Cat cat1 = (Cat)cat
存在错误转型风险,编译不报错,运行异常 类似于 int num = (int)10.5
转型前进行判断
instanceof判断前面的对象能不能当做后面类型的实例
对象 instanceof 类名称
final:(修饰类,方法,局部变量,成员变量)
修饰类:该类不能有任何子类,final不能作为父类,其类方法不能进行覆盖重写
修饰方法:该方法为最终方法,不能被重写(abstract和final不能同时使用,矛盾)
局部变量:只能唯一一次赋值,数据不可改变 基本类型不可变,引用类型其地址不可变(值可以变化)
成员变量:成员变量有默认值,使用final后必须手动赋值 使用final要么直接赋值,要么通过构造方法赋值(所有构造方法都有对其进行赋值)
权限修饰符:
public》protected》(default)》private
同一类 yes yes yes yes
同一个包 yes yes yes no
不同包子类 yes yes no no
不同包非子类 yes no no no
内部类:一个类内部包含另一个类(汽车和发动机)
成员内部类:
内用外,随意访问;外用内,需要内部对象
使用成员内部类方法:
1、间接:通过外部类的对象,调用外部类的方法,里面在间接使用内部类方法
2、直接:外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
成员内部类调用同名的外部类成员变量使用 外部类名称.this.name
局部内部类:一个类定义在一个方法内部,为局部内部类,只有当前方法可以使用它
局部内部类访问所在方法的变量,这个变量必须是final java8开始可以省略final,但变量值不能变
类的权限修饰符:public》protected》(default)》private
1、外部类:public /(default)
2、成员内部类 : public / protected /(default)/ private
3、局部内部类:什么都不能写
匿名内部类(重要):可以不创建一个类实现接口,直接new 时进行方法重写
1、匿名内部类在创建对象时只能使用一次(想多次使用,需要使用实现类)