面向对象

一、面向对象概述  

  面向对象思想就是在计算机程序设计过程中,参照现实事物,将事物的属性特征、行为特征抽象出来,描述成计算机时间的设计思想。面向对象思想区别于面向过程思想,强调的是通过调用对象的行为来实现功能,而不是自己一步一步的去操作实现。

  特点:将复杂的事情简单化,抽象化。

  三大基本特征:封装,继承,多态。(后面具体介绍)

  类和对象:类是属性(成员变量)和行为(成员方法)的集合,对象是类的一个实例。

public class oop {
int a; //a是一个成员属性 成员属性位于类中方法外
public void method(){
System.out.println("这是一个成员方法");
}
}
public class TestOop {
public static void main(String[] args){
oop oop1 = new oop();//实例化oop类为oop1对象
oop1.a = 1;//为成员属性赋值
oop1.method();//调用成员方法 }
}

  关于static静态关键字:用来修饰静态变量或方法。静态变量由于不属于任何实例对象,是属于类的,所以在内存中只会有一份,在类的加载过程中,JVM为静态变量分配一次内存空间。

  成员变量默认类型:

  内存:实例化的过程在栈内存中,实例化的对象存在于堆内存中,同时调用多个对象的方法时如果指向的是同一方法,方法只会保存一次,以节约内存空间。

  成员变量和局部变量:

  • 成员变量:位于类中方法外(堆内存),作用域类中,初始化时有默认值,实例化对象时生成,对象消失成员变量消失。
  • 局部变量:位于类方法中(栈内存),作用域方法中,无默认值,必须先定义赋值,才能使用,调用方法时生成,方法调用完毕消失。 

二、封装  

  封装会保护类中的成员属性,外部无法操作和修改,防止该类的代码和数据被其他类随意访问。必须通过指定的方式才能访问。

  作用:适当的封装可以让代码更容易理解和维护,也加强了代码的安全性。

  原则:保护成员属性,外部无法访问,若需访问,提供公共方法对其访问。

  封装步骤:

    • 使用private关键字来修饰成员变量。(private是一个权限修饰符,表示最小权限,用来修饰成员变量和成员方法,被private修饰后的成员变量和成员方法,只有在本类中才能访问。)
    • 若需访问成员变量,提供相应类方法。

  void关键字表示方法返回结果类型。(无return时写void)

  this关键字表示类的当前对象的引用。

  构造方法:当一个对象被创建时,构造方法用来初始化该对象,给对象的成员变量赋值初始值。 (构造方法可以被重载)

public class oop {
private int a; //a是一个私有成员变量 //构造方法
public oop(){};//原始构造方法(系统提供)
public oop(int a){//带参数构造方法(如果提供了构造方法,系统将不再提供无参构造方法)
this.a = a;
} public int getA(){ //通过getA成员方法访问a
return a;
}
public void setA(int n) { //通过setA成员方法修改a
a = n; }
}

  标准代码--JavaBean:是Java编写类的一种标准规范。要求类必须是具体的和公共的,并且具有无参构造方法,提供用来操作成员变量的set和get方法。

public class oop {
//成员变量
//构造方法
//无参(必须)
//有参(非必须)
//成员方法
//get
//set
}

三、继承

为什么使用继承?

  多个类中存在相同属性和行为时,将这些内容抽取到一个单独的类中,那么多个类无需再定义这些属性和行为,只需要继承这个类即可。 

定义:继承就是子类继承父类的属性和方法,使子类具有与父类相同的属性和方法。子类可以直接访问父类中的非私有属性和方法。

作用:提高代码的复用性,使类与类之间产生关系,是多态(多种方法和属性)的前提。

用法:使用 extends 关键字。

class Father {
//父类
}
class son extends Father{
//子类
}

特点

  • 成员变量:子类访问父类的成员变量时,使用super关键字(super.成员变量)。
  • 成员方法:子类中出现和父类相同(返回值类型,函数名和参数列表全部相同)的成员方法时,子类会重写父类的成员方法。(重写要求子类方法权限必须大于父类)
  • 构造方法:子类无法继承父类构造方法,需要使用super(),表示调用父类的构造方法。
  • Java中每个类只能继承一个父类(单继承),一个父类可以被多个子类继承(多层继承)。

四、多态

定义:多态是指同一方法,具有多个不同表现形式。主要表现为继承或实现方法的重写,可以使程序编写的更简单,并有良好的扩展性。

public abstract class Father {          //父类 abstract用于修饰类和方法,表示抽象类和方法(下一章介绍)
public abstract void say();
}
public class son1 extends  Father{        //子类
public void say(){
System.out.println("我是儿子1");
}
}
public class son2 extends Father{
public void say(){
System.out.println("我是儿子2");
}
}
public class Test {
public static void main(String[] args){
Father f1 = new son1(); //多态调用
Father f2 = new son2(); sonSay(f1);    //将对象传递给成员方法
sonSay(f2);
}
public static void sonSay(Father f){
f.say();
} }

多态的转型

