21.构造方法(续):
分类:
隐式构造方法:如果在一个类中,没有手动编写构造方法,则系统会提供一个默认的无参的构造方法
显式构造方法:如果在一个类中,手动编写构造方法,则系统不会提供默认的无参的构造方法

建议:当手动编写构造方法时,建议先编写无参构造方法
22.引用数据类型
String
用户自定义类型,如:Teacher、Student

注意:引用数据类型赋值两种方式:赋值对象,赋值为null

小知识点:当一个对象作为另一个对象的属性
或者当一个对象中的属性是引用数据类型
23.空指针异常
java.lang.NullPointerException
出现空指针异常原因:说明该引用名称中存放的不是某个对象的地址,也就是null

解决办法:在调用某个对象中的属性或方法之前,必须保证该引用名称存放的是对象的地址

24.封装
24.1面向对象三大特征:封装、继承、多态
24.2封装
隐藏类的内部信息,不允许外部程序直接访问,而是通过方法进行操作
24.3封装的操作步骤:
第一步:将属性设置为私有的private,只能在本类中使用
private int age;
第二步:设置属性的get取值和set赋值方法
//赋值方法
public void setAge(int age){
//第三步:适当位置编写判断语句
if(age >= 0 && age <= 120){
this.age = age;
}else{
this.age = 21;
}
}

//取值方法
public int getAge(){
return age;
}

  1. *
  2. 编写人Person类,属性:名字、年龄、性别,通过封装完成对属性赋值和取值
  3. */
  4. class Person{
  5. //属性
  6. private String name;
  7. private int age;
  8. private char sex;
  9.  
  10. //编写所有属性的赋值方法
  11. public void setName(String name){
  12. this.name = name;
  13. }
  14. public void setAge(int age){
  15. //当年龄在0---120为合法的,否则为21
  16. if(age >= 0 && age <= 120){
  17. this.age = age;
  18. }else{
  19. this.age = 21;
  20. }
  21. }
  22. public void setSex(char sex){
  23. //性别只能是男或女,否则性别为女
  24. if(sex == '男' || sex == '女'){
  25. this.sex = sex;
  26. }else{
  27. this.sex = '女';
  28. }
  29. }
  30. //编写所有属性的取值方法
  31. public String getName(){
  32. return name;
  33. }
  34. public int getAge(){
  35. return age;
  36. }
  37. public char getSex(){
  38. return sex;
  39. }
  40.  
  41. }
  42. //编写人的测试类
  43. class PersonTest{
  44. public static void main(String[] args){
  45. //实例化Person
  46. Person p = new Person();
  47.  
  48. p.setName("李四");
  49. p.setAge(23);
  50. p.setSex('n');
  51.  
  52. System.out.println("姓名:" + p.getName() + "\n年龄:" + p.getAge() + "\n性别:" + p.getSex());
  53. }
  54. }

25.this关键字
this代表当前这个对象,也就是说当前谁调用该方法则this代表就是谁
this关键字可以访问当前类中的属性、方法、也可以访问构造方法
注意:

1.当访问本类中的非静态方法和属性时,默认前面添加this.
2.当访问本类中的构造方法时,必须编写在构造方法中,并且是第一条语句
3.构造方法不能出现递归调用
26.参数传递
26.1基本数据类型作为参数传递----传递值
总结:当基本数据类型作为参数进行传递时,传递的是值,当有一个方法中的值发生改变,则对另一个方法中的值没有任何影响(各自是独立的)


26.2引用数据类型作为参数传递----传递地址
总结:当引用数据类型作为参数传递时,传递的是地址,当一个方法中属性的值发生改变时,对另一个方法中的属性值有影响(共用同一个地址)

27.static关键字
27.1 static关键字可以修饰属性
---该属性在方法区中开辟空间
---访问时可以使用类名.属性名称、引用名称.属性名称,当引用名称的值为null时也可以访问
如:Student.address
stu.address
stu = null;
stu.address
---与类同生死,生命周期长
---类优先于对象


27.2好处:节省空间

27.3.3static关键字可以修饰方法
注意:

1.静态方法中只能访问静态属性和方法
2.实例方法中可以访问静态的属性和方法,也可以访问实例属性和方法
3.3static关键字可以修饰代码块 ,称为静态代码块
static{

}
作用:完成静态属性赋值的

注意:1.当类被第一次载入时,静态代码块就自动执行

建议:当调用静态属性或静态方法时,使用类名

练习:
编写一个狗类,属性:名字、颜色、年龄、品种,方法:输出信息
编写一个猫类,属性:名字、颜色、年龄,方法:输出信息
编写测试类,分别创建猫和狗的对象,输出信息

