对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。
引用类型作为参数,传递的是地址值。
JavaStack(java栈)、heap(堆)、method(方法区)
成员变量(全局变量):有默认值
封装的步骤
1.使用private关键字来修饰成员变量(将属性隐藏)
2.对需要访问的成员变量,提供对应的get、set方法(提供公共方法访问)。
this的含义
(如使用getXXX、setXXX中形式参数与成员变量一致时需要使用this来区别)
this代表所在类的当前对象的引用(地址值)(解决成员变量被隐藏的问题)
标准代码-JavaBean
Java-Bean是Java语言编写类的一种标准规范。符合JavaBean的类,要求类必须是具体的和公共的,并且具有无餐数的构造方法,提供用来操作成员变量的set和get方法。
匿名对象
匿名对象,只创建对象吧赋地址值给变量
new 类名(参数列表);
创建匿名对象直接调用方法,没有变量名;
new Scanner(System.in).nextInt()
常用api第一部分
1简单文本扫描器
Scanner是一个可以解析基本类型和字符串的简单文本扫描器,生成的值是从指定的输入流扫描的。
public Scanner(InputStream source)//构造方法
public int nextInt()//成员方法:将输入的下一个标记的信息扫描为一个int值(只能扫描int类型文本)
nextLine()方式接收字符串
2Random
构造方法public Random()创建一个随机数生成器
成员方法public int nextInt(int n)返回一个伪随机数,范围在[0,n)之间的int值。
Arraylist类常用方法
ArrayList<String> list = new ArrayList<>();
public boolean add(E e)//将指定的元素添加到此集合的尾部
public E remove(int index)//移除此集合中指定位置上的元素,返回被删除的元素
public E get(int index)//获取此集合中指定位置上的元素,返回被删除的元素
public int size()//返回此集合中的元素的个数,遍历集合时,可以控制索引范围,防止越界。
ArraList对象不能存储基本类型,只能存储引用类型的数据(可以存储基本数据类型对应的包装类)。
继承与多态
面向对象的三大特性:封装、继承、多态。
继承提高代码的复用性
类与类之间产生关系是多态的前提
子类中出现了听明的成员变量时,需要用super与this区别
1 覆盖
子类中出现与父类重名的方法,方法会被重写(覆盖)。
/*重写类(子类)*/
class NewPhone extends Phone{
public void showNum(){
super.showNum();//调用父类已经存在的功能
System.out.println("显示来电姓名");//增加功能1
System.out.println("显示头像");//增加功能2
}
}
子类方法覆盖父类方法,必须要保证权限大于等于父类权限,
子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一样。
2继承
继承后的特点
构造方法:子类的构造方法中默认有一个super(),表示父类的构造方法,父类的成员变量初始化后,才可以给子类使用。
super:代表父类的存储空间标识(可以理解为父类的引用)
this: 代表当前对象的引用
super()与this()必然在构造方法第一行。
抽象方法
子类对父类抽象方法的重写叫方法的实现
非抽象子类实现接口:
1.必须重写接口中所有抽象方法,
2继承了接口的默认方法,即可以直接调用,也可以重写。
实现格式:
class 类名 implements 接口名{
//重写接口中抽象方法[必须]
//重写接口中默认方法[可选]
}
接口中的默认方法是Java8之后出现的,子类方法不必须实现此方法就可以拥有该方法的及实现
Java8中为接口新增了一项功能,定义了一个或者多个静态方法:
接口定义静态方法可以独立于任何对象调用。
接口名字.静态方法名()
如果一个类实现两个或者两个以上的接口,并且多个接口中包含统一默认方法,此时,编译器将报错。这种情况,我们必须让子类Override该方法,否则无法编译通过。
Java8接口中可含有私有方法和私有静态方法
私有方法使用private修饰,供接口中的默认方法或者静态方法调用
(私有起到代码复用与保护作用)
接口的静态方法无法继承也不需要继承直接调用
不同的接口中存在同么的静态方法并不会冲突,原因是只能通过各自接口名称访问同名静态方法
当一个类,既继承一个父类,又实现若干接口时,父类中的成员方法与接口中的默认方法重名,子类就近选择执行父类的成员方法。
在接口的多继承中,如果父接口中的默认方法有重名,那么子接口需要重写一次。
子接口重写默认方法时,default关键字可以包留
子类重写默认方法时,default关键字不可以包留
静态代码块
static{
}
执行顺序:
静态代码块>构造代码块>构造函数>普通代码块
接口中,无法定义成员变量,但是可以定义常量,其值不可以改边,默认使用public static final修饰
接口中,没有静态代码块(jdK8之前不能有好理解,jdk8之后不能有不知原因)
方法修饰符
1访问修饰符:
Java提供了四种访问权限
public公共的
protected:受保护的
default:默认的
private:私有的
任何地方>不同包子类>同一包子类>当前类
public>protected>default>private
编写代码时,如果没有特殊考虑,建议:
成员变量使用private,隐藏细节
构造方法使用public,方便创建对象
成员方法使用public,方便调用方法
默认方法咏default修饰,不可省略
静态方法用static修饰,供接口直接调用
抽象方法用abstract修饰,可以省略
2非访问修饰符
final:不可改变,可以用于修饰类、方法和变量
被修饰的类,不能被继承
被修饰的方法,不能被重写
被修饰的变量,不能被重新赋值
(1)当被修饰的变量为局部变量
/*修饰的局部变量为基本类型时,其值不能被改变,以下是“特殊情况”*/
for(int i=0; i<10;i++){
final int c=i;
System.out.println(c);
}
//注意:每次循环,都是一次新的变量c
/*当修饰的局部变量为引用类型时,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量的修改,也即是说,被final修饰的变量只是限制其值不能被更改,而引用数据类型变量其值为地址值*/
(2)当被修饰变量为成员变量
(被final修饰的常量名称,一般都有书写规范,所有字母都大写)
成员变量涉及初始化问题,初始化方式有两种,只能二选一:
[1]显示初始化
public class User{
final String USERNAME = "张三";
private int age;
}
[2]构造初始化
publiv class User{
final String USERNAME;
private int age;
public User(String username,int age){
this.USERNAME = username;
this.age = age;
}
}
多态
1多态体现的格式:
父类类型 变量名 = new 子类对象;
变量名.方法名();
2多态的扩展性体现:
把父类类型作为方法形式参数,传递子类对象给方法。
向上转型是默认的,向下转型的强制的。
一个以及向上转型的子类对象,将父类引用转为子类引用,可以使用向下转型。
转型时给引用变量做类型的校验:
if(变量名 instanceof 类名){
方法体1;
}else if(变量名 instanceof 类名){
方法体2;
}
(练习demo见笔记本电脑综合案例)
数据结构
栈;
1.栈描述的是方法执行的内存模型,每个方法被调用都会创建一个栈帧(存储局部变量、操作数、方法出口等)
2.JVM为每一个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
3.栈的存储特性:先进后出
4.栈是由系统自动分配,速度块!栈是一个连续的内存空间
堆:
1.堆用来存储创建好的对象和数组(数组也是对象)
2.JVM只有一个堆,被线程所共享
3.堆是一个不连续的内存空间,分配灵活,速度慢!
方法区(又叫静态区):
1.JVM只有一个方法区,被所有线程所共享!
2.方法区实际也是堆,只是用来存储类、常量相关的信息。
3.用来存放程序中永远不变的或者唯一的内容(类信息,class类对象,静态变量,字符串常量等)
Java虚拟极的内存划分:
为了提高运输效率,就堆空间进行不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式:
JVM的内存划分
寄存器(给cpu使用)
本地方法栈(JVM使用操作系统功能的)
方法区
堆内存
方法栈
方法的参数为基本类型时,传递的数据值,方法的参数为引用类型时,传递的是地址值。
循环控制语句
for和while的区别:
1.控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用
2.for循环结束,该变量就从内存中消失,能够提高内存的使用效率。
break:结束循环
continue:跳出本次循环
嵌套循环:
for(int i=0;i<5;i++){
for(int j=0;j<8;j++){
System.out.println();
}
}
内部类、匿名内部类
匿名内部类是内部类的简化写法,本质上一个“带具体实现的父类或者父接口的匿名对象”
使用接口须做几步操作:
1 定义于类
2 重写接口
3 创建子类对象
4 调用重写后的方法
匿名内部类将一步合为一步,更快捷
匿名内部类使用三种场景:
[1]直接调用
[2]传参
[3]简化