Day01
什么是抽象数据类型:将不同数据类型的集合组成的一个整体,我们称为抽象数据类型
类就是一个抽象数据类型
成员变量:类中的数据类型就是成员变量(属性)
方法:类中的一些行为就是方法
面向过程(的缺点):1.对数据缺乏封装 2.数据和方法没有隔离
引用变量的赋值:
引用类型存储的的是对象的地址信息,相同类型引用变量之间也可以相互赋值;
引用类型变量之间的赋值不会创建新的对象,但可能会使两个以上的引用指向同一个对象
Emp e1=new Emp();
Emp e2=e1;//将e1的值赋给e2,他们指向了相同的对象。
也可以将null(空值)赋给引用变量:Emp e1=null;
DAY02
一个.java文件中只能有一个public类;public类必须是.java的类名
例如:文件名为Example 则有 public class Double_Array02 {
public static void main(String[] args) {...}}
1:方法的签名
1)方法名+参数列表就叫方法的签名
2)在同一个类中,不允许出现签名相同的两个方法
2:方法的重载
1)方法名相同,参数列表不同,我们称为方法的重载。(重载发生在一个类中,重写发生在子父类中)
3:构造方法
1)在类中定义
2)构造方法名必须与类名相同
3)构造方法没有返回值,也不写void
class Aoo{
public Aoo(){
}
}
4)一个类若没有写构造方法,则默认有一个无参的构造方法;
但是我们若自己写了构造方法,就没有默认构造方法
5)构造方法可以重载
6)this指代当前对象(往往指向是该对象的成员变量)
7)一个构造方法可以通过this()关键字来调用其它的构造方法
DAY03
Java虚拟机中的内存分配
jvm中:
会开辟一个称为堆的存储空间,用于存放new关键字创建的对象;
会开辟一个名为栈的存贮空间,用于存放程序运行时方法中声明的所有局部变量
方法区用于存放类的信息(Java程序运行时,首先会通过类装载器载入文件的字节码信息,经过解析后将其装入方法区,类的各种信息(包括方法)都存放在方法区)。
成员变量的生命周期:
可以理解为对象的生命周期,即new创建对象时,成员变量生命周期开始,当对象没有地址指向时,对象视为废弃对象,成员变量也被废弃,生命周期结束。
注意:方法只有一份。
成员变量:
存在与类内方法外的变量称为成员变量。
有默认值
存在于堆
局部变量:
存在方法内的变量称为局部变量。
没有默认值
存在于栈
局部变量的生命周期:
方法调用时开始,JVM会为方法分配一个空间,即栈帧。局部存在栈帧中。
方法调用完毕,栈帧消失,局部变量失效,生命周期结束。
父类的引用可以指向子类的对象,即向上造型;
通过父类的引用只能调用父类的成员变量和方法,不能调用子类特有的成员变量和方法;
例如:
class Animal{
public void jump(){
}
}
class Tiger extends Animal{
public void eat(){
}
}
public class A{
public static void main(String[] args) {
Animal a=new Animal();
Tiger t=new Tiger();
Animal at=new Tiger(); //这里创建的对象不能引用子类特有的方法和成员变量
}
}
对于一个父类的引用类型,可以指向该类的对象也可以指向其任意一个子类的对象。
如果需要把父类类型,转换成子类类型,那么需要强制类型转换.其格式为: 目标类型 变量名=()值;
如果父类类型不是指向需要强制类型转换的子类的对象,那么强制转
换会产生造型异常(ClassCastException)
例题:
Cat cat =null;
Animal animal = new Dog();
if (animal instanceof Cat) {
cat = (Cat) animal;
System.out.println(cat.noise());
}else{
System.out.println("animal is not Cat's instance");
}
其中,animal指向Dog的实例,而不是Cat的实例,故代码“ animal instanceof Cat” 返回false,程序执
行else分支,输出:“animal is not Cat's instance”。
DAY04
关于构造方法与super关键字
子类的构造方法可以通过super()来调用父类的构造方法,其往往用来初始化成员变量。
super()可以不写,默认第一行就有。
super()必须在第一行
final关键字
final修饰变量赋值后不能修改
final:修饰成员变量。要么声明的同时初始化,要么在构造方法中初始化。
修饰局部变量:在使用之前初始化即可。
final修饰方法,该方法不能被重写
final修饰类,该类不能被继承
方法的重写:在父子类中,方法签名相同,方法体不同。我们称之为方法的重写。
无论是父类的引用还是子类的引用,调用的都是重写后的方法.
在重写的方法中,我们可以会用super调用父类的方法(往往是被重写的方法)
子父类继承重写方法中两同两小一大问题:
两同:方法名和参数列表相同
两小:1)返回值类型要小于等于被重写的方法(基本类型和void保持不变)
2)抛出的异常小于等于被重写的方法
一大:重写的修饰符要大于等于被重写的方法的修饰符访问控制符大小问题:
修饰符 本类 同一个包中的类 子类 其他类
public 可以访问 可以访问 可以访问 可以访问
p'ro'tected 可以访问 可以访问 可以访问 不能访问
默认 可以访问 可以访问 不能访问 不能访问
private 可以访问 不能访问 不能访问 不能访问
重载与重写的区别:
重载:在同一个类中,方法名相同,参数列表不同。
调用方法根据参数个数和类型选择调用那个方法
重写:发生在父子类中,方法签名相同,方法体不同。
不管是父类的引用,还是子类的引用,最终调用的都是重写后的方法
调用哪个方法重载看引用类型,重写看对象类型。
static关键字
static:修饰的成员变量不属于对象的数据结构,属于类。通过类名.调用
static修饰的成员变量存在方法区,并且只有一份。
static:修饰方法,通常类名.调用。注意:静态资源不能调用非静态资源
static:修饰代码块,在类加载时加载一次,只有一份
DAY05
抽象
抽象方法:由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法的实现(实现即方法体,大括号中的部分),并以分号结束。
抽象类:由abstract修饰的类为抽象类。包含抽象方法的类一定是抽象类;抽象类不一定包含抽象方法。
一个类继承了抽象类,必须要重写父类的所有抽象方法。若不重写抽象方法也可,要把类变成抽象类
抽象类不能被实例化,无论有没有抽象方法。
abstract和final不能同时作用于一个类
final修饰的方法不能被重写,修饰的类不能被继承。
abstract修饰的方法要被重写才有意义。
接口
接口:由interface修饰的类为接口,接口中的所有方法都必须是抽象方法。但是可以没有任何方法
接口中没有构造方法
接口中不能定义成员变量,但是可以定义常量。往往用static final来修饰常量
接口中的方法往往省略public abstract
implements:实现接口,重写接口中的所有抽象方法。注意:子类重写抽象方法时,控制访问修饰符一定时public
一个类可以实现多个接口,中间用逗号隔开。
* class&class -->extends
* class&interface -->more implements
* interface&interface -->extends
* class&abstract -->extends
* abstract&abstract -->extend