Java(三)面向对象的特性

构造方法生成小技巧:使用idea时,在代码空白处单击右键,选择Generate选项,之后再选择Constructor生成构造器,也可以使用toString()来重写这个函数。

继承

  • 父类也称为超类、基类、派生类等
  • Java中只有单继承,没有像C++那样的多继承,多继承会引起混乱,使得继承过于复杂,系统难于维护
  • Java中没有多继承,但接口有多继承
  • 子类继承父类,可以得到父类的全部属性和方法(除了父类的构造方法),但不见得可以直接访问(比如:父类私有属性和方法)
  • 如果定义一个类时,没有调用extends,则它的父类是:java.lang.Objetct
package cn.yhq.oo; //非注释语句第一句public class User {public static void main(String[] args) {Student stu1 = new Student(20,"自动化","yhq","体育课");stu1.learning();stu1.showMajor();}
}
class Person{int age;String name;String major;
//父类中不能含有参构造,如果要继承的话
//    Person(int age,String name,String major){
//        this.name = name;
//        this.age = age;
//        this.major = major;
//    }public void showMajor(){System.out.println("我的专业是"+major);}
}
class Student extends Person{String lesson;public Student(int age,String major,String name,String lesson){this.major = major;this.name = name;this.age = age;this.lesson = lesson;}public void learning(){System.out.println("我在上课呢"+name+lesson);}
}

可以使用idea的功能可以方便查看类的继承结构

instanceof方法

​ 使用instanceof可以判断对象是否归属于某个类:

Student stu1 = new Student(20,"自动化","yhq","体育课");System.out.println(stu1 instanceof Person);System.out.println(stu1 instanceof Object);System.out.println(new Person() instanceof Object);

方法重写(override)

​ 子类通过重写父类的方法,可以使用自身的行为替换父类的行为。 方法重写需要符合下面三个要点:

  • “==“:方法名、形参列表相同
  • “<=”:返回值类型和声明异常类型,子类小于等于父类
  • ”>=“:访问权限,子类大于等于父类
class Vehicle{int speed;public void showTheType(){System.out.println("嗡嗡嗡");}public Person whoIsPsg(){//父类类型为Person,子类的类型要小于Personreturn new Person();}
}
class Horse extends Vehicle{public void showTheType() {System.out.println("马叫");}public Vehicle method(){return new Vehicle();}public Person whoIsPsg(){ //返回值类型小于父类的类型,如果是Object就会报错return new Student();}
}

Object类

​ object类是所有Java类的根基类,也就意味着所有的Java对象都拥有Object类的属性和方法。其中toString()是用于返回以一个字符串表示的对象值,是一种自我描述的方法,一般通过重写来打印所需要的内容。

public class TestObject {public static void main(String[] args) {TestObject to = new TestObject();System.out.println(to.toString());Person2 p2 = new Person2("喜喜",6);System.out.println(p2.toString());}public String toString(){ return "Test Obeject 对象";}}
class Person2{String name;int age;public String toString(){ return name+"年龄"+age;}public Person2(String name,int age){this.name = name;this.age = age;}}

==和equals方法

==代表比较双方是否相同,如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。

Object类中定义有:public boolean equals(Object obj)方法,提供定义"对象内容相等"的逻辑。equals的源代码为:

