文章目录

  • 一、Object
  • 二、final
  • 三、抽象类及抽象方法
  • 四、接口

一、Object

含义:所有类的超类/基类

理解:如果一个类没有明确继承某个类,默认继承Obejct类

equals:判断两个对象的内存地址是否一样

Object o1 = new Object();
Object o2 = new Object();System.out.println(o1.equals(o2));
System.out.println(o1 == o2);

getClass:获取该类的字节码文件对象

Object o1 = new Object();
Object o2 = new Object();Class<? extends Object> c1 = o1.getClass();//获取Object类的字节码文件对象
Class<? extends Object> c2 = o2.getClass();//获取Object类的字节码文件对象System.out.println(c1.equals(c2));
System.out.println(c1 == c2);

hashCode:获取对象的hash值
注意:hash值不代表内存地址,其实是内存地址+散列算法获取到的一个数字

Object o1 = new Object();
Object o2 = new Object();System.out.println(o1.hashCode());
System.out.println(o2.hashCode());

toString:返回对象的字符串表示(把对象转换为字符串)
注意:Integer.toHexString(hashCode()) --> 把10进制的hash值转换为16进制

 public String toString(){return getClass().getName() + "@" + Integer.toHexString(hashCode());}
Object o1 = new Object();//java.lang.Object@15db9742
System.out.println(o1);//默认调用toString
System.out.println(o1.toString());

作用:起到所有类的表率,不同的子类去重写即可

equals:判断两个对象是否相等,不同的子类有不同的判断标准,所有子类重写即可

toString:返回对象的字符串表示,不同的子类有不同的表示方式,所以子类重写即可

getClass:获取字节码文件的对象,用于反射

  理解Object的标杆作用equals标杆作用:判断两个对象是否相同不同的子类有不同判断标准,所以子类重写父类的equals方法即可toString标杆作用:获取对象的字符串表示

Student类

package com.dream.test02;public class Student {private String name;private int age;private char sex;private String classId;private String id;public Student() {}public Student(String name, int age, char sex, String classId, String id) {this.name = name;this.age = age;this.sex = sex;this.classId = classId;this.id = id;}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;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public String getClassId() {return classId;}public void setClassId(String classId) {this.classId = classId;}public String getId() {return id;}public void setId(String id) {this.id = id;}//重写父类的equals后//判断两个学生对象是否相同:判断班级号+学号@Overridepublic boolean equals(Object obj) {if(this == obj){//判断内存地址return true;}Student stu = (Student) obj;if(this.classId.equals(stu.classId) && this.id.equals(stu.id)){return true;}return false;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", sex=" + sex + ", classId=" + classId + ", id=" + id + "]";}
}

测试类

