Java面向对象三大特性之【封装】

继承

文章目录

    • 继承
      • 代码块
        • 概述
        • 局部代码块
          • 代码示例:
        • 构造代码块
        • 静态代码块【常用】
      • 继承
        • 继承的概述
          • 代码示例1 没有使用继承
          • 代码示例2 使用继承
        • 继承的好处和弊端
        • 继承的注意事项
        • 继承中成员变量的关系
          • 代码示例:
        • 关键字this和super的详细解释
        • this和super使用总结
        • 继承中构造方法的关系
      • 重写
        • 代码示例:
        • 重写的注意事项
        • 访问修饰符修饰类:
      • Java中继承的特点
      • final关键字

代码块

概述

1、使用大括号包起来的一段代码。放在不同的位置,有不同的名称,有不同的作用,有不同的执行时机。

2、分类:

局部代码块

构造代码块

静态代码块

同步代码块(多线程)

局部代码块

1、格式:使用大括号包起来的一段代码

2、位置:方法中

3、作用:

限定变量的生命周期,作用域只是在大括号内部

在局部代码块中【声明】的变量,只能在局部代码块的范围内使用,一旦出了局部代码块的大括号,变量就不能继续使用了。

某个变量一旦不能使用了,就会被回收,节省内存空间

4、注意事项:

如果是在局部代码块中声明了变量,会减少变量的声明周期,出了局部代码块就无法继续使用局部代码块中声明的变量。

如果是在局部代码块中修改了局部代码块外声明的变量,局部代码块结束之后,并不会消除局部代码块对这个变量的修改。

