目录
一、static关键字
static关键字的概述:
静态变量介绍与作用
静态变量举例:
静态方法
静态代码块
二、面向对象之多态
多态的概述:
多态的应用:
一、static关键字
-
static关键字的概述:
解析:1.在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量
2.常量称为静态常量,方法称为静态方法或类方法,它们统称为静态成员,归整个类所有。
3.静态成员不依赖于类的特定实例,被类的所有实例共享,就是说 static 修饰的方法或者变量不需要依赖于对象来进行访问,只要这个类被加载,Java 虚拟机就可以根据类名找到它们。
4.调用静态成员的语法格式:类名.静态成员
static关键字的概述:
解析:1.在类中,使用 static 修饰符修饰的属性(成员变量)称为静态变量,也可以称为类变量
2.常量称为静态常量,方法称为静态方法或类方法,它们统称为静态成员,归整个类所有。
3.静态成员不依赖于类的特定实例,被类的所有实例共享,就是说 static 修饰的方法或者变量不需要依赖于对象来进行访问,只要这个类被加载,Java 虚拟机就可以根据类名找到它们。
4.调用静态成员的语法格式:类名.静态成员
特别注意:1、static修饰的成员变量和方法,从属于类。2、普通变量和方法从属于对象。3、静态方法不能调用非静态成员,编译会报错。
-
静态变量介绍与作用
解析:类的成员变量可以分为以下两种:
1.静态变量(或称为类变量),指被static修饰的成员变量
2.实例变量,指没有被static修饰的成员变量
静态变量与实例变量的区别如下:
静态变量:
1.运行时,Java虚拟机只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配。
2.在类的内部,可以在任何方法内直接访问静态变量。
3.在其他类中,可以通过类名访问该类中的静态变量。
实例变量:
1.每创建一个实例,Java虚拟机就会为实例 变量分配一次内存。
2.在类的内部,可以在非静态方法中直接访问实例变量。
3.在本类的静态方法或者其他类中则需要通过类的实例对象进行访问。
静态变量在类中的作用如下:
1.静态变量可以被类的所有实例共享,因此静态变量可以作为实例之间的共享数据,增加实例之间的交互性。
2.如果类的所有实例都包含一个相同的常量属性,则可以把这个属性定义为静态常量类型,从而节省内存空间。例如在计算圆形的面积时,在类中定义一个圆周率常量PI。
静态变量举例:
代码如下:Student类
package com.feisi.week3.day1;
public class Student {
String name;
int age;
String gander;
static String teacher;// 被static所修饰成为静态成员变量
public Student() {
}
public Student(String name, int age, String gander, String teacher) {
this.name = name;
this.age = age;
this.gander = gander;
this.teacher = teacher;
}
public void show(){
System.out.println(name);
System.out.println(age);
System.out.println(gander);
System.out.println(teacher);
}
}
StudentTest类:
package com.feisi.week3.day1;
public class StudentTest {
public static void main(String[] args) {
Student student = new Student();
Student student1 = new Student();
// 测试
student.name = "小明";
student.age = 18;
student.gander = "男";
student.teacher = "老赵";
student1.name = "小红";
student1.age = 18;
student1.gander = "女";
student.show();
student1.show();
}
}
运行结果:因为 techaer被static所修饰,数据被所有实例共享所以第二次也输出“老赵”,不null”
注意:静态变量是被所有实例共享的,使用时应注意避免被覆盖问题
-
静态方法
解析:与成员变量类似,成员方法也可以分为以下两种:
1.静态方法(或称为类方法),指被static修饰的成员方法
2.实例方法,指没有被static修饰的成员方法
静态方法与实例方法的区别如下:1.静态方法不需要通过它所属 的类的任何实例就可以被调用,因此在静态方法中不能使用this关键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态方法。另外,和this关键一样,super关键字也与类的特定实例相关,所以在静态方法中也不能使用super关键字
2.在实例方法中可以直接访问所属类的静态变量、静态方法、实例变量和实例方法。
语法定义举例:
public static void show(){// 使用static修饰的方法
}
特别注意:在访问非静态方法时,需要通过实例对象来访问,而在访问静态方法时,可以直接访问,也可以通过类名来访问,还可以通过实例化对象来访问。 也就是说实例变量与实例方法只能通过实例对象才能被调用,在静态方法中想要访问所属类的实例变量与方法只能通过实例对象来调用。
-
静态代码块
解析:静态代码块指 Java 类中的 static{ } 代码块,主要用于初始化类,为类的静态变量赋初始值,提升程序性能。
静态代码块的特点如下:
1.静态代码块类似于一个方法,但它不可以存在于任何方法体中。
2.静态代码块可以置于类中的任何地方,类中可以有多个静态初始化块。
3.Java虚拟机在加载类时执行静态代码块,所以很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
4.如果类中包含多个静态代码块,则Java虚拟机将按它们在类中出现的顺序依次执行它们,每个静态代码块只会被执行一次。
5.静态代码块与静态方法一样,不能直接访问所属类的实例变量和实例方法,需要通过类的实例对象来访问。
语法定义举例:
static{
//代码块
}
特别注意:继承时的执行顺序:父类静态代码 >子类静态代码 >父类构造方法 >子类构造方法
二、面向对象之多态
-
多态的概述:
解析:
1、在java中多态可以体现在方法上比如方法的重载,同名方法可以有不同的执行结果。
2、多态也可以体现在面向对象中,一个对象可以使用多种类型进行表示。
3.Java实现多态有 3 个必要条件:继承、重写和向上转型。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中的某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。
-
多态的应用:
1.方法层面的多态:就是方法重载
2.面向对象的多态:把子类的对象赋给父类的类型
语法定义:父类类型 子类对象的名字 = new 子类构造方法();
使用目的:就是为了减少方法的重载
多态的概述:
解析:
1、在java中多态可以体现在方法上比如方法的重载,同名方法可以有不同的执行结果。
2、多态也可以体现在面向对象中,一个对象可以使用多种类型进行表示。
3.Java实现多态有 3 个必要条件:继承、重写和向上转型。
继承:在多态中必须存在有继承关系的子类和父类。
重写:子类对父类中的某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。
多态的应用:
1.方法层面的多态:就是方法重载
2.面向对象的多态:把子类的对象赋给父类的类型
语法定义:父类类型 子类对象的名字 = new 子类构造方法();
使用目的:就是为了减少方法的重载
代码演示:
Teacher父类代码:
package com.feisi.work12;
public class Teacher {
String name;
String organization;// 所在中心与机构
public Teacher() {
}
public Teacher(String name, String organization) {
this.name = name;
this.organization = organization;
}
// 授课方法
public void giveLesson(){
}
// 自我介绍方法
public void introduction(){
}
}
JavaTeacher子类代码:
package com.feisi.work12;
public class JavaTeacher extends Teacher{
public JavaTeacher() {
}
public JavaTeacher(String name, String organization) {
super(name, organization);
}
// Java 教员授课方法
public void giveLesson(){
System.out.println("打开Eclipse");
System.out.println("实施理论课授课");
}
// 自我介绍方法
public void introduction(){
System.out.println("我叫"+this.name);
System.out.println("我来自"+this.organization);
System.out.println("我是一名java讲师");
}
}
NetTeacher子类代码:
package com.feisi.work12;
public class NetTeacher extends Teacher{
public NetTeacher() {
}
public NetTeacher(String name, String organization) {
super(name, organization);
}
// Net 教员授课方法
public void giveLesson(){
System.out.println("打开Visual Studio 2005");
System.out.println("实施理论课授课");
}
// 自我介绍方法
public void introduction(){
System.out.println("我叫"+this.name);
System.out.println("我来自"+this.organization);
System.out.println("我是一名net讲师");
}
}
Test测试类代码:
package com.feisi.work12;
public class Test {
public static void main(String[] args) {
// 将子类型的对象数据转化为父类类型 为什么要转换?为了避免一些不必要的错误 与体现多态的思想
Teacher javaTeacher = new JavaTeacher("老赵","飞思");
judge(javaTeacher);
Teacher netTeacher = new NetTeacher("老欧","桌景京");
judge(netTeacher);
}
// 根据传入的对象自动调用对应的被重写子类方法,减少了方法的重载次数
public static void judge(Teacher teacher){
// 调用授课方法
teacher.giveLesson();
// 调用教员自我介绍方法
teacher.introduction();
}
}
运行结果:



