一、面向对象

  面向对象 : 就是一种编程思想

1、类和对象

  类是指描述一类事物,或者看成是一个分类,可以把类看作构造对象的模板。

  对象是指具体的个体(也叫实例-instance)。创建对象使用 new,没对象就 new 一个对象。

1、设计类

语法:

 class 类名{
成员变量 (字段)
方法 (具体的一个功能行为)
}

类规范书写:

①类名首字符大写;

②类名必须具有意义;

③必须写注释;

 public class Car {
String name; //字段
Integer price; void run(){ //方法,具体行为
System.out.println("run");
}
}

2、构造方法

  创建对象本质上是调用类的构造方法。

 public class Car {
String name; //字段
Integer price; void run(){ //方法,具体行为
System.out.println("run");
} //构造方法,无参构造方法
public Car() {
}
}

特点:

1、每一个类中都至少有一个构造方法;如果没有看到(显示的),那么存在一个隐式的无参数的构造方法;如果一个类中有显示的构造方法,那么隐式的就不存在了。

2、构造方法的名字和类名一致(包括大小写完全一致)。

3、没有返回值类型,构造方法内部不需要返回任何的数据。

4、其他的和普通方法类型 ,可以有修饰(public),可以有形参列表,可以有方法体。

5、在创建对象的同时给对象的字段赋值,有参数的构造方法的作用。

6、构造器总是伴随着new操作一起调用的。

 public class Car {
String name; //字段
Integer price; void run(){ //方法,具体行为
System.out.println("run");
} //构造方法
public Car() {
} //有参构造方法
public Car(String name, Integer price) { //在创建对象的同时给对象的字段赋值
this.name = name;
this.price = price;
}
}

3、封装

  在面向对象程式设计方法中,封装是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法(数据隐藏)。

在Java 中的体现

1 把类中的字段(实例域)私有化;

2 给每一个字段都提供一组getter, setter方法  (方法的规范写法);

3 在测试类中尝试创建对象,并通过调用getter setter方法完成对字段的赋值和取值;

优点:

  适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。减少耦合。类内部的结构可以自由修改。可以对成员变量进行更精确的控制。隐藏信息,实现细节。

 public class Student {
private String name; //私有化字段
private Integer age; //getter和setter方法
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
}
}

this介绍:

  当setter方法,里面参数名称都一样的时候,就选择就近原则;使用this。

4、继承

1、具体实现

  提高了代码的维护性和复用性,并且让代码更加简洁。

Java类中的继承的语法格式:

 class A{ }

 class B extends A{ }

  A 是 B 的父类,B 是 A 的子类。子类中可以继承父类的东西。

 /**
* 父类
*/
public class Animal { public void move(){
System.out.println("move");
} }

  子类,非私有字段和方法可以被继承到。构造方法不能被继承。

 /**
* 子类
*/
public class Cat extends Animal { @Override
public void move() {
super.move(); //super关键字:通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
}
}

  Java中只能是单继承,即一个类只有一个父类;但支持多重继承(多层继承),即一个类可以有子类,子类还可以子类...  子子孙孙无穷无尽...

2、方法的重写(Override)

方法重写的要求:

1、子类和父类的方法签名(方法名+方法参数列表)一致。

2、子类的访问权限不能比父类更低。

3、最好加上@Override,来让编译器检查是否重写正确。

4、私有方法和 static 方法不能被重写。

5、子类的返回值类型可以和父类相同或者是父类返回类型的子类。

 /**
* 子类
*/
public class Cat extends Animal {
@Override
public void move() {
System.out.println("move on"); //重写父类方法
} }

5、接口

  接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

声明语法:

interface 接口名{
// 内部可以有哪些成员--参考类
字段 全部都是全局常量(public static final修饰)
方法 全部都是抽象方法(缺省修饰public abstract)
构造方法 没有!
}

接口名一般加个大写的 I 在前面。

 public interface IAnimal {

     void run();

     void eat();
}

  使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。

注意:

1、必须全部覆写接口中的抽象方法。

2、否则实现类也抽象类。

3、一个类可以实现多个接口,但必须重写所有接口中的抽象方法。

 public class AnimalImpl implements IAnimal {
@Override
public void run() {
System.out.println("run");
} @Override
public void eat() {
System.out.println("eat");
}
}

6、多态

   多态是同一个行为具有多个不同表现形式或形态的能力。即同一个事件发生在不同的对象上会产生不同的结果。

多态的优点:

1. 消除类型之间的耦合关系

2. 可替换性

3. 可扩充性

4. 接口性

5. 灵活性

6. 简化性

多态存在的三个必要条件

1、继承

2、重写

3、父类引用指向子类对象

 /**
* 父类
*/
public class Animal {
public void eat() {
System.out.println("吃东西");
}
} /**
* 子类
*/
class Cat extends Animal {
public void eat() {
System.out.println("猫吃鱼");
} public void work() {
System.out.println("猫抓老鼠");
}
} class Dog extends Animal {
public void eat() {
System.out.println("狗吃骨头");
}
public void work() {
System.out.println("狗看家");
}
} class Person extends Animal {
public void eat() {
System.out.println("人吃东西");
}
public void work() {
System.out.println("人努力工作");
}
}