代码示例:
public static void main(String[] args) {int i = 10;{System.out.println(i);//10i = 20;int j = 100;System.out.println(j);//100}System.out.println(i);//20,局部代码块只对其中声明的变量有效果,对于变量的使用还是和以前一样//System.out.println(j);不能访问局部代码块中声明的变量
}
构造代码块

1、格式:使用大括号包起来的一段代码

2、位置:类中方法外

3、作用:

用于给成员变量初始化赋值

4、构造代码块的执行说明:

1、在创建对象的时候执行,由jvm默认调用

2、在构造方法执行之前,执行

3、任意一个构造方法执行之前,都会执行一次构造代码块的内容

4、如果每个构造方法都会执行的内容,请提取到构造代码块中执行

静态代码块【常用】

1、格式:

static {

静态代码块的内容

}

2、位置:类中方法外

3、作用:

用于给静态的成员变量初始化赋值

用于执行那些只需要执行一次的代码,例如驱动加载等

4、执行特点:

1、随着类的加载而执行

2、类只加载一次,所以静态代码块只执行一次

3、执行的时机最早:早于所有的对象相关内容,比main方法执行的早

继承

继承的概述

1、让类与类产生关系,子父类的关系

2、关键字:extends,扩展、增加、继承

3、父类和子类:

父类:被继承的类,超类、基类

子类:用于继承的类,派生类

代码示例1 没有使用继承
代码示例2 使用继承
继承的好处和弊端

1、好处:

提高了代码的复用性

提高了代码的可维护性

是多态的前提

2、弊端:

提高了代码的耦合性

耦合性:事物与事物之间的依赖关系,互相影响的程度

3、开发原则:面向对象最终要实现得目的

​ 高内聚:(一个对象自己可以完成各种事情)

​ 低耦合 :(对于其他代码的依赖性非常低)

​ 代码的复用性高

继承的注意事项

1、私有的成员不能被继承

​ 父类中有一些私有成员,不能在子类中直接使用

2、父类中的构造方法,不能继承

​ 原因:

父类的构造方法需要和父类的类名一致、子类的构造方法需要和子类类名一致,父类和子类的类名不一样。因此无法继承,名称有冲突。

父类的构造方法用于给父类的成员变量赋值,子类的构造方法用于给子类的成员变量赋值,子类的成员变量较多,使用父类的构造方法无法将子类中所有的成员变量都进行赋值,因此不继承父类的构造方法。

解决:

子类不继承父类的构造,但是可以【调用】父类的构造方法。Super

3、继承的设计:不要为了部分功能而定义继承

程序员类:姓名、年龄、工号、工资、工作

项目经理:姓名、年龄、工号、工资、工作、奖金

继承关系:子类是父类的一种, is a,狗是动物的一种

解决:将程序员和项目经理向上抽取一个“员工类”

继承中成员变量的关系

1、在子父类中定义了不同名称的成员变量,在子类中,既可以访问子类的成员变量,也可以访问父类的成员变量。

2、在子父类中定义了同名的成员变量,在子类中,根据就近原则来访问

在子类的方法中,如果访问了某个变量名称,优先在当前方法中,寻找该变量的定义,如果找到了就使用方法中的局部变量;如果没有找到,就到子类的成员位置寻找该变量的定义,如果找到了就使用子类的成员变量;如果没有找到,就到父类的成员位置寻找该变量的定义…一直往上找,一直到Object类中,如果还没有找到,就编译报错。

代码示例:
public class Test01 {public static void main(String[] args) {Fu f = new Fu();System.out.println(f.a);//10//System.out.println(f.b);在父类中没有定义bZi z = new Zi();System.out.println(z.a);//10System.out.println(z.b);//20z.test();}
}class Fu {int a = 10;int c = 10;
}class Zi extends Fu {int b = 20;int a = 100;/*public void test(int a) {System.out.println(a);//1000}*/public void test() {System.out.println(a);//100}public void test2() {System.out.println(c);//10//System.out.println(d);找不到d这个变量符号  编译报错}
}
关键字this和super的详细解释

1、this和super:

​ this表示本类当前对象的引用

​ super表示本类当前对象父类的引用

this和super使用总结

1、含义:

this关键字表示本类当前对象的引用

哪个对象在调用this所在的方法,this就表示哪个对象

super关键字表示本类当前对象的父类的引用

哪个对象在调用super所在的方法,super就表示哪个对象中的父类部分的数据

继承中构造方法的关系

1、在初始化子类数据之前,必须先完成对父类数据的初始化(因为在初始化子类数据的时候,可能会使用到父类中的数据,所以必须先把父类数据准备好)

2、如果在子类的构造方法中,没有显式的调用任何其他构造方法(本类、父类),在构造方法的第一句,系统默认给你加上super(),默认要访问父类的空参构造

3、如果在子类的构造方法中,手动增加了访问父类的构造方法,那么系统将不给你增加任何构造方法的访问

4、如果在子类的构造方法中,手动增加了访问本类的其他构造方法,那么系统将不给你增加任何构造方法的访问

5、构造方法不能递归调用

​ 构造方法不能自己直接访问自己,也不能自己间接的访问自己

​ this();

​ this(color);

6、总结:

1、【目标】子类的构造方法,一定要先访问父类的构造方法

2、特点:

【this语句】和【super语句】必须在构造方法的第一行

​ super语句在第一句是为了保证父类的构造方法必须先执行

在构造方法中,【this语句】和【super语句】不能共存

​ 因为: this语句和super语句都要在构造方法的第一行

【this语句】和【super语句】不能出现在其他非构造方法的非静态成员方法中

重写

1、在子父类中,出现了不同名的方法

子类可以直接调用父类的方法,也可以调用子类的特有方法

2、在子父类中,出现了同名的方法

在子父类中,出现了一模一样的方法声明,而两个方法的实现内容却不一样

作用:在子类中,如果你不想修改父类中的方法声明,但是还想修改方法的实现内容,这时候就需要使用重写。

3、方法的重写和方法的重载:

重载:在同一个类中,方法名相同,参数列表不同,与返回值类型无关

重写:在子父类中,方法名相同,参数列表相同,与返回值类型有关(相同)

别名:Override,覆写、覆盖

4、方法重写的检查:

关键字: @Override

让编译器帮助我们检查,当前的这个方法,究竟是否是对父类方法的重写。

5、说明:

方法本身还是属于父类,只是在子类中重新实现了这个方法的内容。

代码示例:
public class Test01 {public static void main(String[] args) {DayOne d = new DayOne();d.唱红歌();d.泡妞();}
}class DoubleRiver {public void 唱红歌() {System.out.println("小小竹筏江中游");}public void 泡妞() {System.out.println("通过唱红歌搞定林夕合鸟女士");}
}class DayOne extends DoubleRiver {@Overridepublic void 泡妞() {System.out.println("霸王硬上弓");}
}
重写的注意事项

1、私有的方法不能被重写

父类中私有的方法,在子类中根本就看不到,继承不下来,就不能重写。子类可以自己定义一个和父类私有方法同名的方法,也不算重写,只能算是新定义了一个方法。

重写:使用父类的方法定义,修改为子类的实现。

2、方法在重写的时候,权限不能越来越小

3、访问修饰符:

​ 子类应该是越来越强大,功能越来越多,将父类中拥有的方法,重写没了。

​ java的四个关键字:public、protected、default、private

​ 适用范围<访问权限范围越小,安全性越高>

image-20201119151659662

访问修饰符修饰类:

private(私有的)无法访问:使用private关键字,就意味着被声明的成员或方法,除了本类,其他任何类都无法访问。

public(公共的)接口访问权限:使用public关键字,就意味着被声明的成员或方法对所有类都是可以访问的。

protected(受保护的)继承访问权限:使用protected关键字,就意味着被声明的成员或方法,在子类以及相同包内的其他类都是可以访问的。

default(默认的)包访问权限:即不写任何关键字,就意味着相同包内的其他类(包括子类)可以访问,包外都不可以访问。

Java中继承的特点

1、Java支持单继承,不支持多继承,java支持多层继承

单继承:一个子类只能继承一个父类(一个孩子只能有一个亲爹)

多继承:一个子类不能同时继承多个父类

多层继承:A类可以继承B类,B类可以继承C类,A类中拥有B、C类中的所有属性和方法。说明:越是顶层的类,定义的功能越是共性功能,功能和属性就越少;越是底层的类,定义的特有功能和属性就越多,就更加强大。学习一个体系的时候,先学顶层的类,共性功能学习完,学习底层特有的方法即可;使用一个类创建对象的时候,选择底层的类型,功能更多更强大。

2、原因:

如果支持多继承,那么可能一个子类继承了两个父类,两个父类中有相同的方法声明,却拥有不同的方法实现。子类继承之后,就不知道该走哪个父类的方法实现了。(安全隐患)

final关键字

1、单词含义:最终的,最后的,表示不能再改变的。

2、final关键字:可以修饰类、方法、变量

3、修饰类:

表示一个最终类,表示不能有子类,【不能被其他类继承】

一旦一个类型不能被继承,那么其中所有的方法都不能被重写

不影响当前类的方法被调用

4、修饰方法:

表示一个最终方法,【该方法不能被重写】,

父类中被final修饰的方法 子类是可以继承到的

5、修饰变量:

表示一个最终变量,该【变量变成了常量】,就只能赋值一次,不能二次赋值了

当前项目中,常用的常量一般都定义在一个类的成员位置,甚至专门定义一个常量类

定义常量的好处:见名知意,容易理解;可维护性高

public static final double PI = 3.14;


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部