/* 我想要对数组进行操作 如何制作一个说明书呢? A:写一个工具类 B:对这个类加入文档注释 怎么加呢? 加些什么东西呢? C:用工具解析文档注释 javadoc工具 D:格式 javadoc -d 目录 -author -version ArrayTool.java 目录:就可以写一个文件夹的路径 制作帮助文档出错: 找不到可以文档化的公共或受保护的类:告诉我们类的权限不够 */
1:打开帮助文档 2:点击显示,找到索引,看到输入框 3:知道你要找谁?以Scanner举例 4:在输入框里面输入Scanner,然后回车 5:看包 java.lang包下的类不需要导入,其他的全部需要导入。 要导入: java.util.Scanner 6:再简单的看看类的解释和说明,别忘了看看该类的版本 7:看类的结构 成员变量 字段摘要 构造方法 构造方法摘要 成员方法 方法摘要 8:学习构造方法 A:有构造方法 就创建对象 B:没有构造方法 成员可能都是静态的 9:看成员方法 A:左边 是否静态:如果静态,可以通过类名调用 返回值类型:人家返回什么,你就用什么接收。 B:右边 看方法名:方法名称不要写错 参数列表:人家要什么,你就给什么;人家要几个,你就给几个
/* 代码块:在Java中,使用{}括起来的代码被称为代码块。 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期。 构造代码块:在类中的成员位置,用{}括起来的代码。每次调用构造方法执行前,都会先执行构造代码块。 作用:可以把多个构造方法中的共同代码放到一起,对对象进行初始化。 静态代码块:在类中的成员位置,用{}括起来的代码,只不过它用static修饰了。 作用:一般是对类进行初始化。 面试题? 静态代码块,构造代码块,构造方法的执行顺序? 静态代码块 -- 构造代码块 -- 构造方法 静态代码块:只执行一次 构造代码块:每次调用构造方法都执行 */ class Code { static { int a = 1000; System.out.println(a); } //构造代码块 { int x = 100; System.out.println(x); } //构造方法 public Code(){ System.out.println("code"); } //构造方法 public Code(int a){ System.out.println("code"); } //构造代码块 { int y = 200; System.out.println(y); } //静态代码块 static { int b = 2000; System.out.println(b); } } class CodeDemo { public static void main(String[] args) { //局部代码块 { int x = 10; System.out.println(x); } //找不到符号 //System.out.println(x); { int y = 20; System.out.println(y); } System.out.println("---------------"); Code c = new Code(); System.out.println("---------------"); Code c2 = new Code(); System.out.println("---------------"); Code c3 = new Code(1); } }
/* 写程序的执行结果。 林青霞都60了,我很伤心 我是main方法 Student 静态代码块 Student 构造代码块 Student 构造方法 Student 构造代码块 Student 构造方法 */ class Student { static { System.out.println("Student 静态代码块"); } { System.out.println("Student 构造代码块"); } public Student() { System.out.println("Student 构造方法"); } } class StudentDemo { static { System.out.println("林青霞都60了,我很伤心"); } public static void main(String[] args) { System.out.println("我是main方法"); Student s1 = new Student(); Student s2 = new Student(); } }
类与类产生了关系,其实也是继承的一个弊端: 类的耦合性增强了。 开发的原则:低耦合,高内聚。 耦合:类与类的关系 内聚:就是自己完成某件事情的能力
/* Java中继承的特点: A:Java只支持单继承,不支持多继承。 有些语言是支持多继承,格式:extends 类1,类2,... B:Java支持多层继承(继承体系) */ /* class Father {} class Mother {} class Son exnteds Father {} //正确的 class Son extends Father,Mother {} // 错误的 */
class GrandFather { public void show() { System.out.println("我是爷爷"); } } class Father extends GrandFather { public void method(){ System.out.println("我是老子"); } } class Son extends Father {} class ExtendsDemo2 { public static void main(String[] args) { Son s = new Son(); s.method(); //使用父亲的 s.show(); //使用爷爷的 } }
/* 继承的注意事项: A:子类只能继承父类所有非私有的成员(成员方法和成员变量) B:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法。 C:不要为了部分功能而去继承 class A { public void show1(){} public void show2(){} } class B { public void show2(){} public void show3(){} } //我们发现B类中出现了和A类一样的show2()方法,所以,我们就用继承来体现 class B extends A { public void show3(){} } 这样其实不好,因为这样你不但有了show2(),还多了show1()。 有可能show1()不是你想要的。 那么,我们什么时候考虑使用继承呢? 继承其实体现的是一种关系:"子类is a父类的一种"。 Person Student Teacher 水果 苹果 香蕉 橘子 采用假设法。 如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。 */
/* 问题是: 我不仅仅要输出局部范围的num,还要输出本类成员范围的num。怎么办呢? 我还想要输出父类成员范围的num。怎么办呢? 如果有一个东西和this相似,但是可以直接访问父类的数据就好了。 恭喜你,这个关键字是存在的:super。 this和super的区别? 分别是什么呢? this代表本类对应的引用。 super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员) 怎么用呢? A:调用成员变量 this.成员变量 调用本类的成员变量 super.成员变量 调用父类的成员变量 B:调用构造方法 this(...) 调用本类的构造方法 super(...) 调用父类的构造方法 C:调用成员方法 this.成员方法 调用本类的成员方法 super.成员方法 调用父类的成员方法 */
/* 继承中构造方法的关系 A:子类中所有的构造方法默认都会访问父类中空参数的构造方法 B:为什么呢? 因为子类会继承父类中的数据,可能还会使用父类的数据。 所以,子类初始化之前,一定要先完成父类数据的初始化。 注意:子类每一个构造方法的第一条语句默认都是:super(); */ class Father { int age; public Father() { System.out.println("Father的无参构造方法"); } public Father(String name) { System.out.println("Father的带参构造方法"); } } class Son extends Father { public Son() { //super(); System.out.println("Son的无参构造方法"); } public Son(String name) { //super(); System.out.println("Son的带参构造方法"); } } class ExtendsDemo6 { public static void main(String[] args) { //创建对象 Son s = new Son(); System.out.println("------------"); Son s2 = new Son("林青霞"); } }
/* 看程序写结果: A:一个类的静态代码块,构造代码块,构造方法的执行流程 静态代码块 > 构造代码块 > 构造方法 B:静态的内容是随着类的加载而加载 静态代码块的内容会优先执行 C:子类初始化之前先会进行父类的初始化 结果是: 静态代码块Fu 静态代码块Zi 构造代码块Fu 构造方法Fu 构造代码块Zi 构造方法Zi */ class Fu { static { System.out.println("静态代码块Fu"); } { System.out.println("构造代码块Fu"); } public Fu() { System.out.println("构造方法Fu"); } } class Zi extends Fu { static { System.out.println("静态代码块Zi"); } { System.out.println("构造代码块Zi"); } public Zi() { System.out.println("构造方法Zi"); } } class ExtendsTest2 { public static void main(String[] args) { Zi z = new Zi(); } }
/* 看程序写结果: A:成员变量的问题 int x = 10; //成员变量是基本类型 Student s = new Student(); //成员变量是引用类型 B:一个类的初始化过程 成员变量的初始化 默认初始化 显示初始化 构造方法初始化 C:子父类的初始化(分层初始化) 先进行父类初始化,然后进行子类初始化。 结果: YXYZ 问题: 虽然子类中构造方法默认有一个super() 初始化的时候,不是按照那个顺序进行的。 而是按照分层初始化进行的。 它仅仅表示要先初始化父类数据,再初始化子类数据。 */ class X { Y b = new Y(); X() { System.out.print("X"); } } class Y { Y() { System.out.print("Y"); } } public class Z extends X { Y y = new Y(); Z() { //super System.out.print("Z"); } public static void main(String[] args) { new Z(); } }
1:方法重写和方法重载的区别?方法重载能改变返回值类型吗? 方法重写: 在子类中,出现和父类中一模一样的方法声明的现象。 方法重载: 同一个类中,出现的方法名相同,参数列表不同的现象。 方法重载能改变返回值类型,因为它和返回值类型无关。 Override:方法重写 Overload:方法重载 2:this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。 this:代表当前类的对象引用 super:代表父类存储空间的标识。(可以理解为父类的引用,通过这个东西可以访问父类的成员)
/* 学生案例和老师案例讲解 学生: 成员变量;姓名,年龄 构造方法:无参,带参 成员方法:getXxx()/setXxx() 老师: 成员变量;姓名,年龄 构造方法:无参,带参 成员方法:getXxx()/setXxx() 看上面两个类的成员,发现了很多相同的东西,所以我们就考虑抽取一个共性的类: 人: 成员变量;姓名,年龄 构造方法:无参,带参 成员方法:getXxx()/setXxx() 学生 继承 人 老师 继承 人 */ //定义人类 class Person { //姓名 private String name; //年龄 private int age; public Person() { } public Person(String name,int age) { //"林青霞",27 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 { public Student() {} public Student(String name,int age) { //"林青霞",27 //this.name = name; //this.age = age; super(name,age); } } //定义老师类 class Teacher extends Person { } class ExtendsTest4 { public static void main(String[] args) { //创建学生对象并测试 //方式1 Student s1 = new Student(); s1.setName("林青霞"); s1.setAge(27); System.out.println(s1.getName()+"---"+s1.getAge()); //方式2 Student s2 = new Student("林青霞",27); System.out.println(s2.getName()+"---"+s2.getAge()); //补齐老师类中的代码并进行测试。 } }