【Java常识】2.0 Java三大特性——面向对象,多态,Java的方法和类

1.0 面向过程与面向对象都是我们编程中,编写程序的一种思维方式。

例如:公司打扫卫生(擦玻璃、扫地、拖地、倒垃圾等),

按照面向过程的程序设计方式会思考“打扫卫生我该怎么做,然后一件件的完成”,最后把公司卫生打扫干净了。

按照面向对象的程序设计方式会思考“我该让谁来做,如小明擦玻璃、让小丽扫地、让小郭拖地、让小强倒垃圾等”,这里的“小明、小丽、小郭、小强”就是对象,他们要打扫卫生,怎么打扫是他们自己的事,反正最后一群对象合力把公司卫生打扫干净了。

继续举例:

使用面向过程说明买电脑这件事:分析整个过程大体分一下几步:上网查询参数和报价、电脑城询价、现场安装和监督、抱电脑回家。在整个过程中我们参与了每一个细节,并且会感觉相当累。

使用面向对象说明买电脑这件事:只要找到懂电脑硬件的这个人,我们的问题都可以解决。并且在这个过程中我们不用那么辛苦。

所以,面向过程思维方式中更多的体现的是执行者(自己做事情),面向对象中更多的体现是指挥者(指挥对象做事情)。

2.0 Java作为一种面向对象的语言,具备三大特性(面向对象的核心):封装性 继承性 多态性

封装性:就是打包,所有东西都是打包好的。
继承:子类可以继承父类
文件名:Student.java

public class Student {
    public String name;
    public int age;
    
    public void study(){
        System.out.println("学生学习");
    }
}

在上文中定义了普通方法学生(Student),并定义一个普通行为——普通类学习(study)
Student作为构造函数,构造函数是不能被继承,所以也不存在构造函数重写
文件名:Unstudent.java

public class UnStudent extends Student{
    public void study(){
        System.out.println("大学生的学习方法");
    }
    public void playGame(){
        System.out.println("大学生玩dota");
    }
}

在上文中定义了普通方法大学生(Unstudent),并继承(extends)普通方法学生(Study)
同时,它在子类(Unstudent),继承父类(Study)的前提,子类定义一个和父类相同的(方法名、参数、返回类型)方法(“public void study(){}”)。
子类可以定义新的行为(类)“playGame”。

文件名:Test.java

public class Test {
    public static void main(String[] args) {    
        //自动转型
        UnStudent us = new UnStudent();
        Student us1 = new UnStudent();
        Student us2 = new Student();
        
        us.study();
        us1.study();
        us2.study();
        
        us.playGame();
        us1.playGame();
        us2.playGame();
    }
}

在上文中主函数里大学生(Unstudent)“ us ”构造一次,进行方法重载。“ us ”将具备普通方法UnStudent所有特性,并且进行方法重写的将覆盖父类原有的类的定义。

  • “ us1 ”具备Student所有属性,但被UnStudent重写的属性将会是UnStudent重写后的内容,原Student内类将会被覆盖,UnStudent内存在但Student不存在的类“ us1 ”将无法调用。
  • “ us2 ” 就是正宗Student类。
3.0 上面存在两种方法:
  • 自动转型
    定义:创建子类的对象,然后自动转型为父类的类型
    格式:父类类名 对象名 = new 子类类名();
    转型后的对象类型为转型后的类型,执行的方法如果子类重写了父类的方法,则执行的是重写后的,如果没有重写,则执行的是父类自己的
    如果没有自动转型过程,则执行的方法都是自己的方法
    因为存在自动转型和方法重写和继承等特性,所以Java语言呈现多态性。
    多个同一种类型的对象,执行同一个方法,执行的过程不一样(有区别)
  • 为什么会有多态现象???
    自动转型+方法重写
    自动转型+方法重写 将导致具有继承性,因此将具备多态性
4.0 Java语言的方法分类只有三种:
        构造方法:public 类名( ){ }
        普通方法:public 返回类型  方法名(参数){ }
        抽象方法:public abstract 返回类型 方法名(参数);
