一、类变量、实例变量;类方法、实例方法;
面向对象基础知识
一、static
1、
类变量(静态成员变量)
实例变量(对象变量)
2、成员变量执行原理
栈内存:方法、方法的变量s1
堆内存:对象、类变量、实例变量
s1指向的对象储存在堆内存,s1指向该对象
二、类变量应用
三、类方法
类方法中不能访问实例成员变量(不带static),实例成员变量是对象的成员变量,类方法只能访问类变量!!!!!!!!!!
拓展:
四、工具类
五、类方法、实例方法
this表示当前对象的地址,因此在类方法中不可出现
六、代码块
1、静态代码块
2、实例代码块
作用:可以将多个构造器中的重复代码拿到实例代码块中
七、饿汉式单例
饿汉模式,就是它很饿,它的对象早早的就创建好了
只能通过调用类方法获取单例对象
优点:避免浪费内存,只需要一个对象就可以处理问题
八、懒汉式单例(线程不安全)
懒汉模式,顾名思义就是懒,有人来向它要对象的时候再实例化对象
对象很少调用时使用,稍微比饿汉节约内存
单例中懒汉和饿汉的本质区别在于以下几点:
①饿汉式是线程安全的,在类创建的同时就已经创建好一个静态的对象供系统使用,以后不在改变。懒汉式如果在创建实例对象时不加上synchronized则会导致对对象的访问不是线程安全的。
②从实现方式来讲他们最大的区别就是懒汉式是延时加载,他是在需要的时候才创建对象,而饿汉式在虚拟机启动的时候就会创建,饿汉式无需关注多线程问题、写法简单明了、能用则用。但是它是加载类时创建实例(上面有个朋友写错了)、所以如果是一个工厂模式、缓存了很多实例、那么就得考虑效率问题,因为这个类一加载则把所有实例不管用不用一块创建。
二、
面向对象基础知识2
一、继承
子类对象由父类、子类共同决定!
继承:同样可以访问父类私有成员变量
权限修饰符
在本类中:在别的地方即使是本类的对象也不可以访问
继承注意
二、方法重写
写代码要求:!!!!!!
了解:
toString()
打印对象输出的不是地址,是内容则代表对object的toStirng()方法重写了!!!
三、super关键字
变量:super.name;
方法:super.print1()
四、构造器
super():表示调用父类构造器!!!!!
要点:子类构造器第一行代码都有一行super(),自动调用父类构造器!!!
1、子类调用无参构造器:
2、子类调用有参构造器:(父类无参构造器同样被调用)
子类构造器调用父类构造器
super(参数1,参数2…)
父类:成员变量、setget方法、有参、无参构造器
如何写好子类的构造器?
创建子类对象时,调用子类构造器,子类构造器第一行默认是调用父类无参构造器super(),
因此想创建对象时为父类变量赋值必须要super有参构造器!!!!!
构造器中的调用:this调用兄弟构造器:
this(参数1,参数2…)
作用:不填第三个参数默认定义为:“黑马程序员”
只初始化两个参数,则匹配兄弟构造器
三、
面向对象基础知识03
一、对象多态、行为多态
父类类型指向子类对象,面向父类类型编程,可以随时更换子类代码而不修改其他代码
1、对象行为
编译看左边,运行看右边
父类引用子类对象:Person p1=new Student();
2、成员变量
不存在多态(编译运行都看左边。也就是成员变量没有多态特性)
3、静态static
方法和变量:编译运行都看左边,同成员变量一样。
二、多态(polymorphism)
1、父类变量接对象
2、解耦合
问题:无法调用子类的独有功能
编译看左边,运行看右边
编译报错!People的p1没有子类student的独有功能test()
即使test方法是public,但是父类没有该方法!编译阶段就报错!!!!
instanceof :强转前先判断
作用:如果使用父类变量接对象,那么不清楚接到的对象具体是哪个对象,使用instanceof不会出现ClassCastException异常
三、final
Java中的变量:
(区别于数据类型:基本数据类型、引用数据类型)
1、
2、
3、注意:
4、常量
四、抽象类
总结:
abstract抽象类存在构造器吗?
存在!!!
虽然抽象类没有提供任何构造函数,编译器将为抽象类添加默认的无参数的构造函数,如果没有的话抽象类的子类将无法编译,因为在任何构造函数中的第一条语句隐式调用super(),即调用父类的构造器。
抽象类的好处
不用也可以,父类的构造函数写一个方法体,子类重载就行;
抽象方法(无方法体),则强制子类必须重写!
应用场景
五、接口
接口定义变量、方法
变量都是静态的常量,如果是不是常量那通过A.name修改后所有对象的成员变量都将改变!!!
实现类必须实现接口的全部抽象方法
接口的好处:弥补单继承的不足
面向接口编程!
班级学生信息管理模块
1、信息类
2、操作类:向上又向下!!!!!!
(提供方法给主函数调用,同时也调用了实现类的方法)
3、操作的接口
4、实现类
5、主函数
切换方案:
六、接口新增方法
当接口需要拓展方法时,只需增加一个带方法体的方法,实现类不需要重写!!!!
接口多继承
类单继承(亲爹),接口多实现(干爹)
接口多继承:实现类只需要实现一个接口,方便一点
四、
面向对象基础知识04
一、外部类
成员内部类
静态内部类
类方法中不能访问实例成员变量(不带static),是对象的成员变量,只能访问类变量!!!
静态内部类的方法中同样也不能!!!
匿名内部类
应用
不需要定义实现类,直接构建匿名类内部对象:简化代码!
一般不写,在调用API需要传递参数为对象时,才用!!!
再简化:
lamda表达式
二、枚举类
1、枚举类
2、抽象枚举
抽象枚举第一行不能直接罗列对象?
因为该类中有抽象方法
如果第一行创建了对象X,Y,Z,那岂不是可以直接调用该类的抽象方法了?
3、枚举的应用
1、
约束好了,代码严谨!游戏性能好
2、枚举应用到单例设计模式
三、泛型
泛型类
泛型接口
再拓展:
泛型方法
传入的参数确定返回值类型!!!
泛型方法中是在本类中自己定义的
1、
2、
泛型方法的应用场景
1、
2、
3、
4、通配符
泛型擦除
注意事项:数据类型限制