Java基础系列--05_面向对象
1、概述:
(1)面向过程:将问题一步一步的解决的过程(详细步骤),在C语言中所有的代码都是基于过程化的代码。
(2)面向对象:面向对象是基于面向过程的编程思想,所有的事情都交由创建出来的对象去指挥。
注意:这里所说的详细步骤,指的是问题的解决是如何进行的;而指挥,指的是对象去调用方法,
而这个方法是实现了某一个功能的详细步骤。也就是说对象发号施令,而不理会内部是如何实现的。
2、类与对象:
类:是一组相关的属性和行为的集合。是一个抽象的概念,其实就是有共性的群体。
成员变量:事物的属性
成员方法:事物的行为
对象:是该类事物的具体存在,是一个具体的实例,其实就是群体里面的个体。
所有的类都是通过构造方法去创建出对象,这个过程也叫做实例化。
构造方法
(1)格式及特点
格式:
访问权限修饰符 类名(参数...){}
访问权限修饰符:
public,private,不写(默认public)
特点:
A:方法名和类名相同
B:没有返回值类型
C:没有具体的返回值
(2)注意事项:
A:如果不给出构造方法,jvm会自动生成一个无参构造方法。
B:如果给出了构造方法,jvm将不再提供无参构造方法。
这个时候,如果要使用无参构造方法:只能自己写无参构造
3、this关键字
(1)this代表当前类对象的引用。哪个对象调用方法,this就代表谁。
this可以解决局部变量隐藏成员变量的问题。除了静态方法外,所有的方法中有隐含的有一个this引用
4、static关键字
(1)表示静态的,可以修饰成员变量和成员方法。
(2)静态的特点:
A:随着类的加载而加载
B:优先于对象存在
C:被类的所有对象共享
D:可以通过类名调用
(3)静态的注意事项:
A:在静态方法中是没有this关键字的。
B:静态方法只能访问静态成员。
(4)静态内容的调用:
A:被对象调用
B:被类名调用
(5)什么时候该用static呢?
当某个内容是所有对象共享。
举例:
水杯和饮水机:饮水机为共享资源,但水杯不是
黑板和书包:黑板为功效资源,但书包不是
5、Java程序的开发,设计和特征
(1)开发:就是不断的创建对象,通过对象调用功能
(2)设计:就是管理和维护对象间的关系,使之尽量的低耦合,高内聚。
(3)面向对象的三大特征
a:封装(encapsulation) 是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
b:继承(inheritance) 它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。
c:多态(polymorphism) 将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
封装
(1)隐藏实现的细节,提供公共的访问方式。
类,方法等其实都是封装的具体体现。
(2)private关键字
A:用于修饰成员变量和成员方法。
B:被修饰的内容在其他类中是不可以被访问的。
(3)常见的应用:
类中的所有成员变量私有,给出对应的get/set方法(属性)。
举例:
class Student{
//成员变量
private String name;
private int age;
//无参构造
public Student(){}
//构造方法
public Student(String name,int age){
this.name = name;
this.age = age;
}
//属性(类中特殊的方法)
public void setName(String name) {
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
//方法
public void study(){
System.out.println("好好学习,天天向上");
}
}
继承
(1)简单的说:把多个类中的相同的属性和行为进行抽取,封装到一个类中,
然后再建立新类的时候,不需要从头做起,继承刚才定义的那个类即可,并拓展自己所需要的其他属性和行为。
(2)好处:
A:提高代码的复用性。
B:让类与类之间产生了一个关系,是多态的前提。
(3)继承的应用场景
A:类之间存在着:
is a 的关系,就可以考虑使用继承。 举例:Student is a Person
B:不要为了继承部分功能,而去使用继承。
(4)继承的特点:
A:Java只支持单继承,不支持多继承。因为如果支持多继承,就会有调用不明确的问题。
B:Java支持多层(重)继承。
(5)super和this的区别?
A:super是一个关键字,代表父类的存储空间标识。(可以理解为父亲的引用)
B:它和this的用法相似
a:成员变量
this.变量 -- 本类的
super.变量 -- 父类的
b:构造方法
this(...) -- 本类的
super(...) -- 父类的
c:成员方法
this.方法名() -- 本类的
super.方法名() -- 父类的
(6)子父类中成员变量的用法:
A:名称不同。
B:名称相同,子类对象的在使用的时候:
先找子类局部范围
再找子类成员范围
最后找父类成员范围
(7)子父类中成员方法的用法:
A:名称不同。
B:名称相同,子类对象的在使用的时候:
先找子类的
再找父类的
C:方法重写
在子类中,方法声明(修饰符,返回值,方法名,参数列表)相同的情况。
注意事项:
a:父类中私有方法是不能被重写
b:子类方法的访问权限一定要大于等于父类的访问权限
c:静态只能重写静态。(这个不能算,因为静态跟类相关)
(8)子父类中构造方法的用法:
A:子类的初始化过程中,首先会去执行父类的初始化动作。
因为子类的构造方法中默认有一个super()。子类要使用父类的成员变量,这个初始化,必须在子类初始化之前完成。
所以,子类的初始化过程中,会先执行父类的初始化。
B:如果父类没有无参构造方法
a:使用super显示调用父类的带参构造。推荐方式。
b:使用this调用本身的其他构造。
多态
(1)对象在不同时刻表现出来的不同状态。
(2)多态的前提
A:要有继承或者实现关系。
B:要有方法的重写/实现。
C:要有父类引用或者父接口引用指向子类对象。
注意:多态有三种体现形式
类多态
抽象类多态
接口多态
(3)多态中的成员特点:
A:成员变量
编译看左边,运行看左边。
B:成员方法
编译看左边,运行看右边。
class Person{
private String name;
private int age;
public Student(){}
public Student(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge() {
return age;
}
public void study(){
System.out.println("Person:"+name+"---"+age);
}
}
class Student extends Person{
private int stuNo;
public Student(){
super();
}
public Student(String name,int age,int stuNo){
super(name,age);
this.stuNo = stuNo;
}
public void setStuNo(int stuNo){
this.stuNo = stuNo;
}
public String getStuNo(){
return this.stuNo;
}
@OverRide
public void study(){
System.out.println("Student:"+name+"---"+age+"---"+stuNo);
}
}
public class ExtendsDemo{
public static void main(String[] args){
Person p = new Person("张三",20);
p.study();
Student s = new Student("李四",21,10001);
s.study();
Person pp = new Student("王五",21,10002);
pp.study();
Student ss = new Person("赵六",21);
ss.study();
ss = s;
ss.study();
}
}
//通过观察结果可以发现,真正的变量的值其实是等号右边的值
//而同一个ss对象可以表现出两种不一样的状态,就叫做多态
为什么会这样?因为方法存在重写,而变量没有。
(4)多态的弊端:
父类(接口)引用不能使用子类特有功能。
为了解决这个弊端,我们需要向下转型。
Person person = new Student(); //向上转型,子类对象转换为父类
Student student = new Person(); //向下转型,父类对象转换为子类
(5)多态的好处:
可以提高代码的扩展性和可维护性。
(6)类的存储
A:栈 存储对象的名称 (s,ss, p, pp)
B:堆 存放对象的具体内容(name的值,age的值,stuNo的值)
C:方法区 存储类的字段以及方法(name,age,stuNO,study())
final关键字
(1)是一个关键字,可以用于修饰类,成员变量,成员方法。
(2)特点:
它修饰的类不能被继承。
它修饰的成员变量是一个常量,一旦被赋值了就不能修改。
它修饰的成员方法是不能被子类重写的。
Java基础系列--05_面向对象的更多相关文章
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
- Java基础系列--static关键字
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8477914.html 一.概述 static关键字是Java诸多关键字中较常使用的一个,从 ...
- 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!
目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接 ...
- 夯实Java基础系列9:深入理解Class类和Object类
目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...
- 夯实Java基础系列13:深入理解Java中的泛型
目录 泛型概述 一个栗子 特性 泛型的使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型方法总结 泛型上下边界 泛型常见面试 ...
- Java工程师学习指南第1部分:夯实Java基础系列
点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 本文整理了微信公众号[Java技术江湖]发表和转载过的Java优质文章,想看到更多 ...
- 2015年12月28日 Java基础系列(六)流
2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流
- Java基础系列-ArrayList
原创文章,转载请标注出处:<Java基础系列-ArrayList> 一.概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. ...
- Java基础系列-Collector和Collectors
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/10748925.html 一.概述 Collector是专门用来作为Stream的coll ...
随机推荐
- grep 及正则表达式
grpe 及正则表达式 文本查找的需要:grep,egrep,fgrepgrep: 根据模式,搜索文本,并将符合模式的文本行显示出来.Pattern : 文本字符以及正则表达式的元字符组合而成的匹配条 ...
- Windows下建立FTP服务器站点
环境 操作系统版本:Win7旗舰版64位系统 1.安装FTP组件 打开或关闭Windows功能,打开过程可能会比较慢,大概3.4分钟: 安装FTP组件.勾选Internet信息服务下的FTP服务器.F ...
- kali linux中的yum、rpm常见的问题
事件起因:今天我在kali里面使用yum命令来部署Linux环境时,出现了错误: bash:yum command not found,然后就百度,找到一片好的文章,链接:http://www.pia ...
- 基于Spring和Mybatis拦截器实现数据库操作读写分离
首先需要配置好数据库的主从同步: 上一篇文章中有写到:https://www.cnblogs.com/xuyiqing/p/10647133.html 为什么要进行读写分离呢? 通常的Web应用大多数 ...
- 阿里云服务器建站——centos7部署apache+mysql+php
自己也是忙活了半天,才完成了阿里云服务器的建站,这里就来分享一下. 首先如果是要自己搭建一个网站的话,除了服务器以外还要购买域名,并且要去备案,一般在哪买的域名都有备案的系统,备案的话一般要两到三个星 ...
- 如何在ASP.NET Core程序启动时运行异步任务(2)
原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...
- Elasticsearch之索引模板index template与索引别名index alias
为什么需要索引模板? 在实际工作中针对一批大量数据存储的时候需要使用多个索引库,如果手工指定每个索引库的配置信息(settings和mappings)的话就很麻烦了. 所以,这个时候,就存在创建索引模 ...
- windows快捷键十八式(win10)
胖友,如果你的电脑是windows系统,下面这十八招windows快捷键都不会,还敢说你会用windows? 说到windows的快捷键,当然不是只有ctrl+c,ctrl+v这么简单,今天我整理了一 ...
- 教你编写百度搜索广告过滤的chrome插件
1 前言 目前百度搜索列表首页里,广告5条正常内容是10条,而且广告都是前1到5条的位置,与正常内容的显示样式无异.对于我们这样有能力的开发者,其实可以简单的实现一个chrome插件,在百度搜索页面里 ...
- 试试使用 eolinker 扫描 GitLab 代码注释自动生成 API 文档?
前言: 一般写完代码之后,还要将各类参数注解写入API文档,方便后续进行对接和测试,这个过程通常都很麻烦,如果有工具可以读取代码注释直接生成API文档的话,那会十分方便. 此前一直都是在使用eolin ...