10.23Java学习进度

访问控制,final关键字,多态,抽象类,接口,匿名内部类:

访问控制:
常用的访问控制符 访问控制符 访问权限 本类 本包中的类 子类 其它包中的其它类


 public       公有的      ok        ok        ok          ok  
 protected    保护的      ok        ok        ok          no
 啥也不写      默认的      ok        ok        no          no
 private      私有的      ok        no        no          no

a.public修饰的内容可以在任意位置使用;
b.private修饰的内容只能在本类中使用;
c.通常情况下,成员变量都使用private修饰,成员方法都使用public修饰;

final关键字:
基本概念:
final本意为”最终的,不可更改的”,该关键字可以修饰类、成员方法、成员变量等。
使用方式:
final关键字修饰类表示该类不能被继承。

  • 为了防止滥用继承带来的危害
  • 如:java.lang.String类等

final关键字修饰成员方法表示该方法不能被重写但可以被继承。

  • 为了防止不经意间造成的方法重写
  • 如:java.text.DateFormat类中的format方法等

final关键字修饰成员变量表示该成员变量必须初始化而且不能更改。

  • 为了防止不经意间造成数值的更改。
  • 如:java.lang.Thread类中的MAX_PRIORITY等

扩展:在以后的开发中很少单独使用static关键字或final关键字修饰成员变量,通常都是使用public static final共同修饰成员变量来表达常量的含义。 常量的命名规则是:要求所有字母大写,不同单词之间采用下划线连接,如: public static final double PI = 3.14;

多态:
基本概念:
多态主要指同一种事物表现出来的多种形态。
语法格式:
父类类型 引用变量名 = new 子类类型();
如:

   Person pw = new Worker();
   pw.show();

解析:

编译阶段调用Person类中show方法,在运行阶段调用Worker类中重写以后的show方法

多态的效果

(1)当父类的引用指向子类的对象时,父类的引用可以直接调用父类独有的方法;
(2)当父类的引用指向子类的对象时,父类的引用不可以直接调用子类独有的方法;
(3)对于父子类都有的非静态成员方法来说,编译阶段调用父类版本,运行阶段调用子类重写以后的版本;
(4)对于父子类都有的静态方法来说,编译和运行阶段调用父类版本,隶属于类层级,因此与指向的对象无关;

引用数据类型之间的转换:

(1)引用数据类型之间的转换分为:自动类型转换和强制类型转换。

其中自动类型转换主要指从小范围到大范围之间的转换,也就是子类到父类的转换
其中强制类型转换主要指从大范围到小范围之间的转换,也就是父类到子类的转换

(2)引用数据类型之间的转换必须发生在父子类之间,否则编译报错。
(3)若转换到的目标类型是子类类型但不是该引用真正指向的子类类型,则编译通过,运行阶段发生类型转换异常。
(4)为了避免上述错误的发生,可以使用instanceof进行判断,具体格式如下:
if(引用变量名 instanceof 数据类型) - 判断引用变量指向的对象是否为后面类型

多态的意义:

多态的实际意义在于可以屏蔽不同子类的差异性实现通用的编程,但可以调用不同的方法带来不同的结果。

抽象类的概念:
抽象方法的概念
抽象方法就是指不能具体实现的方法,也就是没有方法体并使用abstract关键字修饰

语法格式:
访问控制符 abstract 返回值类型 方法名称(形参列表);
如:

  public abstract void cry();  

注意事项:

(1)抽象类中可以有成员变量、构造方法以及成员方法;
(2)抽象类中可以有抽象方法也可以没有抽象方法;
(3)拥有抽象方法的类必须是抽象类,因此严格来说,具有抽象方法并且使用abstract关键字修饰的类才算真正意义上的抽象类。

实际意义:
抽象类的意义不在于自身创建对象而在于被继承,当一个类继承抽象类后必须重写抽象类中的抽象方法,否则该类也变成抽象类。
也就是说抽象类对子类具有强制性和规范性,因此叫做模板设计模式。

经验:
在以后的开发中推荐使用多态的语法格式,当父类的引用指向子类的对象时,那么父类引用直接调用的所有方法一定是父类拥有的方法,若希望更换子类时,只需要将new关键字后面的类型修改而其它地方无需更改立即生效,从而提高了代码的可维护性。
该方式的缺点就是:父类引用不能直接访问子类独有的方法,若访问则需要强转。

接口基本概念:
接口就是一种比抽象类还抽象的类,体现为所有成员方法都是抽象方法。
定义类的关键字是class,而定义接口的关键字是interface。
继承类的关键字是extends,而实现接口的关键字是implements。
类和接口之间的关系:
类和类之间的关系: 使用extends关键字表达继承的关系 支持单继承
类和接口之间的关系: 使用implemets关键字表达实现的关系 支持多实现
接口和接口之间的关系: 使用extends关键字表达继承的关系 支持多继承

抽象类和接口之间的区别(笔试题):
(1)定义抽象类的关键字是abstract class,而定义接口的关键字是interface。
(2)继承抽象类的关键字是extends,而实现接口的关键字是implements。
(3)继承抽象类支持单继承,而实现接口可以多实现。
(4)抽象类中可以有构造方法,而接口中不可以有构造方法。
(5)抽象类中可以有成员变量,而接口中只可以有常量。
(6)抽象类中可以有成员方法,而接口中只可以有抽象方法。
(7)抽象类中增加方法可以不影响子类,而接口中增加方法通常都影响子类。
(8)从jdk1.8开始允许接口中出现非抽象方法,但需要使用default关键字修饰。

匿名内部类:
语法格式:

接口/父类类型 引用变量名 = new 接口/父类类型(){ 方法的重写 };

经验的分享:
当接口类型的引用作为方法的形参时,实参的传递方式有两种:
a.自定义类实现接口,然后创建该类的对象作为实参传递;
b.使用匿名内部类的语法格式来得到接口类型的引用作为实参传递;