申明:
内容来源于老师的课堂笔记,这只是我的整理以及一些额外补充。
六、面向对象及其特点
了解点:
1、把某一类事物共同拥有的属性和方法功能抽取出来形成一个类,用类来表示对象和对象之间是相互独立的。
2、全局变量和局部变量发生命名冲突时,局部优先(就近原则)
3、方法重载:同一个类中的同名方法,参数不同
4、构造方法:
1)每个类都有一个默认公开无参的构造方法
2)只能在创建实例时调用
3)定义了显式的构造方法后,隐式默认无效
4)构造方法也能重载(只增加不修改)
5、this关键字
1)this没有隐式构造方法只能定义显式的且只能定义在第一行
2)this代表当前对象,可以区分全局变量和局部变量
掌握点:
1、理解面向过程和面向对象的区别
摘自:面向对象和面向过程(总结版)_程序员这么可爱的博客-CSDN博客
从语言方面出发:
对于C语言来说,是完全面向过程的。
对于C++语言来说,是一半面向过程,一半是面向对象。(C++是半面向对象的)
对于Java语言来说,是完全面向对象的。面向对象一般和面向过程结合来看的
面向过程(Procedure Oriented 简称 PO):把事情拆分成几个步骤(相当于拆分成一个个的方法和数据),然后按照一定的顺序执行。
面向对象(Object Oriented 简称 OO):面向对象会把事物抽象成对象的概念,先抽象出对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法。
2、引用
引用类型、对象类型,在内存空间是有引用地址和内存地址的
引用类型的变量存储是内存空间的首地址
Java支持的值传递,不支持引用传递【传递即为拷贝】
对于基本类型:变量之间的赋值是直接拷贝一份值进行赋值
对于引用类型:变量之间的赋值是引用地址的重新指向
3、String类
String是一个引用对象类型
尝试String的方法
public class Stringtest {
public static void main(String[] args) {
String str1 = "1234567890";
String str2 = "qwertyuiop ";
System.out.println(str1.charAt(4));//5
System.out.println(str1.concat("987654321"));//1234567890987654321
System.out.println(str1.contains("123"));//true
System.out.println(str1.equals(str2));//false
System.out.println(str2.indexOf("tyu"));//4
System.out.println(str2.length());//15
System.out.println(str2.toLowerCase());//"qwertyuiop "
System.out.println(str2.toUpperCase());//"QWERTYUIOP "
System.out.println(str2.trim());//"qwertyuiop"
}
}
4、面向对象的特点(抽象、封装、继承、多态)
1)抽象是指一个类的形成过程:把某一类事物共同的拥有的属性和方法给抽取出来
2)封装
①从语法角度:
用private关键字修饰的属性或方法实现对外不可见;
私有对象在类的内部是可以访问的;
类中属性一律设为私有;给每个属性设置get/set方法让外部操作私有属性
②从开发角度:
方便复用(函数、项目架构)
③标准JavaBean
类中的所有属性都是私有的
所有私有属性都要有对应的get/set方法
要有公开的无参和全参构造器
3)继承(extends)子类继承父类,子类进行方法和属性的拓展
需注意:Java中只能实现单一的继承,不能多重继承;且子类不能继承父类的私有属性和构造方法;
①私有属性子类能否继承的问题
从开发/结果角度理解:不能继承
从内存结构中理解:子类可以继承父类私有属性开辟的内存空间/结构,但是不给予子类访问权限
②Java中单一继承的好处:
一个子类能有好多个父类,这使类的层次关系变得非常复杂,几个父类含有相同的成员变量或相同的方法,就会让子类的调用变得模糊不清。单一继承就清楚地表明了类的层次关系。
方法重写(Override)/覆盖(Overwrite):
父子关系中,子类和父类分声明必须保持统一(方法名和参数列表)
子类调用重写方法是调用的是自己的重写方法
子类覆盖方法的访问修饰符必须大于等于父类对应重写方法的访问修饰
方法声明的返回值类型要一致(在多态中可以不同)
子类不能重写父亲的私有方法
Super
Super代表父类对象(并不是指父类,而是可以通过Super关键字来访问父类的内容,即可以通过super关键字调用父类的可以被调用的内容)
4)多态:一种类型有多重实现方法。子类属于父类,子类是父类的一个分支。多态时调用的是当前父类指向子类中的重写方法,且父类不能调用子类的飞重写方法。
分为编译时多态和运行时多态,Java中的多态是运行时多态
5、Java的内存结构
heap(堆)区:
堆是一个运行时的数据区,是所有线程共享区域,用来存放new出来的对象和数组。
类的普通变量(属性)放在堆中;堆用于动态分配和释放程序所使用的对象空间;在堆中的对象是不能直接访问的,必须通过在栈中声明的指向该引用的变量来调用。
stack(栈)区:
用来存放局部变量,一般是对象的引用
method segment(方法)区:
存放类信息(构造方法、接口定义…)、常量、静态变量、即时编译后的代码(函数、语句),所有线程共享的内存区域
方法区中包含常量池(date segment区):该类的常量就存在常量池中
方法区也叫非堆区,是堆区的一个逻辑分区
ClassLoader:类加载器 程序运行时把字节码文件加载到内存中
Native关键字:修饰方法,这个方法是调用C语言对OS的操作
程序计数器:一小块内存,完成对程序执行的调用工作,当前线程所执行的一个字节码的行号指示器,条件、循环、异常、线程恢复时都需要借助程序计数器来执行后续代码的调度
执行引擎:把计算机高级语言翻译成机器语言的过程
详情可以参考:终于搞懂了java8的内存结构,再也不纠结方法区和常量池了!_lei6393的博客-CSDN博客
6、对象的创建过程
从结果来看:
子类继承父类,就获得了父类中声明的属性和方法(非私有)
创建子类的对象,在内存heap堆空间中,就会加载所有父类中声明的熟悉
从过程来看:
分配空间(父类对象空间【并没有实际上创建父类对象】,子类对象空间)
类的实例化是指类完全加载过程中的初始化阶段,对类的变量(属性)按照开发者的意图进行赋值的过程
子类会有一个父类的虚对象,且可以通过super调用
7、访问修饰符(private、protect、public、default【能被同包子类继承】)
详情请参考:Java访问修饰符_ThinkWon的博客-CSDN博客
七、三个关键字
(static、final、abstract)
了解点:
1、static
可以修饰属性、方法、代码块
修饰后,属于全类公有,只属于类,不再属于对象;在内存中只存在一份;可以通过类名直接调用;
static初始化时机:static在类加载(classloader类把字节码文件加载到内存中)时刻进行初始化,优先于对象的存在
静态方法中不能使用this、super关键字:静态属于类,this、super属于当前对象,静态优先于对象存在;静态对象中不需要这两个关键字;静态存在内存的方法区中,而this、super是heap堆中的引用,不能对方法区中的数据进行调用
2、final
final修饰的属性为常量(值不可变),可以修饰属性、对象、方法、类
对象设置为final,指的是对象的引用地址不可变
final和static一般是一起修饰属性的
final修饰的方法叫最终方法,不能被重写;final修饰的类叫最终类不能被继承
3、abstract
抽象类只可以被声明不可以被实例化;可以被子类继承通过多态的思想来使用
子类继承抽象类,要么实现父类中所以抽象方法,要么把自己声明为抽象类
抽象类是功能定义,但还是可以的定义普通方法
掌握点:
1、设计模式
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,是为了更好的重用代码、被他人理解、且能够保证代码的可靠性。
创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式
结构型模式:适配器模式、桥接模式、过滤器模式、组合模式、装饰器模式、外观模式、享元模式、代理模式
行为型模式:责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、空对象模式、策略模式、模板模式、访问者模式
2、单例设计模式(static)
单个实例/对象:一个类在Java运行过程中永远保持在内存中只有一个对象(不允许其他成员创建)
①懒汉式(需要的时候new,线程不安全)
②饿汉式(先new需要的时候给,线程安全)
详情及代码请参考:单例模式 | 菜鸟教程 (runoob.com)
3、模版设计模式(abstract)
详情及代码请参考:模板模式 | 菜鸟教程 (runoob.com)