封装
一个封装的简单例子
封装就是把对象的属性(状态)和方法(行为)结合在一起,并尽可能隐蔽对象的内部细节,成为一个不可分割的独立单位(即对象),对外形成一个边界,只保留有限的对外接口使之与外部发生联系。
封装的原则:使对象以外的部分不能随意存取对象的内部数据,从而有效的避免了外部错误对它的“交叉感染”。数据隐藏特性提升了系统安全性,使软件错误能够局部化,减少查错和排错的难度。如:微波炉,将线路板(属性)封装在微波炉内部,使用者无法接触到,而通过面板按钮(方法)简单的操控线路板工作。
设计一个CBox类,具有length、width和height三个属性,对每个属性都提供相应的get和set方法,提供构造函数,完成CBox信息的初始化,增加volume()方法,用来计算CBox对象的体积,定义surfaceArea()方法用来计算CBox的表面积。
面向对象的三个特征:
package ch01;
public class test
{
private int height;
private int length;
private int width;
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public test(int height, int length, int width)
{
this.height = height;
this.length = length;
this.width = width;
}
public int volume()
{
return length * width * height;
}
public int Area()
{
return 2* (length*width+length*height+width*height);
}
public static void main(String[] args) {
test cb = new test(10,20,30);
int x = cb.volume();
int y = cb.Area();
System.out.println(x);
System.out.println(y);
}
}
对于代码中快速生成的get
和set
和public test(int height, int length, int width)
这样的初始化,在eclipse 中都会有快捷的方法,可以在任意一个光标闪烁出单机右键,找到source
然后就有了,不要问是什么0·0,因为单词太长了,不想写......
继承
继承是软件重用的一种形式,它通过重用现有类的属性和方法,并增加新功能或修改现有功能来构建新的类。如:“人”这个类抽象了这个群体的一般特性,“学生”和“老师”都具备“人”所定义的一般性,但其各自又有各自的特殊性,在保持了一般性和特殊性的情况下,作为一个新类而存在。
- 表现的是一种共性和特性的关系,一个类可以继承另一个类,并在此基础上添加自己特有功能,这称为继承。在java中使用extends关键字表现继承关系。
格式:
[访问符][修饰符] class <子类名> extends <父类名>{
[属性] //成员变量
[方法] //成员
}
public tiger extends animal{
}
下面通过一个简单的例子进行说明
教师和学生类的属性列表
教师类(Teacher) | 学生类(Student) | |
---|---|---|
姓名 | name | 姓名 |
年龄 | age | 年龄 |
性别 | gender | 性别 |
工资 | salary | 成绩 |
所属院系 | department | 年级 |
从上图分析可以看出,教师类和学生类在姓名、年龄、性别上存在共同性,而教师类有两个属性工资和所属院系区别学生类的成绩和年级。
程序实现
父类person
package com.wfu.ch04;
public class Person {
private String name;//进行封装处理
private int age;
private String gender;
public Person(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
System.out.println("父类Person的带参数的构造方法");
}
public Person(){
System.out.println("父类Person的不带参数的构造方法");
}
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;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public void output(){
System.out.println("姓名:" +name);
System.out.println("性别:" +gender);
System.out.println("年龄:" +age);
}
}
子类Student
package com.wfu.ch04;
public class Student extends Person {
private double score;
private String grade;
public Student(double score, String grade) {
this.score = score;
this.grade = grade;
System.out.println("子类Student的带参数的构造方法");
}
public Student(String name, int age, String gender, double score,
String grade) {
super(name, age, gender);
this.score = score;
this.grade = grade;
System.out.println("子类Student的带参数的构造方法,显式调用父类的带参数的构造方法");
}
public Student(){
System.out.println("子类Student的不带参数的构造方法");
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
public String getGrade() {
return grade;
}
public void setGrade(String grade) {
this.grade = grade;
}
public void output(){
super.output();
System.out.println("成绩:" +score);
System.out.println("年级:" +grade);
}
}
子类Teacher
package com.wfu.ch04;
public class Teacher extends Person{
private double salary;
private String department;
public Teacher(double salary,String department) {
this.salary = salary;
this.department = department;
System.out.println("子类Teacher的带参数的构造方法");
}
public Teacher(){
System.out.println("子类Teacher的不带参数的构造方法");
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public void output(){
System.out.println("工资:" +salary);
System.out.println("所属院系:" +department);
}
}
测试类TestClass
package com.wfu.ch04;
public class TestClass {
public static void main(String[] args) {
// Person p=new Person();
// p.output();
// Teacher t=new Teacher();
// t.output();
Student s=new Student("tom",20,"male",89,"2016");
s.output();
}
}
继承的特性
- (1)Java是单继承的,即一个子类只能继承一个父类,被继承的类叫做父类(超类),继承的类叫做子类(派生类)。
- (2)在继承过程中,子类拥有父类定义的
所有属性和方法
,但父类可以通过封装思想隐藏某些数据,然后提供子类可以访问的属性和方法。
//在父类Person中
private String name;//进行封装处理
private int age;
private String gender;
- (3)当生成子类对象时,Java默认
首先调用父类
的不带参数
的构造方法,然后执行该构造方法,生成父类的对象,再去调用子类的构造方法,生成子类的对象。要想生成子类的对象,首先生成父类的对象,没有父类对象就没有子类对象。
//例如在测试类中如果只写
Teacher t=new Teacher();
t.output();//运行结果是先把父类中不带参数的类执行,然后再执行 t.output() 方法
- (4)如果一个类没有指明任何父类,则缺省的自动继承java.lang.Object类。Object类是所有类的*父类,在java中,所有类都是直接或间接的继承了Object类。
- super关键字:super关键字代表父类对象,主要有两个用途:
1)调用父类的构造方法
super表示对父类对象的引用。如果子类使用super()显示调用父类的某个构造方法,那么在执行的时候就会寻找与super()所对应的构造方法而不再去寻找父类的不带参数的构造方法。super必须作为构造方法的第一条语句,前面不能有其他的可执行语句。
2)访问父类的属性和方法
当子类的属性或方法与父类的属性或方法重名时,可用super.属性名或super.方法名(参数列表)的方式访问父类的属性或方法。
//在测试类中
Student s=new Student("tom",20,"male",89,"2016");
s.output();
//这段代码智能输出“成绩”和“年级”,因为会先调用父类的默认的不带参数的方法,而这时父类的不带参数的构造方法是什么都没有的,我们原本的意思是吧“姓名”、“年龄”、“性别”、这三个也输出。这时就要用到super
应该写成:
super.output();
Student s=new Student("tom",20,"male",89,"2016");
s.output();
多态
多态:多态是指在父类中定义的属性或方法被子类继承之后,可以具有不同的表现行为。这使得同一个属性或方法在父类及其各个子类中具有不同的语义。如:动物会“叫”,“猫”和“鸟”都是动物的子类,但其“叫”声是不同的
重写
当子类继承父类时,可以在子类中直接使用父类的属性和方法。如果父类的方法无法满足子类的需求,则可以在子类中对父类的方法进行改造,这称为方法的重写,重写是java多态性的一种体现。
- (1)、方法重写:又叫做覆写,子类与父类的方法返回值类型一样,方法名称一样,参数一样,这样我们说子类与父类的方法构成了重写关系。若给子类的run方法添加一个参数,则不叫重写。分别调用带参数的run和不带参数的run来执行一下。
public class Test2 {
public static void main(String[] args) {
Dog dog=new Dog();
dog.run();
}
}
class Animal{
public void run(){
System.out.println("Animal is running!");
}
}
class Dog extends Animal{
public void run(){
System.out.println("Dog is running!");
}
}
- (2)、方法重写与方法重载之间的关系:重载发生在同一个类内部的两个或多个方法。重写发生在父类与子类之间。
- (3)、方法重写需要遵循以下几点:
重写的方法的签名必须要和被重写的方法的签名完全匹配;
重写的方法的返回值必须和被重写的方法的返回一致或者是其子类;
重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
私有方法不能被重写子类重写父类方法的过程中,可访问性只能一样或变的更公开。 - 我们说子类就是父类(玫瑰是花,男人是人),因此多态的意思是:父类型的引用可以指向子类的对象。
(1)多态:父类型的引用可以指向子类型的对象。
public class Test3 {
public static void main(String[] args) {
Flower flower=new Rose();//多态
flower.sing();
}
}
class Flower{
public void sing(){
System.out.println("Flower is sing.");
}
}
class Rose extends Flower{
}
花是花,玫瑰是玫瑰,玫瑰是花,但花是玫瑰是错误的,花是玫瑰,那么康乃馨呢是花吗?对不对呀。
(2)、Flower flower=new Rose();
当使用多态方式调用方法时,首先检查父类中是否有Sing方法,如果有,则去调用子类的sing方法(不管是继承的还是重写的)。如果没有则编译错误。因为flower是一个Flower类型的变量,如果Flower类型没有这个sing方法,则无法调用。
java 学习笔记——类之间的关系之封装、继承与多态的详解的更多相关文章
-
Java 中类与类之间的关系
在java中类和类之间的关系基本上有依赖.关联.聚合.组合等 一.继承关系 继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在J ...
-
Java基础 【类之间的关系】
在Java与其他面向对象设计语言中,类之间常见的关系有6种 分别是: 依赖.关联.聚合.组合.继承.实现,他们的耦合度依次增强. 其中,关联.聚合.组合关系仅仅是在语义上有所区别,所谓语义就是指上下 ...
-
Java学习笔记--类和对象
1.介绍面向对象的编程 面向对象是现在主流的编程样例,它替代了以前C语言使用时的“结构体”,Java是一门面向对象的语言,所以需要熟悉面向对象的概念.面向对象的程序由很多对象组成,每 ...
-
UML学习笔记之类之间的关系
1. 导航关系(Directed Association) A类有一个成员变量保存B的引用. 2.包含关系(Aggregation.Composition) (1)弱包含 含义:每个部门包含多个 ...
-
linux初级学习笔记七:linux用户管理,密码和组命令详解!(视频序号:04_1)
本节学习的命令: 用户管理命令:useradd,userdel,id,finger,usermod,chsh,chfn,passwd,pwck, 组管理命令:groupadd,groupmod,gro ...
-
web前端学习(四)JavaScript学习笔记部分(7)-- JavaScript DOM对象控制HTML元素详解
1.方法 getElementsByName() 获取name 可以获取一个数组类型数据(参数加引号) getElementsByTagName() 获取元素 getAttribute() 获取元 ...
-
Java学习笔记之---面向对象
Java学习笔记之---面向对象 (一)封装 (1)封装的优点 良好的封装能够减少耦合. 类内部的结构可以*修改. 可以对成员变量进行更精确的控制. 隐藏信息,实现细节. (2)实现封装的步骤 1. ...
-
Java学习笔记(面向对象上)
面向对象(上) 面向对象的特点:封装性(是面向对象的核心思想,将对象的属性和行为封装起来).继承性(主要描述类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展)和多态 ...
-
python基础学习笔记——类空间问题以及类之间的关系
一. 类的空间问题 1.1 何处可以添加对象属性 class A: def __init__(self,name): self.name = name def func(self,sex): self ...
随机推荐
-
java json数据的处理
// 返回documentBuilderFactory对象 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); ...
-
:before和 :after
:before和:after的作用就是在指定的元素内容(而不是元素本身)之前或者之后插入一个包含content属性指定内容的行内元素,最基本的用法如下: #example:before { conte ...
-
仿造slither.io第一步:先画条蛇
前言 最近 slither.io 貌似特别火,中午的时候,同事们都在玩,包括我自己也是玩的不亦乐乎. 好久好久没折腾过canvas相关的我也是觉得是时候再折腾一番啦,所以就试着仿造一下吧.楼主也没写过 ...
-
iOS 使用XCode6打开项目以后再用XCode5出现的问题fatal error: malformed or corrupted AST file: &#39;Unable to load module
使用不同版本的XCode出现的问题: fatal error: malformed or corrupted AST file: 'Unable to load module "/Users ...
-
如何在Windows 下安装Python
1. 安装源程序的选择 官网:https://www.python.org/downloads/ 选择版本下载,根据实际计算机位数(64位),下载的为: Python-2.7.10.amd64.ms ...
-
Andoir 判断软键盘是否弹出
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
-
【转】关于android的输入法弹出来 覆盖输入框的有关问题
今天发现一个问题,在录入信息页面.信息不多,但是输入法弹起后,内容已经超出页面,无滚动条,很不方便. 解决办法:在配置文件中,页面对应的Activity中添加 <activity android ...
-
vim命令---存阅
命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filename 打开vim ...
-
c/c++ 网络编程 UDP 改变网卡的硬件地址
网络编程 UDP 改变网卡的硬件地址 在程序里动态改变网卡的硬件地址 1,取得网卡的硬件地址 #include <stdio.h> #include <string.h> #i ...
-
Java程序入口:main()方法讲解
Java程序的入口---main()方法的签名为:public static void main(String[] args) {...} ,其中, ♦ public修饰符:Java类由JVM调用,为 ...