    public boolean equals(Object obj) {return (this == obj);}

重写equals代码:

package cn.yhq.oo;import java.util.Objects;public class TestEquals {public static void main(String[] args) {Object obj;String str;User03 u1 = new User03("yhq","123456");User03 u2 = new User03("yhq","123456");System.out.println(u1==u2);//这表示不是同一个对象,结果为falseSystem.out.println(u1.equals(u2));//判断两个对象是否相同时吗,通常是判断其id是否相同}
}
class User03{String username;String pwd;public User03(String username, String pwd) {this.username = username;this.pwd = pwd;}public String toString() {return "User03{" +"username='" + username + '\'' +", pwd='" + pwd + '\'' +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User03 user03 = (User03) o;return Objects.equals(username, user03.username);}}

super关键字

​ super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。构造方法的第一句总是:super(…)来调用父类对应的构造方法。所以流程是:

1.先向上追溯到Object

2.然后再依次向下执行类的初始化块和构造方法

3.执行到当前子类位置

静态初始化块调用顺序和构造方法调用顺序一致,不再重复

package cn.yhq.oo;public class TestSuper {public static void main(String[] args) {SonClass son = new SonClass();son.work();son.superWork();}
}
class FatherClass{String name;int age;FatherClass(){System.out.println("fatherClass");}void work(){System.out.println("father work");}
}
class SonClass extends FatherClass{//每个类的第一句话都是super(),自动调用父类的构造函数SonClass(){System.out.println("SonClass");}void work(){System.out.println("Son work");}void superWork(){super.work();}
}

封装

类的定义规则

1.一般使用private访问权限。

2.提供相应的set、get方法来访问相关的属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作。

3.一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。

package Test;//成员变量全部换位public
public class Person4 {private int id;private String name;private int age;private boolean man;public void setName(String name){this.name = name;}public String getName(){return this.name;}public void setAge(int age){if (age>=1&&age<=130){this.age = age;}else {System.out.println("请输入正常年龄");}}
}

类中只包含set和get方法,这种类称为JavaBean,一个类中除了set和get之外的方法,一般都是用public,除了写包时候。

多态(polymorphism)

​ 多态指的是同一个方法的调用,由于对象不同可能会有不同的行为,现实生活中,同一个方法,具体实现会完全不同。

多态是指方法的多态

多态的要点:

1.多态是方法的多态,不是属性的多态(多态和属性无关)。

2.多态的存在要有三个必要条件:继承、方法重写、父类引用指向子类对象。

3.父类引用指向子类对象后,用该父类引用调用子类重写方法,此时多态就出现了。

package Test;public class TestPoly {public static void main(String[] args) {Animal a = new Animal();animalCry(a);//父类对象指向子类Dog d = new Dog();animalCry(d);Cat c = new Cat();animalCry(c);}static void animalCry(Animal a){ //传入不同对象执行方法不同a.shout();}}
class Animal{public void shout(){System.out.println("叫了一声!");}
}
class Dog extends Animal{public void shout(){System.out.println("旺旺");}
}
class Cat extends Animal{@Overridepublic void shout() {System.out.println("喵喵");}
}

自动向下转型

Animal d = new Dog();   //自动向上转型:dog转成animal类,这里要注意类型是animal类,但是对象是Dog。
Dog d2 = (Dog)d;   //强制向下转型:animal转为dog//猫强转成dog,会产生编译错误
Animal c = new Cat();
Dog d3 = (Dog)c;

final修饰

final关键字作用:

1.修饰变量:被修饰得变量不可以改变,一旦赋值,就不能重新赋值。

final int MAX_SIZE = 120;

2.修饰方法:该方法不可被子类重写,但是可以被重载!

final void study(){}

3.修饰类:修饰的类不能被继承。比如:Math、String

final class A{}

数组(也为对象)

​ 数组是相同类型数据的有序集合。数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。其中,每一个数据称为一个元素,每个元素可以通过一个索引来访问。

特点

  • 长度是确定的,数组一旦被创建,它的大小就是不可改变的
  • 其元素必须是相同的,不允许出现混合类型
  • 数组类型可以是任何数据类型,包括基本类型和引用类型

数组变量属于引用类型,数组也属于对象,数组中每个元素相当于该对象的成员变量。

声明方式

type[] arr_name;//推荐使用这种方式

注意事项

  • 声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。
  • 声明一个数组的时候并没有数组真正被创建
  • 构造一个数组,必须指定长度
package cn.yhq.array;public class Test01 {public static void main(String[] args) {//int[] arr01:这是数组的声明,int[] arr01 = new int[10];这是数组的初始化int[] arr01 = new int[10]; //索引下标[0 length-1]:String[] arr02 = new String[5];User[] arr03 = new User[3];arr03[0] = new User(100,"yhq"); //不是将对象直接放到数组,是存放对象地址arr03[1] = new User(101,"tony");arr03[2] = new User(102,"jenny");for (int i = 0;i<arr03.length;i++){System.out.println(arr03[i].getAge());}}
}
class User{private int id;private  String age;public User(int id, String age) {this.id = id;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}
}

不是将元素对象直接放到数组,是存放对象地址

初始化方式

  • 静态初始化
  • 动态初始化
  • 默认初始化
package cn.yhq.array;public class Test02 {public static void main(String[] args) {//静态初始化int[] a = {2,3,4};User[] user01 = {new User(100,"19"),new User(101,"20")};//默认初始化int[] b = new int[3];//默认给数组的元素进行赋值。赋值的规则和成员变量赋值的规则一样//动态初始化int[] a1 = new int[2];//动态初始化数组,先分配空间a1[0] = 1;//给数组元素赋值a1[1] = 2;}
}

数组遍历

​ 增强for循环for-each是专门用于读取数组或者集合中所有的元素,即对数组进行遍历。

 //foreach循环:用于读取数组元素的值,不能修改元素的值for (int m:num_array){System.out.println(m);}

Java(三)面向对象的特性相关推荐

  1. 【Java练习题汇总】《第一行代码JAVA》面向对象基础篇,汇总Java练习题——面向对象:特性、类与对象、数组、String、内部类... ~

    Java练习题 · 面向对象基础篇 1️⃣ 面向对象基础篇 1️⃣ 面向对象基础篇 一.填空题 面向对象的三大特征:_______ ._______ ._______. 类由_______和_____ ...

  2. java (三)面向对象编程

    public class Employee{String name;int age;String designation;double salary;// Employee 类的构造器public E ...

  3. 【Java】面向对象基本特性-封装

    封装概述 面向对象编程是对客观世界的抽象,封装是对这个抽象的保护,避免外界直接操作抽象内部的隐藏对象.适当的封装让代码更易懂,也更安全. 封装的步骤 使用private关键字来修饰成员变量 对需要访问 ...

  4. java基础--面向对象三大特性(二)

    5. 继承 优点:在一定程度上提高代码的复用性(将一些重复的内容不再多次编写) 关键字:extends 子承父业将多个类中的共性再一次抽取,作为一个父类.父类的作用就是用来讲一些重复的内容不再多次编写 ...

  5. Java 基础 - 面向对象(不错N多教程集合)

    著作权归https://pdai.tech所有. 链接:Java 基础 - 面向对象 | Java 全栈知识体系 本文主要介绍Java OOP 面向对象基础和相关类图.@pdai Java 基础 - ...

  6. 大数据必学Java基础(三十九):面向对象三大特性之一封装(Encapsulation)

    文章目录 面向对象三大特性之一封装(Encapsulation) 一.生活案例 二.Java中封装的理解

  7. java 面向对象的特性 抽象_java面向对象的四个特性

    java面向对象编程是指:Java语言提供类.接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements).另外 ...

  8. java面向对象多态特性

    一.多态的概念 多态是继封装,继承之后,面向对象的三大特性. 现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的张三同学既是学生也是人,即出现两种形态. java作为面向对象的语言,同 ...

  9. java 面向对象多态_乐字节Java面向对象三大特性以及Java多态

    ​ 以上就是本次学习的6大任务.我们依次来看. 1 Object类 Object类是所有Java类的根基类. 如果在类的声明中未使用extends关键字指明其基类,则默认基类为Object类. cla ...

最新文章

  1. io.h源码 检查文件是否存在
  2. ML之LoRBaggingRF:依次利用LoR、Bagging、RF算法对泰坦尼克号数据集 (Kaggle经典案例)获救人员进行二分类预测(最全)
  3. python所有的父类_object代表所有类的父类吗??
  4. elasticsearch常用命令
  5. 前端学习(2207):Vue-store文件夹的目录结构
  6. 快速锁定Windows XP桌面的几个方法
  7. python打印进程号与线程号
  8. python无缘无故不执行/跳过某个函数,无报错无警告
  9. PyTorch 1.0 中文文档:torch.nn.functional
  10. java自学—各阶段教程
  11. lvgl的区别 qt_LVGL分析-画面刷新
  12. THREEJS - 利用UV偏移模拟传送带运动
  13. js中substr,substring,indexOf,lastIndexOf的用法小结
  14. nero10 序列号
  15. Struts2拦截器的学习
  16. 【思维导图】万科王石自传《我的改变:个人的现代化四十年》做的一些摘录
  17. win7声音小图标不见了,如何修复
  18. 什么pdf转换成excel转换器好
  19. 【C语言】利用条件运算符的嵌套完成学习成绩的例题
  20. 英雄联盟手游正式上线,白拿22个永久英雄11个皮肤,太香了

热门文章

  1. 新手笔记-Vuex store练习
  2. VMware、CentOS7安装及静态ip配置和Xshell远程工具连接(个人学习笔记)
  3. 利用Matcom实现基于MATLAB的混合编程
  4. 系统集成项目管理工程师备考经验之谈
  5. RJM8L151在烟雾报警器系统中的应用
  6. SQL分页 查询6到10名等
  7. ArcSDE和Oracle分离安装(生产实践)
  8. CMMI三级认证怎么费用的?
  9. 米兔积木机器人电机是腿吗_这些年给孩子买的东西 篇六:米兔积木机器人开箱晒单...
  10. c#使用委托事件实现信用卡定期还款功能