本帖最后由 小石姐姐 于 2017-12-23 16:49 编辑
技术贴
被static修饰的对象,方法的特点.
被所有的对象共享.
可以直接使用类名来调用
静态所修饰的成员加载优先于对象,随着类的加载而加载并初始化.(在方法区中)
非静态成员在创建对象时才加载并初始化(在堆内存中).
不属于任何对象!!!
运行会把一个类的字节码文件加载到方法区
Student.name = "传智学院";
静态方法中是否有this?
(没有this,因为静态成员是随着类的加载而加载,优先于所以的对象,此时可能还没有对象被创建).
减少重复的赋值,操作,内存空间
静态方法和非静态方法别区别:
1:生命周期不同
静态随着类的加载而加载,随着程序结束而结束
非静态随着对象的创建而加载,使用对象的结束而结束.
2:内存中的定义位置不同
3:初始化时机不同
4:静态方法在本类中调用可以省略类名.
静态应用场景
所有对象都应用它而且用的相同,
Math.PI,
Math.abs(double,float,int,long(a))
Math.ceil(1.2)不管小数位是什么都向前进1.
Math.floor(1.6)不管小数是什么都舍去.
Math.round(1.4 )四舍五入.
Math.pow(a.b)a的b次幂.
Math.random()返回一个大于0小于1.0的随机数
局部代码块:
在方法里,控制变量的生命周期(作用域).
生命周期短,出了代码块就不能用了,不用等方法执行完:节省内存.
类中,调用方法时执行.
构造代码块:
提取构造方法中的共性,每次创建对象都会执行,并且在构造方法执行前执行
类中方法外,构造方法执行前执行
静态代码块:
随着类的加载而加载,只加载一次,加载类时需要做的一些初始化,比如加载驱动.
类中方法外,前面加static.
工具类:
把构造方法私有,
所有方法用static修饰,类名直接调用
图解:程序运行---先把包换主方法的类加载到方法区(产生一个类的字节码的对象)[包含一个静态区域和非静态区域]
{}---主方法进栈---加载所要创建的对象的类到方法区---创建对象(有地址值和成员变量)[创建好对象地址值指向创建的变量]
---
继承的特点:
Java语言只支持单一继承,只能继承一个父类.
Java语言支持多层继承()
继承中成员变量的特点:
**子类只能继承父类非私有的成员
变量在Java中遵循就近原则
this.name(本类中成员变量获取)
/*如果当前类中没有该属性,this会到父类中寻找*/
super.name(父类中成员变量获取)
super:可以获取父类的成员变量和成员方法,用法和this是相似的
this 获取同类中类下的成员,
this与super
this:当前所在类的对象的引用(哪个对象调用方法this就指向哪个对象).
this:当前对象的引用
调用子类其他成员
在子类的构造方法第一行,调用子类其他构造方法
super:子类对象的父类引用
调用父类成员.
在子类构造方法第一行调用父类构造方法.
多态成员静态方法编译时候看左边,父类有的方法和变量可以使用,
想使用子类型,父类型中没有子类型的特有成员,所以需要判断父类引用是否是子类型,
是的话强转,然后就可以调用子类的特有成员,当创建子类对象当做参数传入的时候会自动转换到父类型.
多态的成员的特点:
成员变量 编译时看的是左边(Dad里有没有定义使用的变量),运行时看的左边(获取变量的具体值)(成员没有重写和动态绑定概念)
成员方法 编译时看的是左边,运行时看右边
静态方法 编译时看的是左边,运行时看的也是左边.(静态方法,使用变量去调用静态方法,相当于使用变量类型的类名去调用)
new 的时候只是在程序运行的时候才会创建对象,编译的时候看类型中有没有你所要使用的类型.
常见规则:
以后我们使用public来修饰类, 一个java文件中只能有一个类.
如果一个文件中有多个类,类名和文件问一样的类名,必须用public修饰
其他的类不能用public修饰
以后所有的成员变量都使用private修饰
以后所有的方法使用public修饰
以后所有的构造方法使用public修饰
如果你不想让创建对象,使用private修饰.
格式:
new 类/接口(){
如果创建了继承这个子类对象,我们必须重写父类的方法
如果是创建了实现这个接口的子类对象,我们必须要实现该接口的所有方法
};
原理:创建的不是父类的对象,而是创建了继承这个类的子类对象或者是创建了实现这个接口的子类对象
2:获取字节码对象的方式:
1:通过Object类的getClass()方法获取字符串对象.
Teacher t = new Teacher()
Class class = t.getClass();
包含了全路径的类名.
2:Class clazz = Teacher.class;
通过类名调用属性class类获取
3:Class.forName("com.itheima_01.Teacher")
通过Class类的静态方法forName()来获取
1.字节码对象可以获取任意一个对象的成员变量的值
因为他是根据字节码文件,class文件创建出来的
2.创建一个类,加载一个类的时候会生成字节码对象,这个对象就是这个类的一个声明,所以可以同过这个字节码对象获取类中任何成员.
Student s = new Student();
Class clazz = s.getClass();
Class clazz1 = Student.class;
Class clazz2 = Class.forName("com.itheima.string.Student");
boolean equals(Object obj)
使用==来比较两个对象是否相等,则比较地址值是否相等.
|
|