分析:发现以上猫类和狗类中有相同的属性、方法,能否将共有的属性和方法编写一次?
-----能
解决办法:
1.将相同的属性和方法编写在单独的一个类中,称为父类
2.然后在猫和狗子类中继承父类,并编写子类中独有的属性和独有的方法

动物Animal类:
共有属性:名字、颜色、年龄
共有方法:输出信息
狗类 继承 动物类
独有属性:品种strain
猫类 继承 动物类

  1. /第一步:编写父类Animal
  2. class Animal{
  3. //属性也叫做成员变量或实例变量
  4. String name;
  5. String color;
  6. int age;
  7.  
  8. //方法也叫做成员方法或实例方法
  9. public void show(){
  10. System.out.println("名字:" + name);
  11. System.out.println("颜色: " + color);
  12. System.out.println("年龄:" + age);
  13. }
  14. }
  15. //编写狗的子类并继承父类Animal
  16. class Dog extends Animal{
  17. //编写独有的属性
  18. String strain;
  19.  
  20. //编写show方法,输出狗的所有信息-----方法的重写
  21. public void show(){
  22. System.out.println("名字:" + name);
  23. System.out.println("颜色: " + color);
  24. System.out.println("年龄:" + age);
  25. System.out.println("品种:" + strain);
  26. }
  27. }
  28. //编写猫的子类并继承父类Animal
  29. class Cat extends Animal{
  30.  
  31. }
  32. //编写测试类
  33. class Test{
  34. public static void main(String[] args){
  35. //创建狗的对象,输出信息
  36. Dog dog = new Dog();
  37. dog.show(); //调用子类中重写后的show方法
  38.  
  39. System.out.println();
  40. //创建猫的对象,输出信息
  41. Cat cat = new Cat();
  42. cat.show(); //调用父类中的show方法
  43. }
  44. }

28.继承
28.1好处:减少代码的冗余性
28.2面向对象有三大特征:封装,继承,多态

28.3继承画类图


28.4编写继承的代码
第一步:编写父类
第二步:编写子类
class 子类名称 extends 父类名称{

}

注意:在Java中,所有类都是从Object类继承过来的,也就是说所有类的根都是Object
class Dog{

}
//等价于
class Dog extends Object{

}

也就是说如果父类是Object则可以省略不写
28.5 方法重写(override)也叫覆盖
在子类中重写父类中的方法,必须保证子类中方法的名字与父类方法名称一致、参数列表一致、返回一致或父类方法返回类型的子类类型、修饰符不能缩小范围

注意:

1.只能重写父类的实例方法
2.私有的方法不能被重写
2.继承的注意事项
---当子类继承父类时,继承父类中属性和方法,但是父类中的私有成员(成员变量和成员方法)不能被继承,以及父类中的构造方法也不能被继承
---父类也叫做超类,基类
子类也叫做派生类
---一个类只能继承一个直接的父类,也就是说类是单根性
---类具有传递性
class A{
//2个属性,3个方法
}
class B extends A{
//独有属性1个,独有方法2个
}
class C extends B{

}
28.6.super关键字
super表示父类,必须在子类中访问父类中的属性、方法也可以访问父类中的构造方法
注意:当使用super关键字访问父类中的构造方法,则必须编写在子类构造方法中,并且是第一条语句

.this关键字
this关键字可以访问当前类中的属性、方法以及构造方法
还可以访问父类中的属性、方法

28.7.当创建子类对象,父类做了什么?
----先执行父类的构造方法,然后再执行子类相匹配的构造方法

----如果子类构造方法中没有指明调用父类哪个构造方法,则默认调用父类的无参构造方法
----如果子类构造方法中指明调用父类哪个构造方法,通过super()或super(name,color,age),则调用父类相匹配的构造方法
29.多态

