终于到Java面向对象了,是非常重要的一方面,但囿于时间关系,尽可能简单的记录我不会的东西
Java的值传递、引用传递?
Java基础类型是值传递,数组和对象是引用传递(数组也是一种对象)
创建一个对象的过程,各方面内容存储在哪里?
如图所示代码,下图是一个对象的生成过程
在main函数里是栈区,存放着对象的引用(地址),另外对象真正的存储地点在堆区,而方法区存放着静态方法、方法(函数)、常量(如对象里的字符串常量)等等,结构如下:
super()构造
构造函数先调用父类的构造函数(且这个必须在第一行执行),再进行子类构造
不能同时调用super()和this()进行构造
修饰符Public/Protected/Default/Private区别
Public
所有包都可以访问该内容(成员变量、方法)
Protected
只能被同一个包和子类继承
Default
只能被同一个包的访问
Private
只能在本类内访问
总结
访问修饰符 | 类内部 | 当前包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
继承相关
这个文章写的很好,关于各个修饰符的:
https://www.cnblogs.com/jobyterry/p/15731685.html
总之
public允许所有访问
protected和public不同之处在于限制了外部访问
default不同之处在于继承后无法通过this访问
private和default不同不在于继承,而是该类可否被同一包内其他类访问
构造方法
构造方法因为和类名相同,谈不上继承,只是隐式或显式的调用
public
包内包外都可继承,任何地方都可以实例化(new)
protected
包内包外都可继承,包内可以实例化(即new) , 包外子类不能实例化(即new)
default
包内可以继承,包内可以实例化, 包外不可实例化
private
不可以被继承,不可以被实例化(即new)
静态方法/变量
静态方法无法被子类重写,算两个不同的方法,向上转型后,调用父类的方法,如
//A extends B
A a = new A();
B b = new A();
此时B b向上转型,还是调用B的静态方法
下面介绍重写相关内容
重写
属性没有重写一说
@Override可以帮助检查错误
重写时方法名和参数列表都相同
A extends B
A a=new A();
B b=new A();
没有static时,b调用的是对象的方法,而b是用A类new的
即b是A new出来的对象,因此调用了A的方法
有static时,b调用了B类的方法,因为b是用b类定义的
因为静态方法是类的方法,而非静态是对象的方法
总结:
静态方法是类的,就算重写,左边声明的谁的就调用的谁的
非静态方法是对象的,重写后,右边new的谁的就用谁的
重写时
修饰符范围可以扩大,不可以缩小
异常范围可以缩小,不能扩大
父类调用子类独有的方法无法调用,只能强制类型转换,向下转型
A extends B
b.Amethod() //报错
//除非:
((A) b).Amethod()
instanceof
x instanceof Y
即判断对象x指向的实际类型是不是Y的子类型
类的静态方法无法调用非静态方法
匿名代码块
匿名代码块{}在类里面写,用于初始化对象的时候加载
匿名静态代码块static{}在类里面写,用于初始化类的时候加载
执行顺序:
(第一次初始化类的对象)匿名静态代码块→
(第一次初始化对象)匿名代码块→构造函数→
(第二次初始化对象)匿名代码块→构造函数→……
静态导入包
import static java.lang.random;
就可以直接用random()这个函数
抽象类
抽象类不能初始化对象,所以只能被继承使用
抽象类的一般功能和普通类相同
抽象方法只能在抽象类种定义
抽象类的抽象方法必须在子类中被继承,除非子类是抽象类
抽象类继承有缺陷:只能单继承
接口
接口可以多继承
接口里面无法定义实现,里面的方法默认都是public abstract的
接口命名大写首字母+驼峰
实现的类命名:接口名+“Impl”
接口里面的都是常量,但一般不会放
接口不能被实例化,且没有构造方法
内部类
普通内部类 成员类
静态内部类 静态成员类
同文件其他类 该文件下面的其他类
局部内部类 方法里面定义的类
匿名内部类 无名字只有实现的类