测试多态:

 public class Test {
public static void main(String[] args) {
Animal a = new Cat(); // 向上转型
a.eat(); // 调用的是 Cat 的 eat :首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
Cat c = (Cat)a; // 向下转型,强制转换
c.work(); // 调用的是 Cat 的 work Animal b = new Dog();
b.eat();
Dog d = (Dog)b;
d.work(); Animal person = new Person();
person.eat();
Person p = (Person)person;
p.work(); /* 输出:
猫吃鱼
猫抓老鼠
狗吃骨头
狗看家
人吃东西
人努力工作*/
}
}

多态的实现方式

1、重写

2、接口

3、抽象类和抽象方法

Java基础(五)面对对象的更多相关文章

  1. Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream)

    Java基础-IO流对象之序列化(ObjectOutputStream)与反序列化(ObjectInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.对象的序 ...

  2. Java基础-IO流对象之File类

    Java基础-IO流对象之File类 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IO技术概述 回想之前写过的程序,数据都是在内存中,一旦程序运行结束,这些数据都没有了,等下 ...

  3. 第31节:Java基础-类与对象

    前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...

  4. Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream)

    Java基础-IO流对象之压缩流(ZipOutputStream)与解压缩流(ZipInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 之前我已经分享过很多的J ...

  5. Java基础-IO流对象之随机访问文件(RandomAccessFile)

    Java基础-IO流对象之随机访问文件(RandomAccessFile) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.RandomAccessFile简介 此类的实例支持对 ...

  6. Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream)

    Java基础-IO流对象之内存操作流(ByteArrayOutputStream与ByteArrayInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.内存 ...

  7. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  8. Java基础-IO流对象之打印流(PrintStream与PrintWriter)

    Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...

  9. java基础-IO流对象之Properties集合

    java基础-IO流对象之Properties集合 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Properties集合的特点 Properties类表示了一个持久的属性集. ...

  10. Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)

    Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...

随机推荐

  1. PTA 7-2 深入虎穴 (30 分)

    著名的王牌间谍 007 需要执行一次任务,获取敌方的机密情报.已知情报藏在一个地下迷宫里,迷宫只有一个入口,里面有很多条通路,每条路通向一扇门.每一扇门背后或者是一个房间,或者又有很多条路,同样是每条 ...

  2. [Flex] 组件Tree系列 —— 支持元素的拖放排序

    mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:支持元素拖放排序--> &l ...

  3. JavaScript高性能开发的十条建议

    JavaScript高性能开发的十条建议 文/开发部 Dimmacro 编者按:javascript开发大部分程序员都做过,写出来的代码质量也千差万别,现在浏览器内嵌的解释器虽然效率已经很高了,但在客 ...

  4. 循环神经网络中BFTT的公式推导

    一.变量定义 此文是我学习BFTT算法的笔记,参考了雷明<机器学习与应用>中的BFTT算法推导,将该本书若干个推导串联起来,下列所有公式都是结合书和资料,手动在PPT上码的,很费时间,但是 ...

  5. CRC32算法笔记

    这几天在研究CRC32的计算过程,看了CRC算法的原理,也看了不少通过移位法实现的代码,但是算出的结果跟校验工具算的不一致. 折腾了好长时间,终于找到一个手工计算CRC32的文章,再对照IEEE 80 ...

  6. python 简单爬虫(beatifulsoup)

    ---恢复内容开始--- python爬虫学习从0开始 第一次学习了python语法,迫不及待的来开始python的项目.首先接触了爬虫,是一个简单爬虫.个人感觉python非常简洁,相比起java或 ...

  7. css 移动端图片等比显示处理

    第一次写博文,心情有点小小的激动~~~~~ 刚开始做移动端项目的时候遇到了一些优化的问题,比如,打开网页在2g或者3g的情况下加载网页,刚开始渲染的时候,遇到图片文件未请求,图片的高度会为0,当然,如 ...

  8. 【转】JavaWeb之Session的序列化和反序列化 && Session的活化和钝化

    应用场景: 1.一般来说,服务器启动后,就不会再关闭了,但是如果逼不得已需要重启,而用户会话还在进行相应的操作,这时就需要使用序列化将session信息保存起来放在硬盘,服务器重启后,又重新加载.这样 ...

  9. ONTAK2010 Peaks加强版(离线&在线)

    题面 弱化版:luogu 强制在线版:bzoj 题解 本题有两种解法 离线算法:线段树合并 先看一道简单题[USACO18JAN]MooTube 本题就是在此基础上求第\(k\)高的点 首先把询问和路 ...

  10. 在Vue项目中使用html2canvas生成页面截图并上传

    使用方法 项目中引入 npm install html2canvas html代码 //html代码 <!-- 把需要生成截图的元素放在一个元素容器里,设置一个ref --> <di ...