Java入门笔记 03-面向对象(中)
介绍:这部分内容主要是介绍和总结封装、继承和多态。
一、 封装:把该隐藏的隐藏起来,把该暴露的暴露出来
封装是指将信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。
1. 访问控制符:
Java提供了三个访问控制符:private、protected和public,以及一个不加任何访问控制符的default访问控制级别,下图描述了访问控制级别从小到大:
2. 访问控制符的使用原则:
- 类里面的绝大部分成员变量都应该使用private修饰,只有一些static修饰的、类似全局变量的成员变量,才可能考虑使用public修饰;
- 有些只用于辅助该类实现的其他方法(工具方法)也应该使用private修饰;
- 某个类主要用作其他类的父类,该类里包含的大部分方法可能仅希望被其子类重写,而不是被外界直接调用,则应该使用protected来修饰;
- 希望暴露出来给其他类自由调用的方法应该使用public修饰。
3. 举例:
public class Person {
private String name;
private int age; public void eat() {
System.out.println("Human:eat");
} public void walk() {
System.out.println("Human:walk");
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} }
二、 继承:extends
1. 继承的特点:Java的继承具有单继承的特点,每个子类只有一个直接父类。
2. 重写父类的方法:子类包含与父类同名的方法的现象被称为方法重写,也被称为方法覆盖。重写需要遵循“两同两小一大”的规则:
- 方法名相同、形参列表相同;
- 子类方法返回值类型以及抛出的 异常应该比父类的更小或相等;
- 子类方法的访问权限应该要比父类方法要更大或相等
如果父类方法具有private访问权限,则该方法对子类是透明的,此时在子类中定义一个与父类同名、同形参列表的private方法时,不是重写,只是在子类中重新定义了一个新方法。
3. super()方法:super不能出现在static修饰的方法中
如果需要在子类方法中调用父类中被覆盖的方法,则可以使用super(被覆盖的事非static方法)或者父类类名(被覆盖的是static方法)来作为调用者进行调用。
4. 调用父类构造器:在子类构造器中调用父类构造器使用super调用来完成,并且必须出现在构造器的第一行。
三、 多态:
如果编译时类型(左边)和运行时类型(右边)不同,就可能出现所谓的多态,即父类的引用指向子类的对象,并且多态性只适用于方法,不适用于属性(成员变量)。
1. 引用变量的强制类型转换:只能在具有继承关系的两个类型之间进行。
- 向上转型:把子类对象赋给父类引用变量,这种转型总是可行的;
- 向下转型:需要使用强制类型转换,并且这个对象必须实际上是子类实例才行(即编译时类型为父类类型,运行时类型是子类类型),否则在运行时会引发ClassCastException异常。
2. instanceof:在进行类型转换前应该通过instanceof运算符来判断前面的对象是否为后面的类或子类或实现类的实例。
Person p2 = new Man();//多态
//************向下转型************
if(p2 instanceof Man) //为了避免ClassCastException,使用instanceof来进行判断
Man m1 = (Man)p2;//使用强制类型转换符
四、 其他:
1. JavaBean:JavaBean是一种Java语言写成的可重用组件,是指符合如下标准的Java类
- 类是公共的
- 有一个无参的公共的构造器
- 有属性,且有对应的get、 set方法
class JavaBeanTest{
private String name;
private int age; public JavaBean() { } public void setName(String n) {
name = n;
} public void setAge(int a) {
age = a;
} public String getName() {
return name;
} public int getAge() {
return age;
}
}
2. 代码块(初始化块):对Java类或对象进行初始化
- 静态代码块:用static 修饰的代码块
1. 可以有输出语句。
2. 可以对类的属性、类的声明进行初始化操作。
3. 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
4. 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
5. 静态代码块的执行要先于非静态代码块。
6. 静态代码块随着类的加载而加载,且只执行一次。
- 非静态代码块:没有static修饰的代码块
1. 可以有输出语句。
2. 可以对类的属性、 类的声明进行初始化操作。
3. 除了调用非静态的结构外, 还可以调用静态的变量或方法。
4. 若有多个非静态的代码块, 那么按照从上到下的顺序依次执行。
5. 每次创建对象的时候, 都会执行一次。 且先于构造器执行。
Java入门笔记 03-面向对象(中)的更多相关文章
- Java学习笔记:03面向对象-接口_多态
1.类的概念 一堆具有共同的成员变量(属性)和成员方法(功能)对象的集合 2.接口的概念 接口是功能的集合,就是方法的集合 接口中只能定义方法,不能定义普通的成员变量 而且接口中的成员方法,必须是抽象 ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
- Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以自由修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
- Java入门姿势【面向对象3】构造方法及其重载_方法的调用
上次我为大家写出啦"定义类与创建对象_了解局部变量",上篇文章代码可能较多,如没有了解透彻的话请打开下方文章在进行观看一下哦!! [Java入门姿势[面向对象2]定义类与创建对象_ ...
- [Java入门笔记] 面向对象三大特征之:封装
了解封装 什么是封装? 在Java的面向对象程序设计中,有三大基本特征:封装.继承和多态.首先我们先来看看封装: 在Java的面对对象程序设计中,封装(Encapsulation)是指一种将函数功能实 ...
- Java入门笔记 00-前言&目录
前言:这本笔记记录的是Java基础部分的学习内容,大部分内容总结性的,包括: ---01 Java基础语法 ---02 数组 ---03 面向对象 ---04 异常处理 ---05 多线程 ---06 ...
- [Java入门笔记] Java语言简介
前言 学习Java有一段时间了,但是一直缺少一个系统的思想,现在重新通过书籍中.网上的文章,视频等资料,整理与回顾Java的知识点. 言归正传,让我们先从了解Java语言开始. Java语言的由来 J ...
- Java 学习笔记(4)——面向对象
现在一般的语言都支持面向对象,而java更是将其做到很过分的地步,java是强制使用面向对象的写法,简单的写一个Hello Word都必须使用面向对象,这也是当初我很反感它的一点,当然现在也是很不喜欢 ...
- [Java入门笔记] 面向对象三大特征之:继承
理解什么是继承 首先我们知道,面对对象有三大特征: 封装:解决了数据的安全性问题 继承:解决了代码的重用问题 多态:解决了程序的扩展问题 上一篇博客中,我们了解了一下封装,现在我了再来看看什么是继承. ...
- [Java入门笔记] 面向对象编程基础(三):成员变量和局部变量
在类中,变量根据定义的位置不同,可以分为成员变量和局部变量.
随机推荐
- JS jQuery 点击页面弹出文字
<style> .animate{ animation:myfirst 3s; -moz-user-select:none;/*火狐*/ -webkit-user-select:none; ...
- django 自定义url转换器
django内置的url转换器,包括有int.str.uuid等等.但是有时候他们不能满足我们的需求,因此就需要使用自定义url转换器.自定义url转换器的五步:1.定义一个类,直接继承自object ...
- I/O多路复用select/poll/epoll
前言 早期操作系统通常将进程中可创建的线程数限制在一个较低的阈值,大约几百个.因此, 操作系统会提供一些高效的方法来实现多路IO,例如Unix的select和poll.现代操作系统中,线程数已经得到了 ...
- koa2第一天 安装koa2
安装全局koa2:npm install -g koa2 -generator 创建一个koa2文件夹:koa2 -e koa2 进入koa2文件夹:cd koa2 安装npm模块:npm insta ...
- 测试理论 - Test Double
概述 简述 test double mock, fake 之类的东西 背景 最近在看 google 软件测试之道 妈的 13 年的老书了 书里有提到 mock, fake, stub 刚好, 我又不太 ...
- android .9背景图作为TextView背景时文字无法居中问题
问题产生原因: .9图黑色边框绘制伸缩区域有问题,重叠的最大区域是TextView文字所能显示的区域 如下图所示,横向和纵向最大重叠部分就是文字可显示部分,这个图作为背景后文字整体偏下,无法上下居中对 ...
- 从相亲的角度理解 K8S 的 Node Affinity, Taints 与 Tolerations
这是昨天晚上阅读园子里的2篇 k8s 博文时产生的想法,在随笔中记录一下. 这2篇博文是 K8S调度之节点亲和性 与 K8S调度之Taints and Tolerations . 如果我们把 node ...
- AcWing 868. 筛质数 线性筛法
#include <iostream> #include <algorithm> using namespace std; ; int primes[N], cnt; bool ...
- Linux - gitlab的命令
启动 sudo gitlab-ctl start 关闭 sudo gitlab-ctl stop 重新加载配置文件 sudo gitlab-ctl reconfigure 在本地初始化一个本地仓库 g ...
- Caffe 笔记 (一)caffe的层与数据结构
Caffe是纯粹的C++/CUDA架构,支持命令行.Python和MATLAB接口:可以在CPU和GPU直接无缝切换: Caffe::set_mode(Caffe::GPU); Caffe的优势 1. ...