核心内容摘要
扬帆出海:中科恒一能源逐光而行,闪耀意大利国际能源展
复习回顾
1 如何定义类类的定义格式如下:修饰符 class 类名 { //
成员变量属性 //
成员方法 (行为) //
构造方法 初始化类的对象数据的 }例如:public class Student { //
成员变量 public String name ; public char sex ; // 男 女 public int age; }
2 如何通过类创建对象类名 对象名称 new 类名();例如:Student stu new Student();
3 封装
1.
1 封装的步骤
使用private关键字来修饰成员变量。
使用public修饰getter和setter方法。
1.
2 封装的步骤实现private修饰成员变量public class Student { private String name; private int age; }public修饰getter和setter方法public class Student { private String name; private int age; public void setName(String n) { name n; } public String getName() { return name; } public void setAge(int a) { if (a 0 a
{ age a; } else { System.out.println(年龄非法); } } public int getAge() { return age; } }
4 构造方法
1.
1 构造方法的作用在创建对象的时候给成员变量进行初始化。
初始化即赋值的意思。
1.
2 构造方法的格式修饰符 类名(形参列表) { // 构造体代码执行代码 }
1.
3 构造方法的应用首先定义一个学生类代码如下public class Student { //
成员变量 public String name; public int age; //
构造方法 public Student() { System.out.println(无参数构造方法被调用) } }接下来通过调用构造方法得到两个学生对象。
public class CreateStu02 { public static void main(String[] args) { // 创建一个学生对象 // 类名 变量名称 new 类名(); Student s1 new Student(); // 使用对象访问成员变量赋值 s
name 张三; s
age 20 ; // 使用对象访问成员变量 输出值 System.out.println(s
name); System.out.println(s
age); Student s2 new Student(); // 使用对象访问成员变量 赋值 s
name 李四; s
age 18 ; System.out.println(s
name); System.out.println(s
age); } }
5 this关键字的作用
1.
1 this关键字的作用this代表所在类的当前对象的引用地址值即代表当前对象。
1.
2 this关键字的应用
1.
5.
1 用于普通的gettter与setter方法this出现在实例方法中谁调用这个方法哪个对象调用这个方法this就代表谁this就代表哪个对象。
public class Student { private String name; private int age; public void setName(String name) { this.name name; } public String getName() { return name; } public void setAge(int age) { if (age 0 age
{ this.age age; } else { System.out.println(年龄非法); } } public int getAge() { return age; } }
1.
5.
2 用于构造方法中this出现在构造方法中代表构造方法正在初始化的那个对象。
public class Student { private String name; private int age; // 无参数构造方法 public Student() {} // 有参数构造方法 public Student(String name,int age) { this.name name; this.age age; } }
static关键字我们已经知道面向对象中存在类和对象的概念我们在类中定义了一些成员变量例如name,age,sex ,结果发现这些成员变量每个对象都存在因为每个对象都可以访问。
而像name ,age , sex确实是每个学生对象都应该有的属性应该属于每个对象。
所以Java中成员变量和方法等是存在所属性的Java是通过static关键字来区分的。
static关键字在Java开发非常的重要对于理解面向对象非常关键。
关于static关键字的使用它可以用来修饰的成员变量和成员方法被static修饰的成员是属于类的是放在静态区中没有static修饰的成员变量和方法则是属于对象的。
我们上面案例中的成员变量都是没有static修饰的所以属于每个对象。
2 定义格式和使用static是静态的意思。
static可以修饰成员变量或者修饰方法。
2.
1 静态变量及其访问有static修饰成员变量说明这个成员变量是属于类的这个成员变量称为类变量或者静态成员变量。
直接用 类名访问即可。
因为类只有一个所以静态成员变量在内存区域中也只存在一份。
所有的对象都可以共享这个变量。
如何使用呢例如现在我们需要定义传智全部的学生类那么这些学生类的对象的学校属性应该都是“传智”这个时候我们可以把这个属性定义成static修饰的静态成员变量。
定义格式修饰符 static 数据类型 变量名 初始值举例public class Student {public static String schoolName 传智播客// 属于类只有一份。
// ..... }静态成员变量的访问:格式类名.静态变量public static void main(String[] args){ System.out.println(Student.schoolName); // 传智播客Student.schoolName 黑马程序员; System.out.println(Student.schoolName); // 黑马程序员 }
2.
2 实例变量及其访问无static修饰的成员方法属于每个对象的这个成员方法也叫做实例方法。
需要注意的是实例方法是属于每个对象必须创建类的对象才可以访问。
格式对象.实例方法示例public class Student { // 实例变量 private String name ; //
方法行为 // 无 static修饰实例方法。
属于每个对象必须创建对象调用public void run(){ System.out.println(学生可以跑步); } // 无 static修饰实例方法 public void sleep(){ System.out.println(学生睡觉); } public static void study(){ } }public static void main(String[] args){ // 创建对象 Student stu new Student ; stu.name 徐干; // Student.sleep();// 报错必须用对象访问。
stu.sleep(); stu.run(); }
3 小结
当static修饰成员变量或者成员方法时该变量称为静态变量该方法称为静态方法。
该类的每个对象都共享同一个类的静态变量和静态方法。
任何对象都可以更改该静态变量的值或者访问静态方法。
但是不推荐这种方式去访问。
因为静态变量或者静态方法直接通过类名访问即可完全没有必要用对象去访问。
无static修饰的成员变量或者成员方法称为实例变量实例方法实例变量和实例方法必须创建类的对象然后通过对象来访问。
static修饰的成员属于类会存储在静态区是随着类的加载而加载的且只加载一次所以只有一份节省内存。
存储于一块固定的内存区域静态区所以可以直接被类名调用。
它优先于对象存在所以可以被所有对象共享。
无static修饰的成员是属于对象对象有多少个他们就会出现多少份。
所以必须由对象调用。
继承
3.
3 继承的好处提高代码的复用性减少代码冗余相同代码重复利用。
使类与类之间产生了关系。
2 继承的格式通过extends关键字可以声明一个子类继承另外一个父类定义格式如下class 父类 {...}class 子类 extends 父类 {...}需要注意Java是单继承的一个类只能继承一个直接父类跟现实世界很像但是Java中的子类是更加强大的。
3.
2 案例图解分析老师类学生类还有班主任类实际上都是属于人类的我们可以定义一个人类把他们相同的属性和行为都定义在人类中然后继承人类即可子类特有的属性和行为就定义在子类中了。
4 子类不能继承的内容
3.
1 引入并不是父类的所有内容都可以给子类继承的子类不能继承父类的构造方法。
值得注意的是子类可以继承父类的私有成员成员变量方法只是子类无法直接访问而已可以通过getter/setter方法访问父类的private成员变量。
3.
2 成员变量重名如果子类父类中出现重名的成员变量这时的访问是有影响的子父类中出现了同名的成员变量时子类会优先访问自己对象中的成员变量。
如果此时想访问父类成员变量如何解决呢我们可以使用super关键字。
3.
3 super访问父类成员变量子父类中出现了同名的成员变量时在子类中需要访问父类中非私有成员变量时需要使用super关键字修饰父类成员变量类似于之前学过的this。
需要注意的是super代表的是父类对象的引用this代表的是当前对象的引用。
无this无super就近原则 this会跳出当前局部变量优先找当前引用的对象 找不到再找爹 super直接找爹. 关键关键词的区别直接写变量名严格遵循「局部→子类→父类」优先级this.变量名强制限定在「类的成员变量」范围内跳过方法局部变量查找顺序子类成员变量 → 父类成员变量super.变量名强制直接找父类的成员变量无视子类和局部变量。
3.
2 成员方法重名如果子类父类中出现重名的成员方法则创建子类对象调用该方法的时候子类对象会优先调用自己的方法。
7 方法重写
3.
1 概念方法重写子类中出现与父类一模一样的方法时返回值类型方法名和参数列表都相同会出现覆盖效果也称为重写或者复写。
声明不变重新实现。
3.
2 使用场景与案例发生在子父类之间的关系。
子类继承了父类的方法但是子类觉得父类的这方法不足以满足自己的需求子类重新写了一个与父类同名的方法以便覆盖父类的该方 法。
例如我们定义了一个动物类代码如下public class Animal { public void run(){ System.out.println(动物跑的很快); } public void cry(){ System.out.println(动物都可以叫~~~); } }然后定义一个猫类猫可能认为父类cry()方法不能满足自己的需求代码如下public class Cat extends Animal { public void cry(){ System.out.println(我们一起学猫叫喵喵喵喵的非常好听); } } public class Test { public static void main(String[] args) { // 创建子类对象 Cat ddm new Cat() // 调用父类继承而来的方法 ddm.run(); // 调用子类重写的方法 ddm.cry(); } }
3.
2 Override重写注解Override:注解重写注解校验这个注解标记的方法就说明这个方法必须是重写父类的方法否则编译阶段报错。
建议重写都加上这个注解一方面可以提高代码的可读性一方面可以防止重写出错加上后的子类代码形式如下public class Cat extends Animal { // 声明不变重新实现 // 方法名称与父类全部一样只是方法体中的功能重写写了 Override public void cry(){ System.out.println(我们一起学猫叫喵喵喵喵的非常好听); } }
3.
3
注意事项方法重写是发生在子父类之间的关系。
子类方法覆盖父类方法必须要保证权限大于等于父类权限。
子类方法覆盖父类方法返回值类型、函数名和参数列表都要一模一样。
子类构造中super()调用父类无参可以手动写必须放第一行不写则编译器自动在第一行插入super()子类有参构造可选择不调用父类有参但必须调用父类的某个构造无参 / 有参二选一不写就默认调无参这也是 “新建子类对象能使用父类成员” 的核心原理 —— 父类构造先执行完成父类成员的初始化。
补充关键细节强化理解
为什么super()必须放第一行Java 的设计逻辑是父类成员必须先初始化子类才能基于父类的基础构建自己。
比如父类有name成员变量在父类无参构造中初始化name 父类默认名如果子类构造先执行自己的逻辑再调用父类构造就会导致子类使用this.name时父类成员还没初始化出现逻辑错误。
“子类对象能使用父类元素” 的底层原理结合代码对于c调用show方法里的 this.name:简单来说this.name对c对象而言确实是访问c 对象自己的name属性只不过如果c对象子类自己没有定义name就会顺着继承关系 “找它的父亲”父类的name—— 本质是c对象本身就包含了父类的成员而不是 “去找另一个父类对象”。
3.
2 super和this的用法格式super和this完整的用法如下其中thissuper访问成员我们已经接触过了。
this.成员变量 -- 本类的 super.成员变量 -- 父类的 this.成员方法名() -- 本类的 super.成员方法名() -- 父类的接下来我们使用调用构造方法格式super(...) -- 调用父类的构造方法根据参数匹配确认 this(...) -- 调用本类的其他构造方法根据参数匹配确认
3.
3 super(....)用法演示写了this本质上等于调用了下面的有参构造 而下面的有参构造在第一行有自动插入的super(),因此不再需要额外写super()注意一子类的每个构造方法中均有默认的super()调用父类的空参构造。
手动调用父类构造会覆盖默认的super()。
super() 和 this() 都必须是在构造方法的第一行所以不能同时出现。
super(..)是根据参数去确定调用父类哪个构造方法的。
注意二: 构造方法并不能被 “继承”super()或this()只是调用构造方法而非继承构造方法构造方法没有继承的概念子类不会继承父类的任何构造方法Java 语法规定 “构造方法属于当前类不能被子类继承”super()子类构造方法中调用父类的构造方法目的是完成父类成员的初始化this()在同一个类的构造方法中调用本类的其他构造方法目的是复用构造逻辑。
3.
5 this(...)用法演示this(...)默认是去找本类中的其他构造方法根据参数来确定具体调用哪一个构造方法。
为了借用其他构造方法的功能。
重点 ! ! !