  引用类型转换分为向上转型和向下转型两种。

    • 多态本身是子类类型向父类类型向上转换的过程(默认)。
    • 父亲类型向子类类型转换被称为向下转换,属于强制类型转换。  
public class Test {
public static void main(String[] args){
//默认向上转型 son1类型转换为Father
Father f1 = new son1();
//主动向下转型
son1 s1 = (son1)f1; } }

为什么要转型?

  多态方式调用时,默认向上转型父类类型,如果子类拥有父类没有的方法,调用该方法就会发生编译错误,想要调用子类的特殊方法,必须向下转型。

转型注意

  转型不能指向其他子类(如上面代码中的 f1和son2的关系),否则会造成编译错误。因为这两个子类并没有继承关系,不符合类型转换的定义。

  这里可以使用 instanceof 关键字检测变量类型,相同为true,不同为false。

public class Test {
public static void main(String[] args){ Father f1 = new son1();
if (f1 instanceof son1){ //true
System.out.println("son1");
}else if(f1 instanceof son2){ //false
System.out.println("son2");
}
}
}

温馨提示

  • 如果您对本文有疑问,请在评论部分留言,我会在最短时间回复。
  • 如果本文帮助了您,也请评论关注,作为对我的一份鼓励。
  • 如果您感觉我写的有问题,也请批评指正,我会尽量修改。
  

Java基础学习笔记(二) - 面向对象基础的更多相关文章

  1. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  2. Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer

    作者:Grey 原文地址:Java IO学习笔记二:DirectByteBuffer与HeapByteBuffer ByteBuffer.allocate()与ByteBuffer.allocateD ...

  3. java jvm学习笔记二(类装载器的体系结构)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao                 在了解java虚拟机的类装载器之前,有一个概念我们是必须先知道的,就是java的沙箱,什 ...

  4. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  5. Java基础学习笔记二十八 管家婆综合项目

    本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...

  6. Java基础学习笔记二十一 多线程

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

  7. Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...

  8. Java基础学习笔记二十六 JDBC

    什么是JDBC JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据库,J ...

  9. Java基础学习笔记二十二 网络编程

    络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网络中,这些连接和通信的规则 ...

随机推荐

  1. nginx安装错误:c compiler cc is not found

    今天安装软件nginx的时候遇到的报错:c compiler cc is not found 查了下网上的资料,解决方案也不复杂. 先说明下环境: 服务器:CentOS 7 nginx:2.3.1 原 ...

  2. 【Linux命令】modprobe命令

    modprobe(module probe)命令 用于自动处理可载入模块. 1)语法 modprobe [-acdlrtvV][--help][模块文件][符号名称 = 符号值] 2)补充 modpr ...

  3. 微信小程序那些令人眼泪汪汪的坑儿

    前言 最近做了一个麻雀虽小,五脏俱全的微信小程序项目.一看就会,一用就废的小程序.有些坑真的坑的你两眼泪汪汪.我就爱干前人栽树后人乘凉的事儿,看到文章的你,也许是同道中人,相视一笑:亦或是小程序外围人 ...

  4. CF 551 E GukiZ and GukiZiana

    https://codeforces.com/contest/551/problem/E 分块真强. 题意就是1.区间加,2.询问整个区间中,最远的两个x的距离. 分块,然后,每次找位子用二分找即可. ...

  5. HDU-4027-Can you answer these queries?线段树+区间根号+剪枝

    传送门Can you answer these queries? 题意:线段树,只是区间修改变成 把每个点的值开根号: 思路:对[X,Y]的值开根号,由于最大为 263.可以观察到最多开根号7次即为1 ...

  6. CodeForces 1187G Gang Up 费用流

    题解: 先按时间轴将一个点拆成100个点. 第一个点相当于第一秒, 第二个点相当于第二秒. 在这些点之间连边, 每1流量的费用为c. 再将图上的边也拆开. 将 u_i 向 v_i+1 建边. 将 v_ ...

  7. Codeforces Round #481 (Div. 3) C. Letters

    题目地址:http://codeforces.com/contest/978/problem/C 题解:有n个宿舍,每个宿舍人不一样多,有m封信,每封信送给对应的第m间房间,问这封信是给第几个宿舍,第 ...

  8. Codeforces Round #480 (Div. 2) B. Marlin

    题目地址:http://codeforces.com/contest/980/problem/B 官方题解: 题意: 有一个城市有4行n列,n是奇数,有一个村庄在(1,1),村民在(4,n)钓鱼:还有 ...

  9. hdu Sumsets

    Farmer John commanded his cows to search for different sets of numbers that sum to a given number. T ...

  10. 关于Ubunto在VMwark中无法全屏。

    1.右键点击Ubunto桌面,进入终端 输入: 1.sudo apt-get install open-vm*   安装依赖项 2.sudo apt-get install open-vm-tools ...