网站首页 > java教程 正文
封装
封装包含两方面含义:
- 隐藏:将内部实现细节隐藏
- 暴露:通过暴露的接口来操作对象。
封装的要求:合理隐藏,合理暴露。
封装主要是通过访问控制修饰符来实现
在 Java 中,实例变量通常使用private来修饰,将其隐藏。并提供相应的getter、setter方法,来控制该成员变量的访问。
如下代码所示,User类中有一个成员变量(name),要求name的长度在 10 位以内。
class User {
private String name;
public void setName(String name){
if (name.length > 10) {
System.out.println("名称长度必须在10位以内!");
return;
}
this.name = name;
}
public String getName() {
return this.name;
}
}
继承
继承最大好处是代码复用。
Java 中继承是类与类之间的关系(而非对象与对象之间的关系),是一种由一般到特殊的关系(如苹果类(子类、派生类)继承了水果类(父类、超类、基类)),子类的实例可以当作父类的实例来使用。
在 Java 中,继承通过如下语法定义:
[修饰符] class 子类名 extends 父类 {
// ...
}
注意:
- Java 是单继承父类,只能有 1 个直接继承的父类。
- 如果不显式继承父类,Java 默认继承Object类。
子类可以调用父类非private修饰的成员变量、方法(见上方访问控制表格)。
多态
多态是指同一个类型的多个实例,在执行同一个方法时,呈现出多种行为特征。
变量的类型
编译时类型:声明该变量时指定的类型。在 Java 程序编译阶段,Java 编译器只认编译时类型。当调用子类有而父类没有的方法,且使用向上转型时,编译器将报错。
运行时类型:该变量实际所引用的类型。
向上转型
子类的对象可以直接赋值给父类变量,其可以自动完成。
例如,Ostrich类继承了Bird类,那么定义Ostrich实例时可以进行如下定义:
class Bird {
public void fly() {
System.out.println("飞咯~");
}
}
class Ostrich extends Bird {
@Override
public void fly() {
System.out.println("不会飞呀~");
}
}
public class Test {
public static void main(String[] args){
Bird b1 = new Bird();
Bird b2 = new Ostrich();
b1.fly(); // 飞咯~
b2.fly(); // 不会飞呀~
}
}
向下转型 (强制转换)
当使用向上转型特性时,想要调用子类方法时,需要强制转换成对应类型。
class Bird {
public void fly() {
System.out.println("飞咯~");
}
}
class Ostrich extends Bird {
public void run() {
System.out.println("跑得快呢");
}
}
public class Test {
public static void main(String[] args){
Bird b1 = new Ostrich();
// b1.run(); // 无法编译
Ostrich b2 = (Ostrich) b1;
b2.run(); // 正常编译
}
}
注意:
- 强转运算符只能在编译类型具有继承关系的变量之间进行强转,否则编译将会报错(如String类型强转成Integer)。
- 如果在编译类型具有继承关系的变量之间转换时,如果被转变量的实际类型不是要转换的目标类型,程序就会引发ClassCastException异常。
instanceof
为了避免ClassCastException异常,Java 提供了instanceof运算符。格式是变量名 instanceof 类型,当变量所引用的对象是后面类或子类的实例时,返回true。
instanceof 只能在具有继承关系的变量之间进行强转,否则编译将会报错,故当变量与类之间没有关系时,也不会返回false。
例如:
class Fruit {}
class Apple {}
public class Test {
public static void main(String[] args){
Fruit fruit = new Apple();
if(fruit instanceof Apple) {
Apple apple = (Apple)fruit;
}
}
}
从 Java 16 开始,instanceof 运算符得到了升级。见本文最后Java 16 增强的 instanceof。
猜你喜欢
- 2024-11-11 Java面向对象有哪些特征,如何应用
- 2024-11-11 JAVA面向对象的三个基本特征?(java面向对象的三大特征是)
- 2024-11-11 面向对象2 - 三大特性(面向对象三大特征六大原则)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)