Java(1)----- 静态、继承、引用类型使用、多态、内部类
面向对象最重要的两个概念:类和对象;
类名的首字母大写,满足“驼峰写法”;
一个Java代码文件中,可以定义多个类,但是只有一个类是public修饰的,而且public修饰的类名必须成为代码的文件名称;
类中的成分研究:
类中有且仅有五大成分(五大金刚)
1.成员变量(Field:描述类和对象的属性信息的)
2.成员方法(Method:描述类或者对象的行为信息的)
3.构造器(constructor:初始化一个类的对象并返回引用)
4.代码块
5.内部类
注意:只要不是这5大成分放在类下就会报错;
面向对象三大特征:封装、继承和多态;
什么是特征:特点就是特征,
封装的作用:1、提高安全性。2、实现代码的组件化;
封装的规范:1、建议成员变量都私有,用private修饰;2、提供成套的getter和setter方法暴露成员变量的取值和赋值。
静态成员变量:可以和类名一起访问;
实例成员变量:需要先new一下;
在同一个类中访问静态成员可以省略类名不写;
成员变量和成员方法访问的拓展(面试题): 实例方法、实例成员变量、静态成员变量、静态方法;
实例方法是否可以直接访问实例成员变量?
答:可以的,因为它们都属于对象
实例方法是否可以直接访问静态成员变量?
答:可以的,静态成员变量可以被共享访问
实例方法是否可以直接访问实例方法?
答:可以的,实例方法和实例方法都属于对象
实例方法是否可以直接访问静态方法?
答:可以的,静态方法可以被共享访问
静态方法是否可以直接访问实例变量?
答:不可以,静态方法属于类,实例变量属于对象,实例变量必须用对象访问
静态方法是否可以直接访问静态变量?
答:可以的,静态成员变量可以被共享访问
静态方法是否可以直接访问实例方法?
答:不可以,实例方法必须被对象访问
静态方法是否可以直接访问静态方法?
答:可以的,静态方法可以被共享访问
继承的作用:
1、可以调高代码的复用,相同代码可以定义在父类中;
2、在Java中,继承是is a的关系。
3、子类不能继承父类的静态成员;
4、子类可以继承父类的私有成员;
5、就近原则:子类有找子类,子类没有找父类,父类没有报错;
super 父类,this,当前类;啥也不加,局部子类;
方法重写:一般是子类继承父类之后;
方法加上@override 则必须是成功重写父类的方法,否则报错;
子类重写的返回值类型,要么和父类一样,要么比父类的范围范围值更小;
面试:静态方法和私有方法是否可以被重写?? 都不可以?
继承后,构造器特点:
子类构造器的第一行默认一定会访问父类的无参构造器super(),再执行子类自己的构造器;通过super()可以根据参数选择调用父类的某个构造器;
this和super的关键字使用总结:
this代表了当前对象的引用(继承中指代子类对象)
this.子类成员变量
this.子类成员方法
this(....):可以根据参数匹配访问本类中其他构造器
super代表了父类对象的引用(继承中指代了父类对象空间)
super.父类成员变量
super.父类的成员方法
super(....):可以根据参数匹配访问父类的构造器
注意:
this 借用本类其他构造器;
super调用父类的构造器;
this和super 必须放在构造器第一行,否则报错;
所以this和super不能同时出现在构造器中;
继承的特点:
1、单继承:一个类只能继承一个直接父类;如果继承两个,会出现类的二义性;
2、多层继承;一个类可以间接继承多个父类(C继承B,B继承A);
3、子类不能继承父类的构造器,子类有自己的构造器;
引用类型作为方法参数和返回值:
引用类型作为Java的数据类型,自然可以作为方法的参数类型和返回值类型。
除了基本数据类型都是引用数据类型;
抽象类:::
拥有抽象方法的类,一定定义为抽象类;
抽象类的特征:有得有失:
1、有得:抽象类得到了拥有抽象方法的能力;
2、有失:抽象类失去了创建对象的能力。(抽象类不能创建对象);
抽象类的注意事项和总结:
1、抽象本身意味着,不能具体化;除此之外,别的成分都有;
2、抽象类的子类,必须重写抽象父类的所有抽象方法,否则子类也必须定义为抽象类;接口
接口:::
什么是接口:更加彻底的抽象;
一个类实现接口必须重写接口中的全部抽象方法,否则这个类要定义为抽象类。
接口与接口的多继承:
接口同样不能创建对象。
接口与接口的多继承关系:一个接口可以同时继承多个接口;
JDK1.8之后,接口新增的方法(Lambda Stream 函数式接口):
(1)默认方法:
实例方法:必须用default修饰;默认用public修饰;只能用接口的实现类的对象来调用;
(2)静态方法:
可以直接用static修饰;默认加public修饰;接口的静态方法调用只能用接口的类名称调用;
(3)私有方法(JDK1.9开始的):
私有的实例方法,必须加private修饰;私有方法通常是给其他私有方法或默认方法调用的;
只能用接口的实现类的对象来调用;
接口使用的注意事项:
1、如果实现了多个接口,多个接口中存在相同的静态方法并不会冲突,原因是因为只能通过各自接口访问各自静态方法;
2、当一个类继承父类,又实现若干个接口,父类中的成员方法与接口中的默认方法重名,子类就近接受执行父类的成员方法;
3、当一个类实现多个接口,多个接口中存在同名的默认方法,实现类必须重写这个方法;
4、接口中,没有构造器,不能创建对象;构造器:初始化一个类的对象并返回引用;
代码块:
代码块按照static分为:静态代码块、实例代码块;
静态代码块
必须用static修饰,属于类,会和类一起优先加载,而且自动触发执行一次;
静态代码块可以用于在执行类的方法之前进行静态资源的初始化操作;
实例代码块:
属于类的每个对象,会和类的每一个对象一起加载;每次创建对象的时候,实例代码块就会触发执行一次;
实例代码块可用于初始化资源(扩展);
实例代码块实际上提取到每一个构造器中执行的;
final关键字
final 修饰类,类不能被继承;
final修饰方法,方法不能被重写;
final修饰变量,变量有且仅能被赋值一次;
扩展:abstract和final的关系是什么?互斥关系,一个继承,一个不能被继承;不能同时出现修饰成员;
final修饰静态成员变量,变量变为常量;
final修饰实例成员变量可以在哪些地方赋值1次:
1.定义的时候赋值一次。
2.可以在实例代码块中赋值一次。
3.在每个构造器中赋值一次。
单例模式:
什么是单例:
单例是一个类永远只存在一个对象,不能创建多个对象;
为什么用单例:
开发中有很多类的对象,我们只需要一个,例如虚拟机对象,任务管理器对象!对象越多越占内存、单例节约内存,提高性能;
如何实现单例:
(1)饿汉单例设计模式:通过类获取单例对象的时候,对象已经提前做好了;
(2)懒汉单例设计模式:通过类获取单例对象发现没有对象,采取创建一个对象。
(1)饿汉单例设计模式
1、定义一个静态成员变量存储一个对象;
2、类的构造器私有,构造器只有在本类中访问;
3、提供一个方法返回单例对象;
(2)懒汉单例设计模式
1、构造器私有;
2、定义一个静态成员变量用于存储一个对象;
3、通过方法返回一个对象,第一次不存在对象才创建一个返回;
枚举类
作用:做信息标志和信息分类的;
格式:修饰符 enum 枚举名称{ 实例1名称,实例2名称....;}
枚举类第一行罗列的必须是枚举类的对象名称;
特点:1、枚举类是final修饰的,不能被继承;
2、枚举类默认继承了枚举类型,Java.lang.Enum;
3、枚举类的第一行罗列的是枚举类对象,用常量存储;
4、第一行写的是常量对象,默认存储枚举类对象;
5、相当于多例设计对象;
常量 类名.名称;
多态
概念:同一个类型的对象,执行同一个行为,在不同的状态下会表现出不同的行为特征;
多态的识别技巧:编译看左边,运行看右边;对于变量的调用:编译看左边,运行看左边;
多态形式:父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
多态的使用前提:
(1)必须存在继承或实现关系;
(2)必须存在父类类型的变量引用(指向)子类类型的对象;
(3)需要存在方法重写;
多态的优劣势:
优势
1、在多态形式下,右边对象可以实现组件化切换,业务也随之改变,便于扩展和维护,可以实现类与类之间的解耦;
2、实际开发过程中,父类类型作为方法形式参数,传递子类对象给方法,可以传入一切子类对象进行方法的调用,更能体现多态的扩展和便利;
劣势
1、多态形势下,不能直接调用子类的独有的功能(编译看左边!!!);
2、父类没有子类独有的功能;
引用类型的自动类型转化
基本数据类型
1、小范围类型的变量或者值可以直接赋值给大范围类型的变量
2、大范围类型的变量或者值必须强制类型转换给小范围类型的变量
引用数据类型
1、父类类型的范围 > 子类类型的范围
2、Animal > Cat
3、子类类型的对象或者变量可以自动类型转换赋值给父类类型的变量;
建议在进行强制类型转换之前先判断变量的真是类型,再强制类型转换(instanceof);
内部类
什么是内部类:定义在一个类里面的类就是内部类;
内部类作用:
1、提供更好的封装性;
2、内部类有更多权限修饰符;
3、封装性有更多的控制;
内部类的分类:
(1)静态内部类
(2)实例内部类(成员内部类)
(3)局部内部类
(4)匿名内部类(重点);
1、静态内部类
什么是静态内部类:有static修饰,属于外部类本身,会加载一次;
静态内部类的成分:类有的成分,它都有,静态内部类属于外部类本身,只会加载一次;
外部类 = 宿主;内部类 = 寄主;
静态内部类的访问格式:
外部类名称.内部类名称;
静态内部类的访问扩展:
静态内部类可以访问外部类的静态成员变量;
静态内部类不可以直接访问外部类的实例成员;
2、成员内部类(实例内部类)
什么是成员内部类:没有static修饰,属于外部类对象,会加载一次;
成分:不能定义静态成员,其他的都可以定义,可以定义常量;
成员内部类的访问扩展:
成员内部类可以访问外部类的静态成员变量;
成员内部类可以直接访问外部类的不;
3、局部内部类
不能定义静态成员,只能定义实例成员,可以定义常量;
4、匿名内部类
一个没有名字的局部内部类;目的:简化代码;
格式:new 类名(){}
匿名内部类的对象的类型相当于是当前new的那个的类型的子类类型;
包
相同包下直接使用;
不同包下先导包,再使用;
导包格式:import 报名.类名;