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
有一段时间没发博客了,每次手打还是很累,但感觉很充实.. 最近发现很多初学者到了面向对象编程这个知识点时,不太清楚类是如何转化成为对象的,很是困扰,今天我在这里谈谈我的理解,大家一起来研究学习... ...
随机推荐
- linux基础01-bash特性
(1) ls -l:长格式文件类型: -:普通文件 (f) d: 目录文件 b: 块设备文件 (block) c: 字符设备文件 (character) l: 符号链接文件(symbolic link ...
- 配置java环境jdk
最近尝试改公司的项目中的一个后台管理系统,前后台都让我一个做,所以要配置一下java环境: 1. 按装jdk 1.6//2. 安装eclipse3. 安装maven4. 安装eclispe的maven ...
- 网格视图GridView的使用
网格视图GridView的排列方式与矩阵类似,当屏幕上有很多元素(文字.图片或其他元素)需要按矩阵格式进行显示时,就可以使用GridView控件来实现. 本文将以一个具体的实例来说明如何使用GridV ...
- 【转载】LINUX下安装wget命令(SFTP实现法)
如何安装wget命令. 方法一:通过yum 命令行为:yum install wget 完成.此操作很简单,但是我安装的linux是centos的最小版本,运行上述命令时会出现无法连接到源网站(大概是 ...
- 雷林鹏分享:C# 字符串(String)
C# 字符串(String) 在 C# 中,您可以使用字符数组来表示字符串,但是,更常见的做法是使用 string 关键字来声明一个字符串变量.string 关键字是 System.String 类的 ...
- R quantile函数 | cut函数 | sample函数 | all函数 | scale函数 | do.call函数
取出一个数字序列中的百分位数 1. 求某一个百分比 x<-rnorm(200) quantile(x,0.9) 2. 求一系列的百分比 quantile(x,c(0.1,0.9)) quanti ...
- 文献导读 - Machine Learning Identifies Stemness Features Associated with Oncogenic Dedifferentiation
参考: Machine Learning Identifies Stemness Features Associated with Oncogenic Dedifferentiation 前所未有!1 ...
- FreeBSD之基本配置
1. 设置IP地址.网关ee /etc/rc.conf ifconfig_em0="inet 192.168.21.173 netmask 255.255.255.0" #设置 ...
- com.netflix.zuul.exception.ZuulException: Forwarding error
一.问题描述 在使用Spring Cloud的zuul组件,做路由转发时,每次重新启动后端服务,头几次调用都会出现com.netflix.zuul.exception.ZuulException: F ...
- 静默安装/ 普通安装与root权限获取相关
静默安装 有时候使用第三方的插件时我们需要静默安装其提供的apk包,静默安装时我们需要获取root权限,如下代码 Process process = Runtime.getRuntime().exec ...