day01【复习回顾、继承、抽象类模板设计模式】
今日内容
- 面向对象复习
- 类的创建------>必须掌握
- 对象的创建和使用------>必须掌握
- 匿名对象
- 继承
- 如何继承—继承的格式------>必须掌握
- 继承之后成员的访问特点------>必须掌握
- 方法重写以及this和super关键字------>理解并会使用
- 抽象类
- 定义抽象类------>必须掌握
- 抽象方法的定义和使用------>必须掌握
- 模板设计模式------>必须掌握
- final 关键字
- 修饰类格式和特点
- 修饰方法格式和特点
- 修饰变量格式和特点------>必须掌握
第1章 复习回顾
1.1 类和对象
定义一个类
-
格式:
修饰符 class 类名{ // 成员变量 // 成员方法 // 构造方法 // 代码块 // 内部类 }
-
代码:
public class Person { // 成员变量 private String name; private int age; // 构造方法 public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } // 成员方法 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; } public void show(){ System.out.println(name+","+age); } }
创建并使用对象
-
格式:
创建对象: 类名 对象名 = new 类名(实参); 使用对象: 访问成员变量: 对象名.成员变量名 访问成员方法: 无返回值的方法: 对象名.方法名(实参); 有返回值的方法: 直接调用: 对象名.方法名(实参); 赋值调用: 数据类型 变量名 = 对象名.方法名(实参); 输出调用: System.out.println(对象名.方法名(实参));
-
代码:
public class Test { public static void main(String[] args) { // 通过调用空参构造方法,创建Person类的对象 Person p1 = new Person(); // 通过调用满参构造方法,创建Person类的对象 Person p2 = new Person("李四", 19); // 使用p1对象调用方法 p1.setName("张三"); p1.setAge(18); String name = p1.getName(); System.out.println("姓名:" + name); System.out.println("年龄:" + p1.getAge()); // 使用p2调用show方法 p2.show(); } }
1.2 对象的内存图
画图依据
- 只要是new对象就会在堆区开辟一块独立的空间
- 只要调用方法,方法就会被加载进栈
- 只要方法执行完毕,方法就会被弹栈
- 方法执行的流程: 调用方法-->加载方法到栈区-->声明形参-->把实参传递给形参--->执行方法体-->结束方法,弹栈
内存图
1.3 匿名对象
概述
- 概述:匿名对象指的就是没有名字的对象.
- 特点: 只能使用一次
使用
import com.itheima.demo1_复习类的定义和对象的使用.Person;
public class Test {
public static void main(String[] args) {
/*
- 概述:匿名对象指的就是没有名字的对象.
- 特点: 只能使用一次
- 使用: 如果某个类的对象只要使用一次,就可以使用匿名对象
*/
// 创建Person对象---有名字
Person p1 = new Person("张三",18);
p1.show();
System.out.println("-------------------");
// 匿名对象
new Person("李四",19).show();
new Person("李四",19).show();
// 这是2个不同的对象,只是所有属性值一样,因为只要new就会在堆区开辟一块空间创建该对象
System.out.println("-------------------");
// 调用method方法
//以前的方式---使用有名字的对象
//Person p2 = new Person("老王",20);
//method(p2);
//现在的方式----使用匿名对象
method(new Person("老王",20));
}
public static void method(Person p){
p.show();
}
}
第2章 继承
2.1 继承概述
为什么要有继承
-
生活中为什么要有继承
-
程序中为什么还要有继承
继承的概述
- 继承在java中指的是“一个类”可以“继承自”“另一个类”。 "被继承的类"叫做: 父类/超类/基类,"继承其他类的类"叫做:子类。继承后,“子类”中就“拥有”了“父类”中所有的成员(成员变量、成员方法)。 “子类就不需要再定义了”。
继承的好处
- 提高代码的复用性;
- 使类与类之间产生了关系,作为多态的前提条件
2.2 继承的格式
继承的格式
修饰符 class 子类名 extends 父类名{
}
继承的演示
-
父类
public class Person { // 成员变量 private String name; private int age; // 构造方法 public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } // 成员方法 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; } public void show(){ System.out.println(name+","+age); } }
-
子类
public class Student extends Person { }
-
测试类
public class Test { public static void main(String[] args) { // 创建Student对象 Student stu = new Student(); // 调用set\get方法以及show方法 stu.setName("张三"); stu.setAge(18); System.out.println(stu.getName()+","+stu.getAge()); stu.show(); } }
2.3 扩展一个文件定义多个类
class Person{
String name;
}
class Student extends Person{
}
public class Test {
public static void main(String[] args) {
/*
1.一个文件中是可以定义多个类的
2.注意:
2.1 一个文件中定义多个类,只能有一个public修饰的类
2.2 使用public修饰的类的类名必须和文件名一致
2.3 工作中,都是一个类对应一个文件,不要一个文件中定义多个类,现在只是过渡一下
*/
Student stu = new Student();
stu.name = "zs";
System.out.println(stu.name);// zs
}
}
2.4 继承后成员访问规则
继承后构造方法的访问规则
-
子类无法继承父类的构造方法
class Person{ String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } } class Student extends Person{ } public class Test { public static void main(String[] args) { // 子类是无法继承父类的构造方法 // 创建Student对象 //Student stu = new Student("张三",18);// 编译报错 } }
继承后私有成员的访问规则
-
子类可以继承父类的私有成员,但无法直接访问,可以间接访问
-
私有成员变量: 通过set\get方法间接访问
-
私有成员方法: 通过其他公共的方法间接访问
class Person{
private String name;private void method(){ System.out.println("Person method方法..."); } public String getName() { return name; } public void setName(String name) { this.name = name; } public void show(){ method(); }
}
class Student extends Person{
}
public class Test {
public static void main(String[] args) {
/*
子类可以继承父类的私有成员,但无法直接访问,可以间接访问
- 私有成员变量: 通过set\get方法间接访问
- 私有成员方法: 通过其他公共的方法间接访问
*/
// 创建Student对象
Student stu = new Student();
//System.out.println(stu.name);// 编译报错
//stu.method();// 编译报错// 给从父类继承过来的name属性赋值和取值 stu.setName("张三"); System.out.println("name:"+stu.getName()); // 调用从父类继承过来的method方法---可以调用公共的show方法 stu.show();// Person method方法... }
}
-
继承后非私有成员的访问规则
-
子类可以继承父类的非私有成员,并且可以直接访问
-
访问规则: 优先在子类中查找,如果在子类中找到了就直接使用子类的,如果没有找到就去父类中查找…
class Person{ String name = "张三"; public void method(){ System.out.println("Person method..."); } } class Student extends Person{ String name = "李四"; public void method(){ System.out.println("Student method..."); } } public class Test { public static void main(String[] args) { /* - 子类可以继承父类的非私有成员,并且可以直接访问 - 访问规则: 优先在子类中查找,如果在子类中找到了就直接使用子类的,如果没有找到就去父类中查找... */ // 创建Student对象 Student stu = new Student(); // 访问从父类继承过来的非私有成员变量 System.out.println(stu.name);// 李四 // 访问从父类继承过来的非私有成员方法 stu.method();// Student method... } }
2.5 方法重写
方法重写的概念
-
概念:子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),该方法就是重写的方法。
-
代码:
class Person{ public void method(){ System.out.println("Person method..."); } } class Student extends Person{ // 重写的方法 @Override public void method(){ System.out.println("Student method..."); } public void show(){ System.out.println("Student show..."); } } public class Test { public static void main(String[] args) { /* 概念:子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),该方法就是重写的方法。 特点: 1.重写的方法可以使用@Override注解进行标识 2.子类继承父类的成员方法,如果子类有不同的实现,子类就可以重写从父类继承过来的方法 3.子类重写父类方法的访问权限,不能低于父类方法的访问权限 访问权限修饰符的大小: public > protected > 空的(默认) > private */ } }
重写的注意事项
- 方法重写是发生在父子类之间的关系。
- 子类方法重写父类方法,返回值类型、方法名和参数列表都要一模一样。
- 使用场景:父类的方法,子类有不同的实现,那么子类就需要重写父类的该方法
- 子类方法重写父类方法,必须要保证权限大于等于父类权限。
访问权限从大到小: public > protected > (默认) > private - 使用@Override注解,检验是否重写成功,重写注解校验!
- 建议重写方法都加上这个注解,一方面可以提高代码的可读性,一方面可以防止重写出错!
2.6 this和super关键字
this关键字的三种用法
-
介绍:this可以访问本类的成员属性、成员方法、构造方法;
-
this访问本类成员变量: this.成员变量
class Fu { int num = 10; public void method(){ int num = 20; System.out.println("访问局部变量num:"+num);// 20 System.out.println("访问成员变量num:"+this.num);// 10 } } public class Test { public static void main(String[] args) { // this修饰本类成员变量: this.成员变量名 // 作用: 用了区别同名的成员变量和局部变量 // 创建Fu类对象,调用method方法 Fu f = new Fu(); f.method(); //new Fu().method(); } }
-
this访问本类成员方法: this.成员方法名(实参);
class Fu { public void method1(){ System.out.println("Fu method1..."); } public void method2(){ System.out.println("Fu method2..."); } public void show(){ // 调用Fu类中method1,method2方法 this.method1(); this.method2(); } } public class Test { public static void main(String[] args) { // this访问本类的成员方法: this.方法名(实参); Fu f = new Fu(); f.show(); } }
-
this访问本类构造方法: 在本类的一个构造方法中,调用本类另一个构造方法
- 空参构造:
this();
- 有参构造:
this(实参);
- 注意:
- 1.调用本类的构造方法需要在本类的一个构造方法中
- 2.调用本类的构造方法的代码必须放在构造方法的第一行
- 3.调用本类的构造方法不能2个构造方法之间相互调用
class Fu{ String name; int age; public Fu() { System.out.println("Fu 空参构造..."); } public Fu(String name) { this.name = name; } public Fu(int age) { this.age = age; } public Fu(String name, int age) { // 访问本类的空参构造 //this(); // 访问本类的有参构造 this(name); //this.name = name; this.age = age; } } public class Test { public static void main(String[] args) { /* this访问本类构造方法: **在本类的一个构造方法中,调用本类另一个构造方法** - 空参构造: `this();` - 有参构造: `this(实参);` - 注意: - 1.调用本类的构造方法需要在本类的一个构造方法中 - 2.调用本类的构造方法的代码必须放在构造方法的第一行 - 3.调用本类的构造方法不能2个构造方法之间相互调用 */ Fu f = new Fu("张三", 18); System.out.println(f.name+","+f.age); } }
- 空参构造:
super关键字的三种用法
-
介绍:super可以访问父类的成员属性、成员方法、构造方法;
-
super访问父类的成员变量: super.父类成员变量名
class Fu { int num = 10; } class Zi extends Fu { int num = 20; public void show() { int num = 30; System.out.println("笨类中局部变量num的值:" + num); System.out.println("本类中成员变量num的值:" + this.num); System.out.println("父类中成员变量num的值:" + super.num); } } public class Test { public static void main(String[] args) { // super访问父类的成员变量: super.父类成员变量名 // 创建Zi类对象 Zi zi = new Zi(); zi.show(); } }
-
super访问父类的成员方法: super.成员方法名(实参);
class Fu { public void method(){ System.out.println("Person HelloWorld..."); } } class Zi extends Fu { @Override public void method() { // 访问父类的method方法 super.method(); System.out.println("Student HelloWorld..."); } public void show(){ // 访问本类的method方法 this.method(); // 访问父类的method方法 super.method(); } } public class Test { public static void main(String[] args) { // super访问父类的成员方法: super.成员方法名(实参); // 创建Zi类对象 Zi zi = new Zi(); zi.method(); System.out.println("------"); zi.show(); } }
-
super访问父类的构造方法: super(实参)
class Fu{ private String name; private int age; public Fu() { System.out.println("Fu 空参构造..."); } public Fu(String name, int age) { this.name = name; this.age = age; System.out.println("Fu 有参构造..."); } } class Zi extends Fu{ public Zi() { super(); } public Zi(String name,int age){ // 调用父类的有参构造方法 super(name,age); } } public class Test { public static void main(String[] args) { /* super访问父类构造方法: **在子类的一个构造方法中,调用父类的构造方法** - 空参构造: `super();` - 有参构造: `super(实参);` - 注意: - 1.调用父类的构造方法需要在子类的一个构造方法中 - 2.调用父类的构造方法的代码必须放在子类构造方法的第一行 */ // 通过空参构造方法创建Zi类对象 //Zi zi1 = new Zi(); // 通过有参构造方法创建Zi类对象 //Zi zi2 = new Zi("张三",18); } }
2.7 super的注意事项
super的注意事项一
-
super访问成员变量和成员方法: 优先去父类中找,如果有就直接使用,如果没有就去爷爷类中找,如果有,就用,依次类推…
class Ye /*extends Object*/{ // Object类是根类 int num = 10; public void method(){ System.out.println("Ye method..."); } } class Fu extends Ye{ /*int num = 20; public void method(){ System.out.println("Fu method..."); }*/ } class Zi extends Fu{ public void show(){ System.out.println(super.num); super.method(); } } public class Test1 { public static void main(String[] args) { /* #### super的注意事项一 - super访问成员变量和成员方法: 优先去父类中找,如果有就直接使用,如果没有就去爷爷类中找,如果有,就用,依次类推... */ // 创建Zi类对象 Zi zi = new Zi(); // 使用zi类对象访问num成员方法 System.out.println(zi.num); // 使用zi类对象访问method成员方法 zi.method(); System.out.println("---------------"); // 使用zi类对象访问show成员方法 zi.show(); } }
super的注意事项二
-
子类的构造方法默认会调用父类的空参构造方法,如果父类中没有空参构造方法,只定义了有参构造方法,会编译报错
class Fu{ public Fu() { System.out.println("Fu 空参构造..."); } public Fu(String name,int age) { System.out.println("Fu 有参构造..."); } } class Zi extends Fu{ public Zi() { //super();// 不写,默认也有 } public Zi(String name){ //super();// 不写,默认也有 } } public class Test { public static void main(String[] args) { /* #### super的注意事项二 - 子类的构造方法默认会调用父类的空参构造方法 - 如果父类中没有空参构造方法,只定义了有参构造方法,子类中会编译报错 */ // 通过zi类空参构造方法创建对象 Zi zi1 = new Zi(); // 通过zi类有参构造方法创建对象 Zi zi2 = new Zi("itheima"); } }
2.8 继承体系对象的内存图
书写继承案例
class Fu{
int num = 10;
public void method(){
System.out.println("Fu method...");
}
}
class Zi extends Fu{
int num = 20;
@Override
public void method() {
System.out.println("Zi method...");
}
public void show(){
int num = 30;
System.out.println("局部变量num的值:"+num);
System.out.println("本类成员变量num的值:"+this.num);
System.out.println("父类成员变量num的值:"+super.num);
// 调用本类的成员方法
this.method();
// 调用父类的成员方法
super.method();
}
}
public class Test {
public static void main(String[] args) {
// 创建Zi类对象
Zi zi = new Zi();
// 调用show方法
zi.show();
}
}
根据案例绘制内存图
2.9 继承的特点
- Java只支持单继承,不支持多继承。
public class A{}
public class B{}
public class C extends A extends B{} // 都是错误的
public class C extends A , B{} // 都是错误的
- 一个类只能有一个父类,但可以有多个子类。
public class A{}
public class B extends A{}
public class C extends A{}
- 可以多层继承。
public class A{}
public class B extends A{}
public class C extends B{}
补充: Java中顶层父类是Object类。所有的类默认继承Object,作为父类。
class A {} 默认继承Object类 直接继承Object
class B extends A{} B的父类就是A,但是A的父类是Object类 间接继承Object类
第3章 抽象类
3.1 抽象类的概述和定义
抽象类的概述
- 概述: 使用abstract修饰的类就是抽象类
- 特点:
- 抽象类不能创建对象
- 抽象类中可以写抽象方法
抽象类的定义
-
格式:
修饰符 abstract class 类名{ // 成员变量 // 成员方法 // 构造方法 // 代码块 // 内部类 // 抽象方法 }
案例
public abstract class Animal {
// 成员变量
private String name;
// 构造方法
public Animal(String name) {
this.name = name;
}
public Animal() {
}
// 成员方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void show() {
System.out.println("name:" + name);
}
// 抽象方法
// 代码块
// 内部类
}
3.2 抽象方法的概述和定义
抽象方法的概述
- 概述: 没有方法体,并且使用abstract修饰的方法就是抽象方法
抽象方法的定义
-
格式:
修饰符 abstract 返回值类型 方法名(形参列表);
-
案例:
public abstract void method();
3.3 抽象类的注意事项
-
抽象类不能被创建对象,只能用来做“父类”,被子类继承的,体现的是模板思想 。
abstract class Animal{ } public class Test { public static void main(String[] args) { // 抽象类不能被创建对象,只能用来做“父类”,被子类继承的,体现的是模板思想 。 //Animal anl = new Animal();// 编译报错 } }
-
抽象类不能被创建对象,但可以有“构造方法”——目的:给子类初始化从父类继承过来的属性。
abstract 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 int getAge() { return age; } } class Dog extends Animal{ public Dog(){ } public Dog(String name,int age){ super(name,age); } } public class Test { public static void main(String[] args) { // 抽象类不能被创建对象,但可以有“构造方法”——目的:给子类初始化从父类继承过来的属性。 // 说白了就是抽象父类中的构造方法就是供子类构造方法来调用的 // 需求: 创建Dog类对象,并初始化从Animal类中继承过来的成员变量 Dog dog = new Dog("旺财",2); System.out.println(dog.getName()); System.out.println(dog.getAge()); } }
-
抽象类中可以没有抽象方法,但抽象方法必须定义在抽象类中
// 抽象类 abstract class Animal{ // 抽象类中可以没有抽象方法 } abstract class Person{ // 但抽象方法必须定义在抽象类中 public abstract void method(); } public class Test { public static void main(String[] args) { // 抽象类中可以没有抽象方法,但抽象方法必须定义在抽象类中 } }
-
子类继承抽象类后,必须重写抽象类中所有的抽象方法,否则子类必须也是一个抽象类
abstract class Animal{ public abstract void eat(); public abstract void drink(); } // 抽象类的子类是抽象类,可以不用重新抽象类中的抽象方法 abstract class Cat extends Animal{ } // 抽象类的子类是普通类,那就必须重写抽象类中所有的抽象方法 class Dog extends Animal{ @Override public void eat() { } @Override public void drink() { } } public class Test { public static void main(String[] args) { // 子类继承抽象类后,必须重写抽象类中所有的抽象方法,否则子类必须也是一个抽象类 } }
3.4 模板设计模式
-
设计模式: 设计模式就是解决一些问题时的固定思路,也就是代码设计思路经验的总结。
-
模板思想:
-
模板是通用的东西,抽象类体现的是模板思想。
-
抽象类中可以是具体实现的方法(通用模板),也可以有抽象方法(填充模板)。
-
模板中能决定的行为就定义成有方法体的方法,让需要使用模板的类(子类)直接继承调用即可。
-
模板中不能决定的行为定义成抽象方法,让需要使用模板的类(子类)负责重写抽象方法实现。
-
-
案例:
-
需求:按照下述要求,使用代码实现
定义新、老司机类,新、老司机类都有开车功能,开车的步骤一样,但驾驶时的姿势不同
新司机:开门,点火,双手紧握方向盘,刹车,熄火
老司机:开门,点火,右手握方向盘左手抽烟,刹车,熄火
-
代码:
// 抽象父类 public abstract class Driver { // 通用模板(有方法体的方法) public void drive(){ System.out.println("开门"); System.out.println("点火"); // 姿势 ziShi(); System.out.println("刹车"); System.out.println("熄火"); } // 填充模板(没有方法体的方法) public abstract void ziShi(); } public class NewDriver extends Driver { @Override public void ziShi() { System.out.println("双手紧握方向盘"); } } public class OldDriver extends Driver { @Override public void ziShi() { System.out.println("右手握方向盘左手抽烟"); } } package com.itheima.demo12_模板设计模式; public class Test { public static void main(String[] args) { // 创建新司机对象,调用开车的方法 new NewDriver().drive(); // 创建老司机对象,调用开车的方法 new OldDriver().drive(); } }
-
第4章 final关键字
4.1 final关键字的概述和使用
final关键字的概述
- 概述: final是一个关键字,表示最终,不可变的意思,可以用来修饰类,修饰方法,修饰变量
- 特点:
- 被final修饰的类不能被继承
- 被final修饰的方法不能被重写
- 被final修饰的变量不能重复赋值,只能赋值一次
final关键字的使用
修饰类
-
格式:
修饰符 final class 类名{ }
-
案例:
final class Fu{ } class Zi /*extends Fu*/{ // 编译报错,被final修饰的类不能被继承 } public class Test { public static void main(String[] args) { } }
修饰方法
-
格式:
修饰符 final 返回值类型 方法名(形成列表){ 方法体 }
-
特点: 被final修饰的方法不能被重写
-
案例:
class Fu{ public final void method(){ System.out.println("Fu method..."); } } class Zi extends Fu{ // 编译报错,因为被final修饰的方法不能被重写 /*@Override public void method(){ System.out.println("Zi method..."); }*/ } public class Test { public static void main(String[] args) { } }
修饰变量
-
格式:
- 方式一:
final 数据类型 变量名 = 值;
- 方式二:
final 数据类型 变量名; 变量名 = 值;
- 方式一:
-
特点:
- 被final修饰的变量不能重复赋值,只能赋值一次
- 被final修饰的变量其实也叫作常量,常量命名规范是所有字母大写
-
final修饰局部变量案例:
public class Test1_局部变量 { public static void main(String[] args) { // 定义一个NUM局部变量并赋值 final int NUM = 10; // 重新给num赋值 // NUM = 20;// 编译报错,被final修饰的变量不能重复赋值,只能赋值一次 // 打印输出 System.out.println(NUM);// 10 System.out.println("-----------------"); final int A; A = 20; //A = 30;// 编译报错,被final修饰的变量不能重复赋值,只能赋值一次 System.out.println(A);// 20 } }
-
final修饰成员变量案例:
方式一: class Person{ // final 数据类型 变量名 = 值; final int AGE = 10; } 方式二: class Animal{ final int age; public Animal(int age) { this.age = age; } public Animal() { age = 20; } // 只要保证age成员变量出现的时候有值 } public class Test2_成员变量 { public static void main(String[] args) { /* 成员变量和局部变量的区别: 1.成员变量定义在类中方法外,局部变量定义在方法中或者方法声明之上(参数) 2.成员变量是在堆区,局部变量是在栈区 3.成员变量是随着对象的创建而存在,随着对象的销毁而销毁; 局部变量是随着方法的调用而存在,随着方法的弹栈而销毁 4.成员变量有默认值,而局部变量没有默认值 */ Animal anl = new Animal(20); //anl.age = 100;// 编译报错,因为被final修饰的变量不能重复赋值,只能赋值一次 System.out.println(anl.age); } }
总结
必须练习:
1.定义类,创建对象,使用对象----->必须掌握
2.继承的格式,继承后成员访问规则--->必须掌握
3.this和super关键字的三种用法--->必须掌握
4.方法重写--->必须掌握
5.抽象类的定义以及使用--->必须掌握
6.抽象方法的定义以及使用--->必须掌握
7.fianl关键字修饰类,方法,变量--->必须掌握
- 能够写出类的继承格式
修饰符 class 子类名 extends 父类名{}
- 能够说出继承的特点
1.子类继承父类后,就可以拥有父类所有的成员变量和成员方法
2.子类继承父类后,可以直接访问从父类继承过来的非私有成员
3.只能单继承,不能多继承,但可以多层继承
4.不要为了继承而继承,必须满足is a的关系才去继承
- 能够说出子类调用父类的成员特点
子类继承父类后,可以直接访问从父类继承过来的非私有成员
子类继承父类后,不可以直接访问从父类继承过来的私有成员,需要间接访问
- 够说出方法重写的概念
概念: 子类中出现和父类一模一样的方法(返回值类型,方法名,参数列表),该方法就是重写的方法
特点:
1.子类重写的方法的权限不能低于父类方法的权限
public > protected > 默认 > private
2.重写的方法可以使用@Override注解进行标识,可以起到提高代码可读性以及校验重写是否正确的作用
- 能够说出this可以解决的问题
this可以访问本类的成员变量: this.成员变量名
this可以访问本类的成员方法: this.成员方法名(实参);
this可以访问本类的构造方法: this(实参);
- 能够说出super可以解决的问题
super可以访问父类的成员变量: super.成员变量名
super可以访问父类的成员方法: super.成员方法名(实参);
super可以访问父类的构造方法: super(实参);
- 描述抽象方法的概念
概念: 没有方法体,并且使用abstract修饰的方法
- 写出抽象类的格式
概述:使用abstract修饰的类就是抽象类
格式:修饰符 abstract class 类名{}
特点:
1.抽象类的子类可以是普通类,也可以是抽象类
2.抽象类的子类是普通类,必须重写抽象类中所有的抽象方法,否则抽象类的子类必须也是抽象类
3.有抽象方法的类一定是抽象类,但抽象类中不一定有抽象方法
- 写出抽象方法的格式
格式: 修饰符 abstract 返回值类型 方法名(实参);
- 能够说出父类抽象方法的存在意义
强制要求子类重写
- 描述final修饰的类的特点
不能被继承
- 描述final修饰的方法的特点
不能被重写
- 描述final修饰的变量的特点
只能赋值一次,不能重复赋值