多个对象调用同一个方法,则结果不同

  1. class Person{
  2. //属性
  3. String name;
  4. int age;
  5. char sex;
  6.  
  7. //构造方法
  8. public Person(){
  9.  
  10. }
  11. public Person(String name,int age,char sex){
  12. this.name = name;
  13. this.age = age;
  14. this.sex = sex;
  15. }
  16.  
  17. //编写显示信息方法
  18. public void show(){
  19. System.out.println("姓名:" + this.name + "\n年龄:" + this.age + "\n性别:" + this.sex);
  20. }
  21. }
  22. //编写Student子类并继承Person父类
  23. class Student extends Person{
  24. //编写子类独有的属性:成绩
  25. double score;
  26.  
  27. //构造方法
  28. public Student(){
  29.  
  30. }
  31. public Student(String name,int age,char sex,double score){
  32. super(name,age,sex);
  33. this.score = score;
  34. }
  35.  
  36. //编写学习的独有方法
  37. public void study(){
  38. System.out.println(super.name + "正在学习面向对象编程......");
  39. }
  40.  
  41. //重写显示信息方法
  42. public void show(){
  43. super.show();
  44. System.out.println("成绩: " + score);
  45. }
  46. }
  47. //编写Teacher子类并继承Person父类
  48. class Teacher extends Person{
  49. //编写独有属性:薪资
  50. double salary;
  51.  
  52. //构造方法
  53. public Teacher(){
  54.  
  55. }
  56. public Teacher(String name,int age,char sex,double salary){
  57. super(name,age,sex);
  58. this.salary = salary;
  59. }
  60.  
  61. //编写独有方法教学
  62. public void teach(){
  63. System.out.println(super.name + "正在讲面向对象编程课程。。。。。。");
  64. }
  65.  
  66. //重写父类的显示信息方法
  67. public void show(){
  68. super.show();
  69. System.out.println("薪资:" + this.salary);
  70. }
  71. }
  72. //编写测试类
  73. class Test{
  74. public static void main(String[] args){
  75. //创建Student对象
  76. /*Student s = new Student(); //没有构成多态
  77. s.show(); //先在学生类中找,如果没有找到则再去父类中找show方法*/
  78.  
  79. /*Person s2 = new Student(); //就是多态:多种形态,则只能访问父类中的属性和方法,但是优先访问子类重写以后的方法
  80. s2.show(); //优先访问子类重写以后的方法
  81. //s2.study(); //出现编译错误,原因:多态不能访问子类独有的属性和方法
  82.  
  83. System.out.println(s2.name); //null
  84. System.out.println(s2.age); //0
  85. System.out.println(s2.sex); //
  86. //System.out.println(s2.score); //出现编译错误,原因:多态不能访问子类独有的属性和方法*/
  87.  
  88. //父类类名 引用名称 = new 子类类名();
  89. /*Person p = new Student(); //构成多态
  90. p.show(); //优先访问重写以后的方法
  91.  
  92. System.out.println();
  93. Person p2 = new Teacher(); //构成多态
  94. p2.show();*/
  95.  
  96. /*Teacher t = new Teacher(); //没有构成多态
  97. t.show();*/
  98. }
  99. }
  100.  
  101. //编写第二个测试类
  102. class Test2{
  103. public static void main(String[] args){
  104. //Student s = new Student(); //没有构成多态
  105. /*System.out.println(s.name); //null
  106. System.out.println(s.age); //0
  107. System.out.println(s.sex);
  108. System.out.println(s.score); //0.0
  109.  
  110. s.show();
  111. s.study();*/
  112.  
  113. Person p = new Person(); //没有构成多态,注意:一般不实例化父类
  114. /*System.out.println(p.name); //null
  115. System.out.println(p.age); //0
  116. System.out.println(p.sex); */
  117. //System.out.println(p.score); //编译错误
  118.  
  119. //p.show(); //访问父类中的show方法
  120.  
  121. Person person = new Student(); //构成多态,同时也是向上转型
  122. person.show();
  123.  
  124. //必须将person引用名称转为Student类型,则才可以访问study方法
  125. //person.study(); //编译错误
  126. /*Student stu = (Student)person; //向下转型
  127. stu.study();
  128.  
  129. Teacher t = (Teacher)person; //出现运行错误,原因:person引用中存放的是学生对象的地址,因此不能随意转为其他子类类型,建议在进行向下转型之前先进行判断,当合法进行向下转型,使用instanceof关键字
  130. System.out.println(t.salary);*/
  131.  
  132. //在进行向下类型转换时可能会出现类型转换异常(java.lang.ClassCastException),进行判断
  133. if(person instanceof Student){
  134. //则强制转为学生
  135. Student s = (Student)person;
  136. s.study();
  137. }else if(person instanceof Teacher){
  138. //则强制转为教师
  139. Teacher t = (Teacher)person;
  140. t.teach();
  141. }
  142. }
  143. }

29.1语法格式:
父类类名 引用名称 = new 子类类名(); //当构成多态时,只能访问父类中的属性和方法,但是优先访问子类重写以后的方法
29.2满足多态的条件:
1.必须子类继承父类
2.必须在子类中重写父类的方法
3.父类类名 引用名称 = new 子类类名();
6.3在多态中,有两种类型转换:
1.子类对象---->父类类型,称为向上转型或自动类型转换
如:Person p = new Student(); //构成多态,也是向上转型或自动类型转换

举个例子:有2个类,Father是父类,Son类继承自Father。

Father f1 = new Son();   // 这就叫 upcasting (向上转型)

// 现在f1引用指向一个Son对象

Son s1 = (Son)f1;   // 这就叫 downcasting (向下转型)

