OOP⑸
1.封装:
继承: extends java只支持单根继承!(一个类只能有一个直接的父类)
是代码重用的一种方式! 将子类共有的属性和方法提取到父类中去! Object:超类/基类==》java中所有类的父类!
Class: 所有类的实例都是Class类的对象! 反射讲解!!! 我们随便创建任何一个类,都是Object类的子类!
那么Object类中的行为!我们创建的这个类也有! 为什么??
因为 继承! 子类中可以访问父类的:
所有不是private修饰的方法以及属性 如果一个类是由final修饰的! 那么这个类不允许由子类! super关键字:
只能出现在子类的方法或者构造方法中!
如果出现在了构造方法中,只能是第一句!
super.属性 访问父类的属性
super.方法 访问父类的方法 多重继承关系的初始化顺序:
01.父类的属性
02.父类的构造
03.子类的属性
04.子类的构造
方法的重写:
01.有继承关系
02.不同类!子类重写父类的方法!
03.方法名相同,参数列表相同
04.重写方法的访问修饰符不能严于父类!
05.如果父类的方法返回值 是一个父类!返回值类型可以是父类,也可以是子类!
06.父类的静态方法不允许被重写!但是子类中可以有同名的方法!
07.父类私有的方法 ,子类无法重写! 例子:
我要买小动物!
我卖给你一个小猫咪!
我卖给你一个小狗!
2.代码案例:
/**
* Student 和 Teacher类的父类
*
*
* 我们把两个子类中共有的属性和方法提取到父类中!
*
*/
public class Person {
private int age; // 年龄
private String name; // 姓名
private String address; // 地址 /**
* shift + alt +s +r 生成本类所有属性的set()和get
*/
public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} /**
* @Override 重写父类的方法
*/
@Override
public String toString() {
return "age:" + this.age + "name:" + this.name + "address:"
+ this.address;
}
}
/**
* 学生类
*
* 查看父类的信息:
* 01.选中类名 F4
* 02.shift+alt+s 之后选择 override/implments methods 就会发现当前类所对应的父类
*
*/
public class Student extends Person { }
封装
/**
* 教师类
*
* 我们发现 student类和 teacher类 都有共同的 age,name,address属性!
* 如果我们又创建了一个Driver类 (司机类),应该也有 age,name,address属性!
*
* 这时候我们发现这些属性是不是都 重复了??
* 有没有一种方式可以优化一下???
* 使用继承!!!!
*
*/
public class Teacher extends Person { }
封装
public class PersonTest {
public static void main(String[] args) {
// 创建了一个学生对象
Student stu = new Student();
stu.setName("张三");
stu.setAge(50);
stu.setAddress("天堂");
/**
* 输出学生对象
* cn.bdqn.bean.Student@2b0a141e
* cn.bdqn.bean.Student 全类名/完整限定名
* @2b0a141e ???
*
* 只要是我们创建的一个类,默认都是继承Object!
* 我们创建的类 是 引用数据类型!
*
* 我们通过类可以创建N个对象!
* 如果我们直接输出了对象!
* 那么就会默认执行Object类中的toString()
*/
System.out.println(stu);
// 创建一个教师对象
Teacher tea = new Teacher();
tea.setName("李四");
tea.setAge(50);
tea.setAddress("地域");
// 输出教师对象
System.out.println(tea);
}
}
public class Student {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
public Student() {
super();
}
/**
* 重写Object类的方法
*/
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}
/**
* 重写Object类中的equals
* @param obj 就是用户需要比较内容的对象
*/
@Override
public boolean equals(Object obj) {
// 01.先判断内存地址是否一致
if (this == obj) {
return true;
}
// 02.判断obj的类型
if (!(obj instanceof Student)) { // 说明obj根本不是Student类型
return false;
}
// 03.向下转型
Student stu = (Student) obj;
// 04.开始判断两个对象的属性值是否一致
if (stu.getAge() == this.age && stu.getName().equals(this.name)) {
return true;
}
return false;
}
}
重写Object类中的equals
public class StudentTest {
/**
* 基本数据类型 ==比较的是值!
* 引用数据类型 ==比较的是内存地址!
*/
public static void main(String[] args) {
Student stu1 = new Student(25, "小黑");
Student stu2 = new Student(25, "小黑");
System.out.println(stu1 == stu2);
/**
* equals在object类中 执行的就是 == 比较的是内存地址!
*/
System.out.println(stu1.equals(stu2));
}
}
重写Object类中的equals
public class Animal {
private int age;// 所有动物共有的!
/**
* 所有动物共同的方法
*/
public void eat() {
System.out.println("所有动物共同的吃饭");
}
/**
* @return 购买小动物的方法
*/
public Animal saleAnimal() {
return new Animal();
}
/**
* 验证父类的静态方法不允许被重写
*
* 在子类中使用shift +alt +s override methods 不会看到这个sayHello()
* 说明不能被重写
*/
public static void sayHello() {
System.out.println("所有小动物打招呼的方法");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/**
* 小猫类
*/
public class Cat extends Animal {
private String name; // 小猫特有的!!!! public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} /**
* 小猫吃鱼的方法
*/
@Override
public void eat() {
System.out.println("小猫吃鱼的方法");
} /**
* 验证方法的返回值是父类也可以是子类
*/
@Override
public Cat saleAnimal() {
return new Cat();
} @Override
public String toString() {
return "Cat [name=" + name + "age=" + super.getAge() + "]";
} }
继承和方法的重写
/**
* 小狗类
*/
public class Dog extends Animal {
private String strain;// 小狗特有的!!!! public String getStrain() {
return strain;
} public void setStrain(String strain) {
this.strain = strain;
} /**
* 小狗在吃骨头的方法
*/
@Override
public void eat() {
System.out.println("小狗在吃骨头!");
} /**
* 验证方法的返回值是父类也可以是子类
*/
@Override
public Dog saleAnimal() {
return new Dog();
} @Override
public String toString() {
return "Dog [strain=" + strain + "age=" + super.getAge() + "]";
} }
public class AnimalTest {
public static void main(String[] args) {
// 创建一个小猫咪和一个小狗狗
Cat cat = new Cat();
cat.setAge(20);
cat.setName("小猫猫");
cat.eat(); // 自己特有的
Dog dog = new Dog();
dog.setAge(25);
dog.setStrain("藏獒");
dog.eat();// 自己特有的
}
}
继承和方法的重写
OOP⑸的更多相关文章
- c#面向对象基础技能——学习笔记(二)基于OOP思想研究对象的【属性】
字段(成员变量): 字段只能从对象中访问实例字段,无法直接从类中访问(换言之,不创建实例就不能访问),可以理解为:字段一般用在内部数据交互使用,当需要为外部提供数据时,(要优先使用自动实现的属性而不是 ...
- 一个简单oop的changeTab
好多地方都会用到这样一个效果“点击tab切换内容页”,根据自己的想法实现了一下,写了个简单的插件.以前写代码都是标准的函数式编程,现在觉得面向对象编程看起来比较爽,并且更容易维护,于是就用oop的思想 ...
- Python OOP(面向对象编程)
一OOP的作用 在Python中,类是面向对象设计(OOP)的主要工具.通过使用类这种工具,OOP可以: 1.分解代码,最小化代码的冗余. 2.通过定制现有的代码,来编写新的程序,而不用在原处进行修改 ...
- OOP,WEB开发实用小技巧
偶然读到一篇博客,记录一下心得.这种设计对于新手来说一般是想不到的,它充分的发挥了OOP语言的特性,让代码专用而清爽.这是不是重构的思想呢? 我们在写业务层的时候,有很多方法是重复功能的,我们就可以使 ...
- 从OOP的角度看Golang
资料来源 https://github.com/luciotato/golang-notes/blob/master/OOP.md?hmsr=toutiao.io&utm_medium=tou ...
- 玩转JavaScript OOP[2]——类的实现
概述 当我们在谈论面向对象编程时,我们在谈论什么?我们首先谈论的是一些概念:对象.类.封装.继承.多态.对象和类是面向对象的基础,封装.继承和多态是面向对象编程的三大特性. JavaScript提供了 ...
- Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系
Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...
- iOS - 对OOA、OOD、OOP的理解
很多人在求职的时候,会遇到一个这样的问题:“对OOD/OOP有较深的理解”,这个时候有人就会问OOD.OOP是什么呢?那么今天咱们就一块来看一下OOA.OOD.OOP到底是什么! (一)OOA--面向 ...
- OOP感悟
行内讲的最多的就是出来一年内基本靠copy,一年后才基本懂得如何去写代码,而理解领悟oop,需要的时间却不定. 我工作中,我发现很多人拿着面向对相当的语言作者做着面向过程的事情,不需要知其所以然,只要 ...
- 初识JAVA之OOP
有一段时间没发博客了,每次手打还是很累,但感觉很充实.. 最近发现很多初学者到了面向对象编程这个知识点时,不太清楚类是如何转化成为对象的,很是困扰,今天我在这里谈谈我的理解,大家一起来研究学习... ...
随机推荐
- PSFTP用法
PSFTP是PuTTY SFTP客户端,用于本地与服务器间安全传输文件(使用SSH连接). 1. 启动PSFTP 在Windows命令提示符中输入 set PATH=C:/PSFTP.exe所在路径; ...
- Unity---资源管理中不同资源的路径获取方式
1.首先需要先了解两个知识点: Unity内置的文件路径获取方式.windows的Directory.GetFiles文件获取方式: 1>Unity内置的文件路径获取方式,一下是官方解释:h ...
- Python全栈开发-Day8-Socket网络编程
本节内容 断言 Socket构建框架 ftp构建框架 Socket粘包 Socket介绍 Socket参数介绍 基本Socket实例 通过Socket实现简单SSH SocketServer 支持多用 ...
- tcpdump使用方法总结
举例: 1.针对指定网卡eth0抓包 tcpdump -i eth0 2.过滤主机 tcpdump -i eth0 host 192.168.1.1 tcpdump -i eth0 src host ...
- 日常英语---七、[Updated November 14 at 4:10 PM PST] Scheduled Game Update - November 14, 2018(n.标准)
日常英语---七.[Updated November 14 at 4:10 PM PST] Scheduled Game Update - November 14, 2018(n.标准) 一.总结 一 ...
- HTML第二章总结
前言 在第一单元中,我们了解了 "ML":Markup Language,它的作用是: tell the strure of content;在这一单元,进一步认识 HT,它的作用 ...
- 雷林鹏分享:jQuery EasyUI 树形菜单 - 树形网格动态加载
jQuery EasyUI 树形菜单 - 树形网格动态加载 动态加载树形网格有助于从服务器上加载部分的行数据,避免加载大型数据的长时间等待.本教程将向您展示如何创建带有动态加载特性的树形网格(Tree ...
- Linux上rsync配置
一.服务器端配置1.rsyncd.conf文件说明uid = rsync #用户,用来控制用户访问模块目录的读写权限gid = rsync #组,用来控制组访问模块目录的读写权限use ...
- 20170824xlVBA出车对账单
Private Sub GetClientAccountList() Dim EndRow As Long Dim i As Long, j As Long Dim m As Long, n As L ...
- Gifts by the List CodeForces - 681D (思维)
大意: 给定森林, 要求构造一个表, 满足对于每个$x$, 表中第一次出现的$x$的祖先(包括$x$)是$a_x$. 刚开始还想着直接暴力分块优化一下连边, 最后按拓扑序输出... 实际上可以发现$a ...