package com.dream.test02;public class Test01 {public static void main(String[] args) {/*** 理解Object的标杆作用* * equals标杆作用:判断两个对象是否相同*    不同的子类有不同判断标准,所以子类重写父类的equals方法即可* * toString标杆作用:获取对象的字符串表示*/Student stu1 = new Student("大牛", 18, '男', "2101", "001");Student stu2 = new Student("大牛", 18, '男', "2101", "001");System.out.println(stu1.equals(stu2));//trueSystem.out.println(stu1 == stu2);//falseSystem.out.println(stu1);System.out.println(stu2);}}

理解Object类的标杆作用
User类

package com.dream.test03;public class User {private String username;private String password;private String name;public User() {}public User(String username, String password, String name) {this.username = username;this.password = password;this.name = name;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic boolean equals(Object obj) {if(this == obj){return true;}User u = (User) obj;if(this.username.equals(u.username)){return true;}return false;}@Overridepublic String toString() {return "User [username=" + username + ", password=" + password + ", name=" + name + "]";}}

测试类

package com.dream.test03;public class Test01 {public static void main(String[] args) {/*** 理解Object类的标杆作用*/User u1 = new User("1445584980", "123123", "掌握梦想");User u2 = new User("1445584980", "321311", "千锋Java何老师");System.out.println(u1.equals(u2));System.out.println(u1);System.out.println(u2);}}

深入Object

 理解String底层Object -- equals:判断两个对象内存地址是否相同String -- equals:判断两个字符串内容是否相等String的equals是判断的两个字符串内容是否相等,原理是将字符串转换为字符数组,依次取出字符,判断两个字符的ASCII是否相等

MyString类

package com.dream.test04;public class MyString {private String s;public MyString(String s) {this.s = s;}@Overridepublic boolean equals(Object obj) {if(this == obj){return true;}MyString m = (MyString) obj;//把两个对象的字符串转换为字符数组char[] v1 = this.s.toCharArray();//['a','b','c']char[] v2 = m.s.toCharArray();//['a','b','c']if(v1.length != v2.length){return false;}for (int i = 0; i < v1.length; i++) {if(v1[i] != v2[i]){//判断字符是否相等(判断的ASCII)return false;}}return true;}@Overridepublic String toString() {return this.s;}}

测试类

package com.dream.test04;public class Test01 {public static void main(String[] args) {/*** 深入Object* * 理解String底层* * Object -- equals:判断两个对象内存地址是否相同* String -- equals:判断两个字符串内容是否相等* * String的equals是判断的两个字符串内容是否相等,原理是将字符串转换为字符数组,依次取出字符,判断两个字符的ASCII是否相等*/String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1.equals(str2));//trueSystem.out.println(str1 == str2);//falseSystem.out.println(str1);//abcSystem.out.println(str2);//abcSystem.out.println("--------");MyString m1 = new MyString("abc");MyString m2 = new MyString("abc");System.out.println(m1.equals(m2));//trueSystem.out.println(m1 == m2);//falseSystem.out.println(m1);System.out.println(m2);}}

二、final

含义:最终的

作用:

  1. 修饰变量:常量(不可变的量,使用全大写命名,单词与单词之间用下划线隔开)

  2. 修饰方法:方法不能被重写

  3. 修饰类:类不能被继承
    A类

package com.dream.test05;//该类为最终的类,不能被继承
public final class A {//准备阶段:int i ;//准备阶段:int i = 10;public final static int I = 10;//子类不能重写该方法public final void method(){System.out.println("父类的方法");}}

B类

package com.dream.test05;//public class B extends A{public class B{}

测试类

package com.dream.test05;public class Test01 {public static void main(String[] args) {/*** final:最终的* * 作用:*       1.修饰变量:常量*       2.修饰方法:方法不能被重写*      3.修饰类:类不能被继承*/final int i = 10;System.out.println(i);}}

三、抽象类及抽象方法

抽象方法:

​ 语法:访问修饰符 abstract 返回值类型 方法名([参数]);

​ 含义:交给非抽象的子类去实现(重写)

​ 注意:

​ 1.没有代码块

​ 2.抽象方法一定是在抽象类

应用场景:当该方法不能很好的实现时,将该方法设置成抽象的,交给非抽象的子类去实现

抽象类:

​ 语法:访问修饰符 abstract class 类名{}

需求:编写中国人和日本人
Person类

package com.dream.test06;//抽象类
public abstract class Person {private String name;private char sex;private int age;public Person() {}public Person(String name, char sex, int age) {this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}//抽象方法public abstract void eat();//抽象方法public abstract void hobby();public void sleep(){System.out.println(this.name + "睡觉觉");}}

Japanese类

package com.dream.test06;public class Japanese extends Person{private String japaneseId;public Japanese() {}public Japanese(String name, char sex, int age, String japaneseId) {super(name, sex, age);this.japaneseId = japaneseId;}public String getJapaneseId() {return japaneseId;}public void setJapaneseId(String japaneseId) {this.japaneseId = japaneseId;}@Overridepublic void eat() {System.out.println(super.getName() + "吃马赛克");}@Overridepublic void hobby() {System.out.println(super.getName() + "喜欢拍电影");}}

Chinese类

package com.dream.test06;public abstract class Chinese extends Person{private String chineseId;public Chinese() {}public Chinese(String name, char sex, int age, String chineseId) {super(name, sex, age);this.chineseId = chineseId;}public String getChineseId() {return chineseId;}public void setChineseId(String chineseId) {this.chineseId = chineseId;}public abstract void dialect();
}

GuangDong类

package com.dream.test06;public class GuangDong extends Chinese{public GuangDong() {}public GuangDong(String name, char sex, int age, String chineseId) {super(name, sex, age, chineseId);}@Overridepublic void dialect() {System.out.println(super.getName() + "说闽南语、粤语");}@Overridepublic void eat() {System.out.println(super.getName() + "吃肠粉、海鲜粥、八合里潮汕牛肉火锅");}@Overridepublic void hobby() {System.out.println(super.getName() + "喜欢喝茶、收租");}}

SiChuan类

package com.dream.test06;public class SiChuan extends Chinese{public SiChuan() {}public SiChuan(String name, char sex, int age, String chineseId) {super(name, sex, age, chineseId);}@Overridepublic void dialect() {System.out.println(super.getName() + "说四川话");}@Overridepublic void eat() {System.out.println(super.getName() + "吃火锅");}@Overridepublic void hobby() {System.out.println(super.getName() + "打麻将");}}

测试类

package com.dream.test06;public class Test01 {public static void main(String[] args) {/*** 抽象类和抽象方法* * 需求:编写中国人和日本人*/Japanese j = new Japanese("古川伊织", '女', 23, "6969696969696969");j.eat();j.hobby();SiChuan sc = new SiChuan("大牛", '男', 18, "123456789");sc.eat();sc.hobby();sc.dialect();GuangDong gd = new GuangDong("李嘉诚", '男', 70, "987654321");gd.eat();gd.hobby();gd.dialect();}}

深入-面试题:

1.可以使用new关键字来创建抽象类对象?

​ 不能,创建的是匿名内部类的对象

2.抽象类中只能有抽象方法?

​ 抽象类可以有非抽象的方法

3.抽象类中不可以没有抽象方法?

​ 可以没有抽象方法,但是这样就毫无意义
4.抽象方法必须在抽象类里吗?

​ 必须

5.如果父类是抽象类,则子类必须实现父类的抽象方法?

​ 不一定,子类如果是抽象类,可以不实现父类的抽象方法

6.抽象类不能有构造方法?

​ 可以有构造方法的
7.既然抽象类不能创建对象,那拿构造方法有什么用?

​ 子类可以通过父类的构造方法给父类的属性赋值

Chinese类

package com.dream.test07;public abstract class Chinese extends Person{private String chineseId;public Chinese() {}public Chinese(String name, char sex, int age, String chineseId) {super(name, sex, age);this.chineseId = chineseId;}public String getChineseId() {return chineseId;}public void setChineseId(String chineseId) {this.chineseId = chineseId;}public abstract void dialect();
}

测试类

package com.dream.test07;public class Test01 {public static void main(String[] args) {/*** 深入抽象类和抽象方法    //创建匿名内部类的对象//1.创建匿名类,继承Chinese类,重写父类的抽象方法//2.创建匿名类的对象Chinese chinese = new Chinese() {@Overridepublic void hobby() {}@Overridepublic void eat() {}@Overridepublic void dialect() {}};}}

四、接口

含义:特殊的抽象类

注意:接口中只能有静态常量 和 抽象方法;JDK1.8开始,接口中可以有默认方法和静态方法

接口应用场景:跟抽象类比,接口更像一个规范,规定了实现类应该要去实现哪个方法
应用场景:抽象类只有静态常量或抽象方法,就用接口去代替

深入接口 - 面试体:
1.一个类可以实现多个接口?
可以实现多个接口:public 类名 implements 接口1,接口2{}
2.一个接口可以实现多个接口?
不可以,一个接口可以继承多个接口
3.接口里面的方法不一定都是抽象的?
JDK1.8开始接口中可以有默认方法和静态方法,JDK1.8之前除了抽象方法外不能有其他方法
4.接口解决了类的单继承问题?
对的,一个类只能继承另一个类,但是可以实现多个接口
5.一个类是否可以继承一个类并同时实现多个接口?
可以
6.接口可以new对象?
不可以,接口是特殊的抽象类,抽象类都不可以,接口自然就不可以,new 接口 是创建的匿名内部类的对象

类 – 接口的关系:

​ 类 与 类:单继承

​ 类 与 接口:单实现、多实现

​ 接口与接口:多继承、多层继承

需求:编写中国人和日本人

IPerson接口

package com.dream.test08;public interface IPerson {//抽象方法:默认添加public abstractpublic void eat();//抽象方法:默认添加public abstractpublic void hobby();//JDK1.8新特性:接口中的默认方法default void sleep(){System.out.println("睡觉觉");}//JDK1.8新特性:接口中的静态方法public static void destination(){System.out.println("人类生活在地球~~~");}}

Chinese实现类

package com.dream.test08;public abstract class Chinese implements IPerson{private String name;private char sex;private int age;public Chinese() {}public Chinese(String name, char sex, int age) {this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public abstract void dialect();}

Japanese实现类

package com.dream.test08;//              实现类     实现        接口
public class Japanese implements IPerson {private String name;private char sex;private int age;private String japaneseId;public Japanese() {}public Japanese(String name, char sex, int age, String japaneseId) {this.name = name;this.sex = sex;this.age = age;this.japaneseId = japaneseId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getJapaneseId() {return japaneseId;}public void setJapaneseId(String japaneseId) {this.japaneseId = japaneseId;}@Overridepublic void eat() {System.out.println(this.name + "吃马赛克");}@Overridepublic void hobby() {System.out.println(this.name + "拍电影");}}

GuangDong类

package com.dream.test08;public class GuangDong extends Chinese{public GuangDong(String name, char sex, int age) {super(name, sex, age);}@Overridepublic void eat() {System.out.println(super.getName() + "吃肠粉");}@Overridepublic void hobby() {System.out.println(super.getName() + "喝茶、收租");}@Overridepublic void dialect() {System.out.println(super.getName() + "说闽南话、粤语");}}

SiChuan类

package com.dream.test08;public class SiChuan extends Chinese{public SiChuan(String name, char sex, int age) {super(name, sex, age);}@Overridepublic void eat() {System.out.println(super.getName() + "吃火锅");}@Overridepublic void hobby() {System.out.println(super.getName() + "打麻将");}@Overridepublic void dialect() {System.out.println(super.getName() + "说四川话");}}

测试类

package com.dream.test08;public class Test01 {public static void main(String[] args) {/*** 接口:特殊的抽象类* * 需求:编写中国人和日本人* * 应用场景:抽象类只有静态常量或抽象方法,就用接口去代替*/Japanese j = new Japanese("小西满里惠", '女', 29, "123456789");j.eat();j.hobby();j.sleep();SiChuan sc = new SiChuan("大牛", '男', 23);sc.eat();sc.hobby();sc.dialect();sc.sleep();GuangDong gd = new GuangDong("李嘉诚", '男', 70);gd.eat();gd.hobby();gd.dialect();gd.sleep();IPerson.destination();}}

深入接口

  • 注意:

    • 1.两个接口中有同名的方法,只会实现一个方法
    • 面试题:
      1. 一个类可以实现多个接口?
        可以

      2. 一个接口可以实现多个接口?
        不行

      3. 接口里面的方法不一定都是抽象的?
        JDK1.8之前接口中只能有静态常量和抽象方法
        JDK1.8开始接口中可以有默认方法和静态方法

      4. 接口解决了类的单继承问题?
        对的

      5. 一个类是否可以继承一个类并同时实现多个接口?
        可以

      6. 接口可以new对象?
        不可以

        类 与 接口的关系:
        类与类:单继承
        类与接口:多实现
        接口与接口:多继承

I1接口

package com.dream.test09;public interface I1 {public void i1Method();public void method1();public void method2();}

I2接口

package com.dream.test09;public interface I2 {public void i2Method();public void method1();default void method2(){System.out.println("I2中的默认方法");}
}

I3接口

package com.dream.test09;public interface I3 extends I4,I5{public void i3Method();}

I4接口

package com.dream.test09;public interface I4 {public void i4Method();}

I5接口

package com.dream.test09;public interface I5 {public void i5Method();}

A类

package com.dream.test09;//          子类   继承         父类          实现       多个接口
public class A extends Object implements I1,I2,I3{@Overridepublic void i2Method() {}@Overridepublic void i1Method() {}@Overridepublic void i4Method() {}@Overridepublic void i3Method() {}@Overridepublic void i5Method() {}@Overridepublic void method1() {}//实现I1中的抽象方法@Overridepublic void method2() {// TODO Auto-generated method stub}//重写I2中的默认方法
//  @Override
//  public void method2() {//      //调用I2接口中的默认方法
//      I2.super.method2();
//  }}

测试类

package com.dream.test09;public class Test01 {public static void main(String[] args) {//创建匿名内部类的对象//1.创建匿名类,实现I1接口中的抽象方法//2.创建匿名类的对象I1 i1 = new I1() {@Overridepublic void method2() {}@Overridepublic void method1() {}@Overridepublic void i1Method() {}};}}

Day11-面向对象(4)相关推荐

  1. 编程中的英语单词大全

    学习Java中用到的专业术语单词总结 day1 掌握 1.JDK abbr. Java开发工具包(Java Developer's Kit) (abbr.缩写) 2.JRE abbr. Java运行环 ...

  2. 一般英文(java)

    day1 Java概述 掌握 1.JDK abbr. Java开发工具包(Java Developer's Kit) (abbr.缩写) 2.JRE abbr. Java运行环境(Java Runti ...

  3. Java相关英语单词

    day1 Java概述 掌握 1.JDK abbr. Java开发工具包(Java Developer's Kit) (abbr.缩写) 2.JRE abbr. Java运行环境(Java Runti ...

  4. python 100days github_GitHub - songhp/Python-100-Days: Python - 100天从新手到大师

    Python教学大纲 Python应用领域和就业形势分析 简单的说,Python是一个"优雅"."明确"."简单"的编程语言. 学习曲线低, ...

  5. 【Java语言基础】面向对象之封装、继承、抽象类、接口、多态综合知识习题及总结day11

    这几天逐渐被idea所折服,越来越喜欢这个优雅又强大的代码编辑器,有很多人说idea对很多初学者不友好,但是在我看来,只要你足够自律,并且英语不会太差,语法上关键的几个单词没什么大问题,idea对初学 ...

  6. Java学习日记Day11(面向对象day05)

    面向对象第5天: 回顾: 向上造型:--------------代码复用 超类型的引用指向派生类的对象 能点出来什么,看引用的类型------------------这是规定 方法的重写(overri ...

  7. python学习面向对象Day11(P116~~126)

    b站达内python课学习笔记 P116 Python面向对象–3.1 课程回顾 一.day10复习 """day10 复习类和对象类:抽象 向量 class Vecto ...

  8. day11 Java 面向对象 final 多态

    文章目录 一.final 关键字 二.多态 (polymorphic) 1.基本 2.多态访问成员特点 3.向上转型和向下转型 3.instanceof 关键字 4.多态访问成员特点 五.练习 总结 ...

  9. python 之路,Day11 (下)- sqlalchemy ORM

    python 之路,Day11 - sqlalchemy ORM 本节内容 ORM介绍 sqlalchemy安装 sqlalchemy基本使用 多外键关联 多对多关系 表结构设计作业 1. ORM介绍 ...

  10. Java面向对象学习练习———潜艇游戏(飞机游戏)

    潜艇游戏需求: 所参与的角色: 战舰.深水炸弹.侦察潜艇.鱼雷潜艇.水雷潜艇.水雷 角色间的关系: 战舰发射深水炸弹 深水炸弹可以打潜艇(侦察潜艇.鱼雷潜艇.水雷潜艇),若打中: 潜艇消失.深水炸弹消 ...

最新文章

  1. 聊聊抖音、奈飞、Twitch、大疆、快手、B站的多媒体关键技术
  2. HTML5与CSS3基础教程第八版学习笔记16-21章
  3. python 数据库 实战_干货!python与MySQL数据库的交互实战
  4. dev c++怎么设置断点_Linux怎么挂载移动硬盘光盘U盘之案例分享
  5. OpenCV通过形态学操作提取水平线和垂直线
  6. 首提 Database Plus 新理念,SphereEx 获数百万美元天使融资,接棒 ShardingSphere 打造新型分布式生态
  7. JEECG_3.7.2新版本入门讲解—UI标签库专题-张代浩-专题视频课程
  8. java开发的主流_盘点2019年Java开发中7项主流、热门的IT技术!
  9. java执行脚本命令(shell脚本或cmd脚本)
  10. 常见网络命令之traceroute命令一起其他常用命令
  11. 我的世界java1.16.1怎么弄材质包_我的世界1.16.1透明矿石材质包
  12. net项目怎么兼容Java_是否能让JAVA 和 .net框架共存
  13. 微信小程序--对接萤石云视频监控
  14. Android好用的桌面小工具,Android桌面小工具Widget功能实现
  15. 【解题报告】2021CCPC东北四省赛
  16. 【Java - L - 0704】- e - 二分查找
  17. 计算机界面视频录制软件,电脑版的录视频软件如何使用?录屏精灵为大家介绍基本操作...
  18. 全国软件2. 三人年龄
  19. 淘宝算法总监解读——淘宝搜索算法现状
  20. 纯前端下载excel数据(导出)

热门文章

  1. linux jboss的安装路径,LINUX下JBOSS的安装及配置
  2. Qt在线帮助文档网址以及安装包下载地址
  3. 上传计算机桌面文件图标不见,关于桌面上图标都不见了这类问题的解决方法
  4. SSL安全证书生成及概念解释
  5. 网站业务被攻击,CPU100%负载满了怎么解决
  6. TEX:文档的布局与组织
  7. Ruby On Rails的傻瓜安装
  8. 数据挖掘考题汇总(填空题与计算题)带答案
  9. 音频数据格式:PCM,WAV,MIDI
  10. 【STM32】:RCC时钟系统