当是向上转型时则只能访问父类中的属性和方法,但是优先访问子类重写以后的方法
2.父类引用名称---->子类类型,称为向下转型或强制类型转换
Student p = (Student)p;
*****注意:

1.当是多态时,并访问子类独有的属性或方法时则必须进行向下转型
2.在进行向下类型转换时可能会出现类型转换异常(java.lang.ClassCastException),建议先进行判断,满足在进行强制类型转换
30.递归:方法自己调用自己,但是必须保证要有出口
练习:使用递归完成计算n!,如:3!= 3 * 2 * 1

Java基础学习笔记(四)的更多相关文章

  1. Java基础学习笔记(四) - 认识final关键字、权限修饰符和内部类

    一.final关键字 为什么要使用 final 关键字? 通过继承我们知道,子类可以重写父类的成员变量和方法.final 关键字可以用于修饰父类,父类成员变量和方法,使其内容不可以被更改. 1.被修饰 ...

  2. Java基础学习笔记四 Java基础语法

    数组 数组的需求 现在需要统计某公司员工的工资情况,例如计算平均工资.最高工资等.假设该公司有50名员工,用前面所学的知识完成,那么程序首先需要声明50个变量来分别记住每位员工的工资,这样做会显得很麻 ...

  3. java基础学习笔记四(异常)

    Java中的异常 Exception 如图可以看出所有的异常跟错误都继承与Throwable类,也就是说所有的异常都是一个对象. 从大体来分异常为两块: 1.error---错误 : 是指程序无法处理 ...

  4. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  5. Java IO学习笔记四:Socket基础

    作者:Grey 原文地址:Java IO学习笔记四:Socket基础 准备两个Linux实例(安装好jdk1.8),我准备的两个实例的ip地址分别为: io1实例:192.168.205.138 io ...

  6. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  7. Java基础学习笔记(一)

    Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...

  8. 零拷贝详解 Java NIO学习笔记四(零拷贝详解)

    转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...

  9. java基础学习笔记五(抽象类)

    java基础学习总结——抽象类 抽象类介绍

  10. Java基础学习笔记二十八 管家婆综合项目

    本项目为JAVA基础综合项目,主要包括: 熟练View层.Service层.Dao层之间的方法相互调用操作.熟练dbutils操作数据库表完成增删改查. 项目功能分析 查询账务 多条件组合查询账务 添 ...

随机推荐

  1. win7 数据源只有 SQL SERVER, WIN7 64bit 环境使用 access 作为 CIS的数据源

    最近换了个工作电脑,安装的是 WIN7 64BIT,结果配置CIS数据源的时候出现问题了,默认的数据源只有 SQL SERVER,没有ACCESS的数据源.后来在网上寻找了一圈后,找到了解决方法: C ...

  2. 禁用firefox 56自动更新

    firefox 56支持旧式扩展,这很重要! 它却自动更新,简单地关了也不行,很是牛氓! ========== -备份C:\Users\用户名\AppData\Roaming\Mozilla\Fire ...

  3. 【转】AD常用端口

    通常在域环境中我们有部分设备在DMZ区时,就需要知道AD的相关端口.在此提供给各位: 用户登录与验证身份时会用到的连接端口用户登录时会用到以下的服务,因此如果用户的计算机与域控制器之间被防火墙隔开,就 ...

  4. oryx 分离&集成

    公司需要用到在线的流程编辑器,我研究了下activiti,activiti-explorer 是一个 web流程编辑工具,根据我了解到的情况. activiti-explorer web流程编辑工具 ...

  5. Analysis of Web.xml in Hello1project

    一下是hello1  web inf 里的  web.xml <?xml version="1.0" encoding="UTF-8"?><w ...

  6. swfupload文件上传配置文件大小

    在配置文件中加入: <system.web>         <httpRuntime executionTimeout="36000" maxRequestLe ...

  7. springMVC接受json并打开新页面

    背景:框架中,两个web工程A,B,我的B工程开发了一个对外action接口,A来连,要实现的功能是,A的页面发起一个action请求,到达B的springmvc,通过验证后,打开一个B工程新的tab ...

  8. TP5 模型事务操作

    注意:数据只要涉及多表一致性操作,必须要开启数据库事务操作 ThinkPHP5 中模型层中使用事务: try{ $this->startTrans(); $this->data($orde ...

  9. vue全局变量定义和修改

    1. 只读的全局变量 对于只读的全局变量,知道的有以下两种使用方式: 1)global.js 模块中定义:其他模块import后再使用即可 1.1)定义 import Vue from 'vue'; ...

  10. Intellij IDEA编辑golang时无法加载系统GOPATH变量

    问题: 编译go项目时,报找不到包.从日志看,GOPATH与系统设置的不一致. 如何解决:系统的gopath路径,加到Project libraries中 参考:https://segmentfaul ...