面向对象05
1、方法的重写(重新写,但还是同一个方法)
-
发生在父子类中,方法签名(方法名+参数列表)完全相同
-
重写方法被调用时,只看调用者的对象类型(规定)
public class Test01 { int a; void say(){ System.out.println("这是父类方法"); } } class TempClass extends Test01{ int b; void say(){ System.out.println("这是子类方法"); } public static void main(String[] args) { Test01 test01 = new Test01(); TempClass tempClass = new TempClass(); Test01 test02 = new TempClass(); test01.say();//这是父类方法 tempClass.say();//这是子类方法 test02.say();//这是子类方法 } }
2、重写与重载的区别
- 重写(override):发生在父子类中,方法签名(方法名+参数列表)完全相同 本质上,还是同一个方法
- 重载(overlord):发生在同一个类中,方法名相同,参数列表不同 本质上,完全是不同的方法
3、 package和import
-
package:声明包
- 作用:避免类的命名冲突
- 同包中的类不能同名,但是不同包中的类可以同名
- 类的全称:包名.类名,包名常常有层次结构
- 建议:包名所有字母都小写
-
import:导入类
-
同包中的类可以直接访问,而不同包中的类不能直接访问,若想访问:
先import导入类,再访问---------建议
类的全称-------------------------------太繁琐,不建议
-
4、访问控制修饰符(封装:数据安全)
-
public:公开的,任何类
-
private:私有的,本类
-
protected:受保护的,本类、派生类、同包类-----------应用率低
-
default默认的:什么也不写,本类、同包类-------------------------java不建议默认权限
说明:
\1. 类的访问权限,只能是public或默认的(内部类除外)
\2. 类中成员的访问权限,如上4种都可以
\3. 访问权限由低到高依次为:private<默认的<protected<public
5、static:静态的
-
static+变量(静态变量)
-
属于类,存储于方法区中,只有一份(是类的特有属性)
-
通过类名点来访问(也可以对象)
-
一般是所有对象共享的数据(图片、音频、视频等)
public class Test01 { static int a; int b; public Test01() { a++; b++; } void say(){ System.out.println("这是父类方法"); } } class TempClass extends Test01{ void say(){ System.out.println("这是子类方法"); } public static void main(String[] args) { Test01 test01 = new Test01(); System.out.println(test01.a);//1 System.out.println(test01.b);//1 Test01 test02 = new Test01(); System.out.println(test02.a);//2 System.out.println(test02.b);//1 Test01 test03 = new Test01(); System.out.println(test03.a);//3 System.out.println(test03.b);//1 //a和b都是Test01的成员变量,区别在于一个是静态(static修饰)另一个不是 在内存中,静态变量在加载类时已经存入方法区,每new一次对象,动用构造方法时,自增的都是方法区中的那个a,所以说静态变量是类的属性,属于类 而b在每次new对象时都会创建新的一个b存放在堆中,是属于对象的实例变量 } }
-
-
static+方法(静态方法)
-
属于类,存储方法区中,只有一份
-
常常通过类名点来访问
-
静态方法中没有隐式this传递,所以不能直接访问实例成员(因为静态方法已经存在方法区中,不需要对象就可调用,若要访问实例成员,可以在静态方法中new一个对象来操作)
-
何时用:方法的操作与对象无关(方法中不操作对象的属性和行为)
例如Math类中的许多方法就不需要new对象就可以操作
-
-
static+代码块(静态块)
-
由static修饰
-
属于类,在类被加载期间自动执行,因一个类只被加载一次,所以静态块也只执行一次
-
何时用:初始化/加载静态资源(图片、音频、视频等)
----------为static变量赋值
代码块:就是一对大括号所包的代码
在加载类时执行静态块,而加载类只执行一次(后续new新对象时不会再加载)
补充:
-
属性私有化(private),行为(方法)公开化(public)
-
成员变量分两种:
实例变量:没有static修饰,属于对象的,存储在堆中,有几个对象就有几份,通过对象/引用点来访问
静态变量:有static修饰,属于类的,存储在方法区中,只有一份,常常通过类名点来访问
一般在构造方法中对实例变量进行初始化,在静态块中对静态变量进行初始化
-
内存管理:由JVM来管理的
堆:new出来的对象(包括实例变量、数组的元素)
栈:局部变量(包括方法的参数)
方法区:.class字节码文件(包括静态变量、所有方法)