👨💻博客主页:i新木优子👀
🏆Java基础系列教程:传送门💦
🧚♂️寄语:种一棵树最好的时间是十年前,其次是现在👣
🎉欢迎关注🔍点赞👍收藏⭐留言📝
🙏作者水平有限,发现错误欢迎留言轰炸
文章目录
继承
1. 继承的概述
继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。
继承的格式:
- 格式:public class 子类名 extends 父类名 {}
- 示例:public class Zi extends Fu {}
- Fu:是父类,也被称为基类,超类
- Zi:是子类,也被称为派生类
继承中子类的特点:
- 子类可以有父类的内容
- 子类还可以有自己特有的内容
package com.company;
public class Fu {
public void show() {
System.out.println("show方法被调用");
}
}
package com.company;
public class Zi extends Fu {
public void method() {
System.out.println("method方法被调用");
}
}
package com.company;
public class Demo {
public static void main(String[] args) {
//创建方法,调用对象
Fu f = new Fu();
f.show();
Zi z = new Zi();
z.method();
z.show();
}
}
2. 继承的好处和弊端
继承的好处:
- 提高的代码的
复用性
(多个类相同的成员可以放到同一个类中) - 提高的代码的
维护性
(如果方法的代码需要修改,修改一处即可)
继承的弊端:
- 继承让子类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
什么时候使用继承:
-
继承体现的关系:is a
-
假设法:现在有两个类A和B,如果他们满足A是B的一种,或B是A的一种,就说明他们存在继承关系,这个时候,就可以考虑使用继承来体现,否则就不能滥用继承
-
举例:🍎苹果和水果、🐱猫和动物、可以使用继承,🐱猫和🐕狗、不可以使用继承
3. 继承中变量的访问特点
在子类中访问一个变量:
- 子类局部范围找
- 子类成员范围找
- 父类成员范围找
- 如果都没有就报错(不考虑父亲的父亲…)
package com.company1;
public class Fu {
//年龄
public int age = 40;
}
package com.company1;
public class Zi extends Fu {
//身高
public int height = 185;
//年龄
public int age = 18;
public void show() {
int age = 30;
System.out.println(age);
System.out.println(height);
}
}
package com.company1;
public class Demo {
public static void main(String[] args) {
//创建对象,调用方法
Zi z = new Zi();
z.show();
}
}
4. super
super关键字的用法的this的用法相似
- this:代表本类对象的调用
- super:代表父类存储空间的标识(可以理解为父类对象的引用)
package com.company2;
public class Fu {
public int age = 40;
}
package com.company2;
public class Zi extends Fu {
public int age = 18;
public void show() {
int age = 30;
System.out.println(age);
//要访问本类中的成员变量age,怎么办?
System.out.println(this.age);
//要访问父类中的成员变量age,怎么办?
System.out.println(super.age);
}
}
package com.company2;
public class Demo {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
5. 继承中构造方法的访问特点
子类中所有的构造方法默认都会访问父类中的无参构造方法
why是
- 因为子类会继承父类中的数据,可能还会使用父类的数据,所以,子类初始化之前,一定要先完成父类数据的初始化
- 每一个子类构造方法的第一条语句默认都是:super()
如果父类中没有无参构造方法,只有带参构方法,怎么办?
- 通过使用super关键字去显示的调用父类的带参构造方法
- 在父类中自己提供一个无参构造方法
推荐:自己给出无参构造方法
package com.company3;
public class Fu {
/*
public Fu() {
System.out.println("Fu中的无参构造方法被调用");
}
*/
public Fu(){}
public Fu(int age) {
System.out.println("Fu中的带参构造方法被调用");
}
}
package com.company3;
public class Zi extends Fu {
public Zi() {
// super(20);
System.out.println("Zi中的无参构造方法被调用");
}
public Zi(int age) {
// super(20);
System.out.println("Zi中的带参构造方法被调用");
}
}
package com.company3;
public class Demo {
public static void main(String[] args) {
//创建对象
Zi z = new Zi();
Zi z2 = new Zi(18);
}
}
6. 继承中成员方法的访问特点
通过子类对象访问一个方法:
- 子类成员范围找
- 父类成员范围找
- 如果都没有就报错(不考虑父亲的父亲…)
package com.company4;
public class Fu {
public void show() {
System.out.println("Fu中的show()方法被调用");
}
}
package com.company4;
public class Zi extends Fu {
public void method() {
System.out.println("Zi类中method()方法被调用");
}
public void show() {
super.show();
System.out.println("Zi中的show()方法被调用");
}
}
package com.company4;
public class Demo {
public static void main(String[] args) {
//创建对象,调用方法
Zi z = new Zi();
z.method();
z.show();
}
}
7. 方法重写
方法重写的概述:
- 子类中出现了和父类中一模一样的方法声明
方法重写的应用:
- 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
@Override
- 是一个注解
- 可以帮助检查重写方法的方法声明的正确性
package com.company5;
/*
手机类
*/
public class Phone {
public void call(String name) {
System.out.println("给" + name + "打电话");
}
}
package com.company5;
/*
新手机
*/
public class NewPhone extends Phone {
/*
public void call(String name) {
System.out.println("开启视频");
// System.out.println("给" + name + "打电话");
super.call(name);
}
*/
@Override //可以帮助检查方法重写的正确性
public void call(String name) {
System.out.println("开启视频");
// System.out.println("给" + name + "打电话");
super.call(name);
}
}
package com.company5;
/*
测试类
*/
public class PhoneDemo {
public static void main(String[] args) {
//创建对象,调用方法
Phone p = new Phone();
p.call("小新");
System.out.println("----------");
NewPhone np = new NewPhone();
np.call("小新");
}
}
8. 方法重写的注意事项
- 私有方法不能被重写(父类私有成员子类是不能继承的)
- 子类方法访问权限不能比父类的低(public > 默认 > 私有)
package com.company6;
public class Fu {
private void show() {
System.out.println("Fu中show方法被调用");
}
/*
public void method() {
System.out.println("Fu中method方法被调用");
}
*/
void method() {
System.out.println("Fu中method方法被调用");
}
}
package com.company6;
public class Zi extends Fu {
/*
@Override
private void show() {
System.out.println("Zi中show方法被调用");
}
*/
/*
@Override
public void method() {
System.out.println("Zi中method方法被调用");
}
*/
@Override
public void method() {
System.out.println("Zi中method方法被调用");
}
}
9. Java中继承的注意事项
- Java中类只支持单继承,不支持多继承
- Java中类支持多层继承
package com.company7;
public class Granddad {
public void drink(){
System.out.println("喝酒");
}
}
package com.company7;
public class Father extends Granddad {
public void smoke(){
System.out.println("抽烟");
}
}
package com.company7;
public class Son extends Father {
}
10. 案例
-
👨🏫老师和学生👨🎓
需求:定义老师类和学生类,然后写代码测试,最后找到老师类和学生类的共性内容,抽取一个父类,用继承的方式改写代码,并进行测试
package com.company9; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { 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; } }
package com.company9; public class Teacher extends Person { public Teacher() { } public Teacher(String name, int age) { super(name, age); } public void teach() { System.out.println("教书"); } }
package com.company9; public class Student extends Person { public Student(String name, int age) { super(name, age); } public Student() { } public void study() { System.out.println("学习"); } }
package com.company9; public class PersonDemo { public static void main(String[] args) { //创建老师类对象 Teacher t1 = new Teacher(); t1.setName("小新"); t1.setAge(18); System.out.println(t1.getName() + "," + t1.getAge()); t1.teach(); Teacher t2 = new Teacher("小新", 18); System.out.println(t2.getName() + "," + t2.getAge()); t1.teach(); //创建学生类对象 Student s1 = new Student(); s1.setName("小白"); s1.setAge(19); System.out.println(s1.getName() + "," + s1.getAge()); s1.study(); Student s2 = new Student("小白", 19); System.out.println(s2.getName() + "," + s2.getAge()); s2.study(); } }
-
🐈猫和狗🐕
需求:请采用继承的思想实现猫和狗的案例,并在测试类中进行测试
package com.company10; public class Animal { private String name; private int age; public Animal() { } public Animal(String name, int age) { 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; } }
package com.company10; public class Cat extends Animal { public Cat() { } public Cat(String name, int age) { super(name, age); } public void catchMouse() { System.out.println("抓老鼠"); } }
package com.company10; public class Dog extends Animal { public Dog() { } public Dog(String name, int age) { super(name, age); } public void lookDoor() { System.out.println("看门"); } }
package com.company10; public class AnimalDemo { public static void main(String[] args) { //创建猫类对象 Cat c1 = new Cat(); c1.setName("加菲猫"); c1.setAge(5); System.out.println(c1.getName() + "," + c1.getAge()); c1.catchMouse(); Cat c2 = new Cat("加菲猫", 5); System.out.println(c2.getName() + "," + c2.getAge()); c2.catchMouse(); //创建够类对象 Dog d1 = new Dog(); d1.setName("哈士奇"); d1.setAge(5); System.out.println(d1.getName() + "," + d1.getAge()); d1.lookDoor(); Dog d2 = new Dog("哈士奇", 5); System.out.println(d2.getName() + "," + d2.getAge()); d2.lookDoor(); } }
修饰符
1. 修饰符的分类
-
权限修饰符
-
状态修饰符
-
final(最终态)
final关键字是最终的意思,可以修饰成员方法,成员变量,类
final修饰的特点:
- 修饰方法:表明该方法是最终方法,不能被重写
- 修饰变量:表明该变量是常量,不能再次被赋值
- 修饰类:表明该类是最终类,不能被继承
final修饰局部变量:
- 变量是基本类型:final修饰指的是基本类型的数据值不能发生改变
- 变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容是可以发生改变的
-
static(静态)
static关键字是静态的意思,可以修饰成员方法,成员变量
static修饰的特点:
-
被类的所有对象共享
这也是判断是否使用静态关键字的条件
-
可以通过类名调用
当然也可以通过对象名调用
推荐使用类名调用
举个🌰:Student.age = 18
static访问特点:
- 非静态的成员方法:
- 能访问静态的成员变量
- 能访问非静态的成员变量
- 能访问静态的成员方法
- 能访问非静态的成员方法
- 静态的成员方法:
- 能访问静态的成员变量
- 能访问静态的成员方法
总结:静态成员方法只能访问静态成员
-
-