多态:
1.意义:
同一类型的引用指向不同的对象时,有不同的实现--------所有抽象方法都是多态的
----行为的多态:cut()、getImage()、move()…
同一个对象被造型为不同的类型时,有不同的功能--------所有对象都是多态的
----对象的多态:我、你、水…
2.向上造型/自动类型转换:
超类型的引用指向派生类的对象能点出来什么,看引用的类型能造型成为的数据类型有:超类+所实现的接口
3.强制类型转换,成功的条件只有如下两种:
引用所指向的对象,就是该类型引用所指向的对象,实现了该接口或继承了该类
4.强转时若不符合如上条件,则发生ClassCastException类型转换异常
建议在强转之前先通过instanceof判断引用的对象是否是该类型
public class MultiTypeDemo {
public static void main(String[] args) {
Aoo o = new Boo(); //向上造型
Boo o1 = (Boo)o; //引用o指向的对象就是Boo
Inter o2 = (Inter)o; //引用o指向的对象实现了Inter接口
//Coo o3 = (Coo)o; //运行时发生ClassCastException类型转换异常
if(o instanceof Coo){ //false
Coo o4 = (Coo)o;
}else{
System.out.println("o不是Coo类型");
}
}
}
interface Inter{
}
class Aoo{
}
class Boo extends Aoo implements Inter{
}
class Coo extends Aoo{
}
补充:
1.垃圾代码:
2.优秀代码:
3,
补充:
1.被final定义的变量类型不会改变
final byte a = 1; final byte b = 2; byte c = a+b; 此时a和b参与算数运算不会变成int型,还是byte类型。
2.一个源程序文件中定义了3个类,其中public修饰的类只能有一个
3.super.方法名--------此时的方法只能是普通方法,不能是静态方法。
4.静态方法可以直接通过类名点来访问,也可以通过类的对象名点来访问。
5.创建对象来实现静态调用非静态
6.成员内部类和局部内部类:
局部内部类:类中不能定义静态变量,可以访问外部类的局部变量(即方法内的变量),但是变量必须是final的,具体情况看笔记。
一.内存管理:由JVM来管理的
1.堆:
存储new出来的对象(包括实例变量)垃圾:没有任何引用所指向的对象
垃圾回收器(GC)不定时到内存中清扫垃圾,回收过程是透明的(看不到的),
不一定一发现垃圾就立刻回收,通过调用System.gc()可以建议JVM尽快调度GC回收实例变量的生命周期:
创建(new)对象时存储在堆中,对象被回收时一并被回收内存泄漏:不再使用的对象没有被及时的回收,严重的泄漏会导致系统的崩溃
建议:不再使用的对象应及时将引用设置为null
2.栈:
存储正在调用的方法中的局部变量(包括方法的参数)
调用方法时,会在栈中为该方法分配一块对应的栈帧,栈帧中存储局部变量(包括方法的参数),方法调用结束时,栈帧被自动清除,局部变量一并被清除
局部变量的生命周期:
调用方法时存储在栈中,方法调用结束时与栈帧一并被清除
3.方法区:
存储.class字节码文件(包括静态变量、所有方法)方法只有一份,通过this来区分具体的访问对象
二. 面向对象三大特征:-------------敲黑板、重点之重点
1.封装:
类:封装的是对象的属性和行为方法:封装的是具体的业务逻辑功能实现访问控制修饰符:封装的是具体的访问权限,以保护数据的安全
2.继承:
作用:代码复用超类:所有派生类所共有的属性和行为
接口:部分派生类所共有的属性和行为
派生类:派生类所特有的属性和行为单一继承、多接口实现,具有传递性
3.多态:
行为多态:所有抽象方法都是多态的(通过方法的重写实现的)
对象多态:所有对象都是多态的(通过向上造型来实现)向上造型、强制类型转换、instanceof判断
三. 字符串类型
java.lang.String使用final修饰,不能被继承java中的String在内存中采用Unicode编码方式,任何一个字符占用两个字节的编码字符串底层封装的是一个字符数组字符串一旦创建,对象内容永远无法改变,但字符串引用可以重新赋值------不变对象
四. 常量池:
java对字符串有一个优化措施:字符串常量池(堆中)java推荐我们使用字面量/直接量的方式来创建字符串,并且会缓存所有以字面量形式创建的字符串对象到常量池中,当使用相同字面量再创建对象时将复用常量池中的对象以减少内存开销,从而避免内存中堆积大量内容相同的字符串对象
String s1 = "123abc"; //堆中创建一个123abc对象,常量池中存储这个对象的引用 //编译器在编译时,若发现是两个字面量连接, //则直接运算好并将结果保存起来,如下代码相当于String s2="123abc"; String s2 = "123"+"abc"; //复用常量池中的123abc对象 System.out.println(s1==s2); //true String s3 = "123"; //因为s3不是字面量,所以并不会直接运算结果 String s4 = s3+"abc"; //会在堆中创建新的123abc对象,而不会重用常量池中的对象 System.out.println(s1==s4); //false



