java程序为什么是跨平台的?
操作系统:
mac JDK依赖操作系统
windows JDK依赖操作系统
linux JDK依赖操作系统
每个操作系统上面 都有 JVM java程序运行在JVM上面 不需要和操作系统直接交互
java的内存回收机制 垃圾回收机制
当一个对象没有引入变量再引用这个对象时,那么该对象将无法再使用
JVM有一个独立的线程进行内存回收,当线程发现一个对象没有引用变量引用时,那么该对象的内存资源将会被回收
不再使用的对象及时置null
继承:
一个类继承另外一个类,这个类称为子类或者派生类
被继承的类称为父类或者基类
子类拥有父类的属性和方法,子类可以声明自己的属性和方法
向上造型:
父类的引用变量可以引用子类对象
父类引用变量引用子类对象时,只能访问到父类自己的方法和属性
子类可以重写父类中同名的方法
那么通过父类类型的引用变量引用子类对象时,其实调用的是子类中的方法
称为多态
重载 Overload:
同一个作用域下,方法名相同,参数列表不同即构成重载
静态绑定:在编译时,会根据调用方法时所传递的参数的个数和类型来绑定调用的方法
重写 Override:
子类中重写父类中同名的方法,且参数列表必须相同
子类方法的访问控制属性不能比父类中方法的访问控制属性窄
子类方法不能抛出比父类方法更的异常
动态绑定:在编译时,并不确定调用父子类中的方法,生成一段指令用于替换调用指令
识别引用变量所引用的对象的具体类型,然后调用该对象类型的方法
子类的构造:
子类的构造方法会隐式调用父类的中无参构造方法
即 super();
如果父类中没有无参的构造方法,需要显示调用父类中的有参的构造方法
super(实参);--只能放在第一行
在构造方法中:
this(参数列表) 调用同类中其它的构造方法
super(参数列表) 调用父类中的构造方法
两个都只能放在构造方法中第一行 两个只会有其中一个
默认是super();
子类的构造顺序:
执行父类的构造方法 --> 执行子类的构造方法
不管调用父类中的哪一个构造方法,构造子类对象时,始终要调用父类中的构造方法来初始化子类对象从父类中继承下来的属性
一、static
1. static修饰的属性称为类属性:
class St{
int x;//成员属性 只有通过对象才能访问 如果不实例化对象将没有成员变量
//成员属性属于对象 每一个对象都有自己独立的一份
static int y; //类属性
//类属性属于类 一个类只有一份,所有的对象共享
}
类属性 可以 直接通过 类名.属性名 进行访问
当然也可以通过对象.属性名 进行访问
局部变量不能声明为static
2. static修饰的方法称为类方法
类方法中没有隐含的this引用变量
不能直接访问成员变量 和 调用成员方法
只能访问类属性 和 调用 类方法
成员方法中有this引用变量,this引用变量引用正在调用该方法的对象
能够访问到该对象的成员属性 和 调用成员方法
也能够访问类属性 和 调用 类方法
类属性 和 类方法 是所有的对象共享的(only one)
new对象时:
普通语句块 -> 构造方法
3. static语句块
static{//静态语句块 只会执行一次 最开始执行的
//作用:一般用于加载图片、视频、等资源
}
静态语句块是在类加载时被调用 肯定是等于所有语句块和构造方法先执行
类加载时是一行一行代码加载
new子类对象: 执行过程
父类的静态语句块->子类的静态语句块->父类的语句块->父类的构造方法->子类的语句块->子类的构造方法
二、final
1. final修饰的变量的值不能改变
final int x = 10;
x = 20;//Error
final int y;
y = 10;
2. final修饰成员变量
只能选择以下初始化的方式:
1.直接初始化
2.语句块中初始化
3.构造方法中初始化
只能在其中之一,不能同时
3. final修饰方法 不能被子类重写
4. final修饰的类 不能被继承 断子绝孙类
5. final和static一起修饰变量称为 常量 一般用大写字母表示
只能选择 直接初始化 或者 在静态语句块中初始化
在编译之后,会直接用 值 来替换 常量 提高运行效率
普通的变量 得去内存中取值 才能使用
三、抽象方法 抽象类
abstract修饰的方法为抽象方法
可以没有方法体(方法只需要声明不需要实现)
拥有抽象方法的类称为抽象类(用abstract修饰的类)
抽象类 不能 实例化对象
象类可以有成员属性
抽象类可以有构造方法
抽象类中可以有普通的成员方法
抽象类的意义:
1.提供一个公共的基类 子类对象都是父类类型的对象
2.提供了统一的调用接口(抽象方法) 子类重写该方法
3.封装子类共同拥有的属性和方法
四、接口
interface
interface 接口名{
//只能声明常量 和 抽象方法
int x;//默认是 static final
void show(); //默认是 public abstract
}
JAVA中的类的继承是单一继承 一个儿子只会有一个爸
但是,一个类可以实现多个接口
定义 手机 类
方法 打电话
定义 接口
电脑
方法 上网
照相机
方法 拍照
游戏机
方法 游戏
智能手机 类 继承 手机类 实现 电脑、照相机、游戏机 接口