闲来无事,聊将往日做的些许零散笔记凑合整理一下。
访问控制权限排序——隐私程度,表示修饰符的权限:
private只能在类内部访问;
default可以在内部访问,可被同一个包内的类访问;(子类和父类在同一个包可以访问子类,不在同一个包则不能访问)
protected子类的子类,可以访问;
public只要在系统类都可以访问;
JAVA SE
封装,继承,多态——>基本的三个点;
封装的意义:引入了一个对外的接口,但是保护了其中的其他的内容。可以对类中的属性进行部分暴露部分保护。
总结一下即是,属性私有化+随意操作外界能访问的属性数值。
jdk1.8的底层上是变化最大的一个版本;
JDK——JRE——JVM:不编写代码的话,一般用JRE(JavaRunEvironment)即可运行java的程序;JRE中有JVM(JavaVurtalMachine)支持跨平台使用;
不过从jdk11开始,已经没有单独的jre了。(类似于,单独jre包含的内容不足以支撑新版所需的信息,干脆直接融入了。)
java编译型语言提高了兼容性,牺牲了效率。
static
java是个编译型的语言,编译之后m.java->m.class(在有JDK的情况下),加载了字节码文件,字节码文件存活在JVM内部;
对静态的理解:
静态的是在类加载的时候获取,这个时候还没有对象都可以获取;
静态的只能访问静态的,而非静态的可以访问全部;
final
属性:常量
方法:不能被重写(can't override)
类:不能被继承,也没有子类
abstract
方法: 此方法没有方法体
类:抽象类,不能创建对象;要创建对象的话,只有用子类去创建实现它的功能。
抽象类可以没有抽象方法,但是有抽象方法的类必须是抽象类;
overload:重载,同一个类中,方法名相同,参数表不同;
override:重写,一般是父子类,方法名、参数表、返回值相同,(1.6之后返回值可以是父子类关系);
继承:目的就是为了复用。 同样的方法,表示的方式不一样,所以就导致了多种状态,多态。
OOP:面向对象的编程,重要的一点就是继承复用;
AOP:面向切面的编程,也是为了复用;
多态:子类和父类重写的方法规则不一样;
父类可以引用子类的对象;
父类方法()执行的是子类的实现;
子类只能调用父类中声明的方法;修改为:当父类调用子类对象时,父类可调用的方法只能是在父类中已经实现的。
//多态的栗子~
//新建一个动物类作为例子.class
public class Animal{
public void eat(){
System.out.prinln("animal eat");
}
}
//以狗为例子,建立继承了动物类的子类.class
public class Dog extends Animal{
@Override
public void eat(){
System.out.println("用嘴吃");
}
public void run(){
System.out.println("用腿跑");
}
public void run(String a){
System.out.println(a);
}
public static void main(String args){
Animal a = new Dog();//指向的是Dog的对象,所以实现的也是子类的方法
a.eat();//用嘴吃,实际对象是子类,所以调用的是子类的方法
//a.run();//这个是不能实现的。因为借用父类壳的实际是子类的类,在外界看来还是父类,只能调用父类中声明的方法;
Dog dog = new Dog();
d.run();//用腿跑
d.run("bike");//bike
}
//新建一个另外的类Client来建立对象对比.class
public class Client{
public static void main(String args){
Animal a = new Dog();
a.eat();//用嘴吃,实际的对象是子类
}
}
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常。
在面向对象原则里,重写意味着可以重写任何现有方法。
编译时 ——> 运行时
.java ——>.class
overload:在编译时已经处理好了; override:在运行时才会确定调用的是哪个子类。