5.0 Java语言类的分类也有三种:
        普通类:public class 类名{}
  • 只能有普通方法和构造方法,一定不能有抽象方法
  • 可以创建对象
  • 属性可以是常量(static final),也可以是变量
        抽象类:public abstract class 类名{}
  • 三种类型的方法都可以存在
  • 不能创建对象
  • 属性可以是常量(static final),也可以是变量
        接口:public interface 类名(){}
  • 只能有抽象方法,普通方法和构造方法不存在
  • 不能创建对象
  • 属性一定是常量(static final)
6.0 接口和抽象类有什么用?

文件名:Teacher.java

6.1接口和抽象类的作用是用来当父类被继承的,抽象方法是用来指导子类重写(实现)的
6.2关键子:implements
6.3格式:
            public class 子类类名  implements 接口名{
              //重写父类的所有的抽象方法
             }
6.4接口无非就是领导,只是指导开发
public interface Teacher {
    public static final String name = "aa";
    public static final String job = "aa";
    public static final int age = 20;
    
    //抽象方法
    public abstract void play1();
    public abstract void play2();
    public abstract void play3();
    public abstract void play4();
    public abstract void play5();
}

文件名:UnTeacehr.java

      public abstract class UnTeacher implements Teacher{
      
      }
  • 在上文两个文件中“ Teacher ”类作为接口类(关键词 interface 表示接口类
  • 具备三个常量,不可更改。
  • 有抽象方法,无法实现和定义。
7.0 多态

父类引用变量可以指向子类对象。
多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。
在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。

  • 可以理解为:
有人找孔子他爹去给人上课,
到孔子家里发现他爹不在家,
孔子说,我化妆成我爹的样子,
去给人家上课行不行,
孔子不会他爹的课程,
他只会讲论语。
行,那本来找你爹的,那你就讲论语吧。
8.0 instanceof关键词

我们可以通过instanceof关键字来判断某个对象是否属于某种数据类型。如学生的对象属于学生类,学生的对象也属于人类。

在多态的情况下,因为会将父类声明为子类,当程序复杂度增加到一定量时,往往分不清,声明的是什么子类,而instanceof关键词可以帮助我们判断,基本格式举例为:

Person p = new Teacher();//多态

boolean trueorfalse = p instanceof Student;

这时返回的trueorfalse值为false。

  • 这个例子也叫“向上转型”,子类提升为了父类类型。

可以调用子类和父类的共有类型,但不能调用子类的特有成员。

  • 还有向下转型
    由父类类型强制转为子类类型,举例格式:
Fu f = new ErZi();

 ErZi z = ( ErZi)f;

好处:可以调用子类特有的功能。

  • 可以理解为:
孔子还喜欢打游戏,
孔子爹不会,打游戏不好。
但孔子爹还是觉得陪孩子打游戏可以正确引导他。
但是他不会,
孔子爹强行抓起游戏手柄一顿瞎按。
坑是一回事,也能玩嘛。
9.0 this的第二种用法
package cn.itcast.demo03;
/*
 *   this可以在构造方法之间进行调用
 *   this.的方式,区分局部变量和成员变量同名情况
 *   this在构造方法之间的调用,语法 this()
 */
public class Person {
    private String name;
    private int age;
    
    public Person(){
        //调用了有参数的构造方法
        //参数李四,20传递给了变量name,age
        this("李四",20);
    }
    /*
     *  构造方法,传递String,int
     *  在创建对象的同时为成员变量赋值
     */
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    
}

10.0 super的用法,具体看代码:
//定义Person类,将Student和Worker共性抽取出来
class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        // super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
class Student extends Person {
    // Student类的构造方法
    Student(String name, int age) {
        // 使用super关键字调用父类构造方法,进行相应的初始化动作
        super(name, age);
    }
    public void study() {// Studnet中特有的方法
        System.out.println(this.getName() + "同学在学习");
    }
}
class Worker extends Person {
    Worker(String name, int age) {
        // 使用super关键字调用父类构造方法,进行相应的初始化动作
        super(name, age);
    }
    public void work() {// Worker 中特有的方法
        System.out.println(this.getName() + "工人在工作");
    }
}
public class Test {
    public static void main(String[] args) {
        Student stu = new Student("小明",23);
stu.study();
        
Worker w = new Worker("小李",45);
w.work();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345