封装
  • 该露的露,该藏的藏

    • 我们程序设计要追求“高内聚,低耦合”。高内聚:类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
  • 封装(数据的隐藏)
    • 通常,应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
  • 总结
    • 属性私有(get/set)

  • 新建一个学生类,访问修饰符为private。在main方法中实例化这个学生类对象,通过对象.属性的方式发现属性不可见,会报错。如果将Demo06类中的private String name;修饰符改为public则可访问。因为private属性为私有,所以即使外部new了对象也不能够使用操作到这个属性。
  • 所以在这里需要提供一些可以操作这个属性的方法。

package com.landray.object;//类
public class Demo06 {// 封装大多时候都是针对于属性,对于方法比较少,重点是在属性中使用。// 名字private String name;// 学号private int id;// 性别private char sex;// 学习()// 睡觉()
}

package com.landray.object;public class Application {public static void main(String[] args) {Demo06 student = new Demo06();//(name报错)The field Demo06.name is not visiblestudent.name = "";}}
  • 封装的实现

package com.landray.object;//类
public class Demo06 {// 封装大多时候都是针对于属性,对于方法比较少,重点是在属性中使用。// private属性私有// 名字private String name;// 学号private int id;// 性别private char sex;// 学习()// 睡觉()// 提供一些可以操作这个属性的方法// 提供一些public 的 get set方法// get 获得这个数据public String getName() {return this.name;}// set给这个数据设置值public void setName(String name) {this.name = name;}// 封装的使用// 以年龄赋值的范围是否合法为例,我们可以对age属性进行一些操作private int age;public int getAge() {return this.age;}public void setAge(int age) {// 如果输入不合法,则年龄赋值为3,否则就等于输入的年龄数if (age > 120 || age < 0) {this.age = 3;} else {this.age = age;}}
}

package com.landray.object;public class Application {public static void main(String[] args) {Demo06 student = new Demo06();// student.name = "";student.setName("亚索");System.out.println(student.getName());// 不合法的年龄,我们可以在set方法中规避掉这些操作// 由于封装过了,我们可以在类中做一些安全性的检查student.setAge(9999);System.out.println(student.getAge());// 封装的意义// 1.提高程序的安全性,保护数据// 2.隐藏代码的实现细节(例如:用户只能调用年龄,并不知道我们在年龄中的设置判断是否合法)// 3.统一接口(所有的方法都是get、set)// 4.增加系统可维护}}

继承
  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。
  • extends的意思是“扩展”。子类是父类的扩展。
  • JAVA中类只有单继承,没有多继承。
  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。
  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用关键字extends来表示。
  • 子类和父类之间,从意义上讲应该具有"is a"的关系。
  • object类
  • super
  • 方法重写

这里定义三个类分别是Person(人)、Student(学生)、Teacher(老师),从一种角度来说学生和老师都是属于人,从继承的角度来理解为(学生is a人、老师is a人),所以学生和老师都是可以继承人类的。从逆向的角度来来,这两种事物都是属于人类,所以我们又可以把这两种事物抽象出来一个人类。


package com.landray.demo01;//person 人:父类
public class Person {// public// protected// default(不写默认就是)// private(一般属性是私有的)private String name = "孙悟空";// 提供子类可以访问这个属性的方法getpublic String getName() {return name;}// 提供子类可以访问这个属性的方法setNamepublic void setName(String name) {this.name = name;}public int money = 10_0000_0000;public void say() {System.out.println("说了一句话");}
}

package com.landray.demo01;//Student(学生) is 人: 派生类/子类
//子类继承了父类,就会拥有父类的全部方法。
public class Student extends Person {}

package com.landray.demo01;//Teacher(老师) is 人: 派生类/子类
public class Teacher extends Person {}
package com.landray;import com.landray.demo01.Student;public class Application {public static void main(String[] args) {// 在这里new了一个student对象,调用其中的say()方法// 但是在Student中并存在这个方法还是能调用到// 是因为Student继承了Person类,这个方法在Person类中存在Student student = new Student();student.say();// 也能访问到Person中定义的变量moneySystem.out.println(student.money);// 访问name属性时报错(The field Person.name is not visible)// 是因为在父类中使用了private修饰符,为父类私有的属性,所以无法访问到。// 但是我们可以在父类中提供public方法的操作来实现访问要求// System.out.println(student.name);// 这里使用到封装数据提供的public方法来访问System.out.println(student.getName());// 输出 孙悟空}}

  • object类
    给Person(父类)清空

package com.landray.demo01;//person 人:父类
//在Java中,所有的类都默认直接或者间接继承object
public class Person extends Object(可省略){//extends Object //可省略//没有显示的定义继承其他类,默认继承Object类
}

在main方法中实例化Person对象,通过person.发现出现了没有定义的很多方法?
思考是不是有一个类跟无参构造一样看不见,但却存在?
在Java中,所有的类都默认直接或者间接继承object


package com.landray;import com.landray.demo01.Person;public class Application {public static void main(String[] args) {Person  person = new Person();person.toString();}}

  • Super–this
    定义一个Person类,Student类,和一个执行的main()方法。Student继承Person。验证得出以下结论:

package com.landray.demo01;public class Person {// 默认就存在的无参构造器public Person() {System.out.println("Person无参构造执行了");}protected String name = "盖伦";public void print() {System.out.println("Person");}// 私有的东西无法被继承private void prints() {System.out.println("Persons");}
}

package com.landray.demo01;public class Student extends Person {// 默认就存在的无参构造器public Student() {// 隐藏代码:调用了父类的无参构造super();// 调用父类的构造器,必须要在子类构造器的第一行System.out.println("子类Student无参构造执行了");}private String name = "拉克丝";public void test1(String name) {System.out.println(name);// 塞拉斯(传递的当前参数)System.out.println(this.name);// 拉克丝(当前类)System.out.println(super.name);// 盖伦(父类)}public void test2() {print();// Studentthis.print();// Studentsuper.print();// Person// 即使继承了父类Person,但是prints()方法修饰符是私有的,所以这里通过super也并不能访问到。// 私有的无法被继承// super.prints();}public void print() {System.out.println("Student");}
}

package com.landray;import com.landray.demo01.Student;public class Application {public static void main(String[] args) {// 1.实例化子类验证this、super关键字// Student student = new Student();// student.test1("塞拉斯");// student.test2();// 2.只实例化这个对象,执行内容为(Person无参构造执行了、子类Student无参构造执行了)// 说明在Student类中默认调用了父类的构造器super();Student student = new Student();}}
  • super注意点:

    • 1.super调用父类的构造方法,必须在构造方法的第一个
    • 2.super必须只能出现在子类的方法或者构造器中(如果在父类中那就是object了)
    • 3.super和this不能同时调用构造方法(两个都要保证在第一行,所以会报错)
  • 对比this注意点:
    • 代表的对象不同:

      • this:本身调用者这个对象
      • super:代表父类对象的引用
    • 前提:
      • this:没有继承也可以使用
      • super:只能在继承条件下才可以使用
    • 调用构造方法区别:
      • this():默认调用本类的构造
      • super():默认调用父类的构造

  • 方法重写(关乎多态)(override)

    • 重写:需要有继承关系,子类重写父类的方法(和属性无关)

      • 1.方法名必须相同
      • 2.参数列表必须相同
      • 3.修饰符范围可以扩大但不能缩小:public>protected>default>private
      • 4.抛出的异常:范围可以被缩小,但是不能扩大
  • 重写,子类的方法和父类必须要一致,方法体不同。
  • 为什么需要重写:
    • 父类的功能,子类不一定需要,或者不一定满足。

package com.landray.demo01;//重写都是方法的重写,和属性无关
public class B {// 静态方法public static void test() {System.out.println("B======>test()");}// 非静态方法public void tests() {System.out.println("B======>tests()");}
}

package com.landray.demo01;//继承
public class A extends B {// 静态方法public static void test() {System.out.println("A======>test()");}// 非静态方法public void tests() {System.out.println("A======>tests()");}
}

package com.landray;import com.landray.demo01.A;
import com.landray.demo01.B;public class Application {// 静态的方法和非静态的方法区别很大// 静态方法:方法的调用只和左边,定义的数据类型有关// 重写只和非静态方法有关// 非静态方法才是重写// public才能重写,private不能重写。public static void main(String[] args) {// 静态方法-开始A a = new A();a.test();// A======>test()// 父类的引用指向了子类B b = new A();b.test();// B======>test()// 静态方法-结束// 非静态方法-开始A a1 = new A();a1.tests();// A======>tests()B b1 = new A();// 子类重写了父类的方法b1.tests();// A======>tests()// 非静态方法-结束}}
多态(动态编译、类型、可扩展性)
  • 多态的语法格式:父类类名 引用名称 = new 子类类名(); [注意:当是多态时,该引用名称只能访问父类中的属性和方法,但是优先访问子类重写以后的方法多态:将多个对象调用同一个方法,得到不同的结果。]
  • 即同一方法可以根据发送对象的不同而采用多种不同的行为方式。
  • 一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类/有关系的类)
  • 多态存在的条件
    • 有继承关系
    • 子类重写父类方法
    • 父类引用指向子类对象
  • 注意:多态是方法的多态,属性没有多态性。
  • instanceof(类型转换-引用类型)-判断一个对象是什么类型
  • 多态注意事项:
    • 1.多态是方法的多态,属性没有多态。
    • 2.父类和子类,存在联系。例如:不能把String类型转换为Person类型。否则存在类型转换异常(classCastException)
    • 3.存在的条件:
      • 继承关系
      • 方法需要重写(如果不重写调用的都是各自的方法,就没有任何区别)
      • 父类引用指向子类对象(Father f1 = new Son())
  • 不能被重写情况:
    • 1.static方法,属于类,不属于实例。
    • 2.final 常量池中。
    • 3.private方法私有不能被重写。
  • 不能重写就无法实现多态。

package com.landray.demo01;public class Person {public void run() {System.out.println("run");}
}

package com.landray.demo01;public class Teacher extends Person {@Overridepublic void run() {System.out.println("son");}public void eat() {System.out.println("eat");}
}

package com.landray;import com.landray.demo01.Person;
import com.landray.demo01.Teacher;public class Application {public static void main(String[] args) {// 1.新建Person类和Teacher类,Teacher继承Person。// 当我们在这里实例这个两个对象的时候,对象的实际类型是确定的。// Teacher teacher = new Teacher();// Person person = new Person();// 可以指向的引用类型就不确定了Teacher t1 = new Teacher();// Teacher能调用的方法都是自己的或者继承父类的// 父类的引用指向子类Person t2 = new Teacher();// 父类型,可以指向子类,但是不能调用子类独有的方法// 因为都继承于object类,所以也可以这么写Object t3 = new Teacher();// 1.在Person类中写下run()方法t2.run();// 输出 run(new的是子类但是还是走的父类的方法)// 2.在子类Teacher中,重写父类的run()方法(t2.run()和t1.run()都输出son)// t2.run()也输出son是因为子类重写了父类的方法,执行子类的方法t1.run();// 3.在Teacher中添加eat()方法t1.eat();// t2.eat();// 在Person中没有eat()方法,所以这样会报错。(可以指向子类,但是不能调用子类独有的方法)((Teacher) t2).eat();// 类型转换可以调用// 对象能执行哪些方法,主要看对象左边的类型,和右边关系不大。(看型来确定执行的方法,哪个类型就执行哪个类型中的方法,如果两个类型中都有这个方法,那就执行子类中的方法)}}
instanceof(判断一个对象是什么类型/是否存在父子关系/是否有联系)
  • 创建三个类,关系如下:
  • Person类为父类

package com.landray.demo02;public class Person {}
  • 子类Student和Teache分别继续Person:

package com.landray.demo02;public class Teacher extends Person {}

package com.landray.demo02;public class Student extends Person {}
  • 使用instanceof关键字判断类之间的关系如下:

package com.landray.demo02;public class Application {public static void main(String[] args) {// 当前类的关系:// 最外层的 Object > Person > Student// 最外层的 Object > Person > Teacher// 最外层的 Object > StringObject object = new Student();System.out.println(object instanceof Student);// trueSystem.out.println(object instanceof Person);// trueSystem.out.println(object instanceof Object);// trueSystem.out.println(object instanceof Teacher);// falseSystem.out.println(object instanceof String);// falseSystem.out.println("===========================");Person person = new Student();System.out.println(person instanceof Student);// trueSystem.out.println(person instanceof Person);// trueSystem.out.println(person instanceof Object);// trueSystem.out.println(person instanceof Teacher);// false// System.out.println(person instanceof String);// 编译报错System.out.println("===========================");Student student = new Student();System.out.println(student instanceof Student);// trueSystem.out.println(student instanceof Person);// trueSystem.out.println(student instanceof Object);// true// System.out.println(student instanceof Teacher);// 编译报错// System.out.println(student instanceof String);// 编译报错// 结论:// System.out.println(X instanceof Y);//能不能编译通过!}
}
类型转换
  • 创建两个类分别是:

    • Person和Student类,Student继承Person。

package com.landray.demo02;public class Person {public void run() {System.out.println("run");}
}

package com.landray.demo02;public class Student extends Person {public void go() {System.out.println("go");}
}
  • 类型转换步骤如下:

package com.landray.demo02;public class Application {public static void main(String[] args) {// 类型之间的转换:// 基本类型转换:高低转换 64 32 16 8, 高转低需要强转,低转高自动转换。// 父(高) 与 子(低)的类型转换。// 高 --------------------低Person obj = new Student();// 通过student.的方式并不能访问到Student中的go()方法。// 所以需要将这个对象转换为Student类型,就可以使用Student类型的方法了。// 方式一:Student std = (Student) obj;// 高转低std.go();// 方式二:((Student) obj).go();// 子类转换为父类,可能丢失自己本来的方法。Student student = new Student();student.go();// 低转高自动转换Person per = student;// 通过per.的方式并不能访问到student对象中的go()方法。子类转为父类丢失了方法。// 1.父类的引用指向子类的对象// 2.把子类转换为父类,向上转型// 3.把父类转换为子类,向下转型;强制转换// 4.方便方法的调用(不用重新去new一个类,升级或者降级来调用其他的方法),减少重复的代码,和利用率。}
}

Java SE_封装、继承、object类、super-this关键字、方法重写、多态、instanceof、类型转换相关推荐

  1. java.lang包【Object类】

    基本描述: (1)Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入: (2)Object类是所有Java类的祖先.每个类都使用 Obje ...

  2. 第三周 Java语法总结__static关键字__代码块__继承__this和super的区别__重写__final关键字__多态__抽象__接口__形参问题__包__权限修饰符__内部类

    文章目录 6.static关键字 1)静态static关键字的特点: 2)关于static关键字的使用注意事项 3)什么时候将变量定义为成员变量: 7.文档说明书: 8.代码块 9.继承 1)继承的概 ...

  3. 重写Java Object类中的equals()方法

    Java中的Object类中的equals方法 Object类的equals方法 重写Object类的equals()方法 Person类默认继承了Object类,所以可以使用Object类的equa ...

  4. JAVA入门级教学之(Object类中的equals方法)

    package com.lbj.javase18; /**  * 关于Object中的equals方法:  *   * Object中的equals方法(核心):  *  public boolean ...

  5. java程序设计专业介绍_简介Java编程中的Object类

    这篇文章主要介绍了简介Java编程中的Object类,是Java入门学习中的基础知识,需要的朋友可以参考下 Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每 ...

  6. python面向对象中方法重写class Person (object):#说明Person继承object类 def __init__(self,name,age): sel

    (承接上次的知识学习) 首先给出方法重写的定义: 1.如果子类对继承自父类的某个属性或方法不满意,可以在子类中对其(方法体)进行重新编写: 2.子类重写后的方法可以通过super().xxx()调用父 ...

  7. Java面试知识点:Object类、Math类、BigDecimal类、自动装箱、拆箱

    问题:Java面试知识点:Object类.BigDecimal类.自动装箱.拆箱 答案: 1.Object类: 代码如下: package com.xy;/*** @ProjectName: day0 ...

  8. JAVA进阶教学之(Object类中的equals方法)

    public boolean equals(Object obj){return (this == obj); } 原始equals方法是判断两个对象的内存地址是否相等的(内存地址相等,保存的值也相等 ...

  9. java程序设计_Java程序设计-Object类(笔记)

    1.(java.lang.Object类,代码情景引入)(API演示Object类的内容) 总结: 1)Object类是所有Java类的根父类 2)如果在类的声明中未使用extends关键字指明其父类 ...

最新文章

  1. 不用卷积,也能生成清晰图像,华人博士生首次尝试用两个Transformer构建一个GAN
  2. JNDI学习总结(1)——JNDI入门简介
  3. 科技在进步,一文带你看看 MATLAB R2020a 为工程师和科学家带来哪些 AI 功能?
  4. LInkedBlockingQueue队列
  5. js reduce实现中间件_js数组高阶方法reduce经典用法代码分享
  6. Windows Phone 知识锦(12月版)
  7. [Mac] php安装protobuf扩展
  8. java中除了跟数据相关的知识_Java的基本数据类型及知识介绍
  9. 论文阅读9-Fine-tuning Pre-Trained Transformer Language Models to(远程监督关系抽取,ACL2019,GPT,长尾关系,DISTRE)
  10. c语音学习-输入一个小写字母,输出其对应的大写字母
  11. 网管工具使用与技巧大全
  12. 激光雕刻机——广告制作新利器
  13. Python多线程获取上证50成分股交易数据
  14. 【PBR理论】第2讲 BRDF理想漫反射(Diffuse)
  15. Winter And Snowmen
  16. 用Python爬取淘宝2000款套套,我发现了一个重要秘密
  17. 数据结构 Java数据结构 --- Lambda表达式
  18. 六、线性方程组求解--Jacobi和Gauss-Seidel迭代求解
  19. 【文献复现】-氧还原反应塔菲尔斜率绘制(文献阅读)
  20. 【生产者分析一】Kafka生产者流程【初探】

热门文章

  1. 有人朝你扔泥巴-一个小孩
  2. SQL 计算账户余额
  3. 免费Android在线视频教程
  4. jest+enzyme针对 react16+ typescript UT代码的debug方法
  5. 揭阳医院输血科建设考虑
  6. 极其方便的使用Mybatis单表的增删改查
  7. 高质量的单元测试 Spock单元测试框架详讲
  8. WDS部署服务之四镜像捕获(2)
  9. 特斯拉手机,了解一下?
  10. java打印一些数字_java – 如何打印数字模式