1.this关键字
- this可表示当前对象的引用.this使用在成员方法中|构造器中,区分同名变量问题(局部和成员同名问题)
示例:
public class Computer01 {
public String brand;
public double price;
public String color;
public Computer01() {
System.out.println("空构造");
}
public Computer01(String brand, double price) {
this.brand = brand;
this.price = price;
System.out.println("带参2构造");
}
public Computer01(String brand, double price, String color) {
this(brand,price);
this.color = color; //this指代当前创建的对象
System.out.println("带参3构造");
}
public void test(){
String brand="哈哈";
System.out.println(this.brand+"-->"+this.price+"-->"+color);
}
}
假若有:
Computer01 com=new Computer01();
那么this代表的就是new Computer01()的对象引用com.
-
注意:
当在构造器中通过this([参数列表])调用其它构造器时,语句必须放在第一句;
如果出现同名的成员和局部变量的问题,如果想要指代成员,必须使用this;
不能使用this关键字进行构造器之间的相互调用;
this和static共同使用;
2.static关键字
当一个事物为static的时,就意味着这个变量或方法不会与包含它的那个类的任何对象实例关联在一起,所以从未创建对象的类也可以调用static方法或访问其static变量.
static修饰的成员变量:静态变量|类变量(static不能修饰局部变量)
static修饰的成员方法:静态方法|类方法
1.静态变量的使用方法--->ClassName.propertyName
静态变量时随着类加载时被完成初始化的.它在内存中只有一个.jvm只会为它分配一次内存.
示例:
public class Test{
public static void main(String []args){
Person p1=new Person();
person p2=new Person();
}
}
class Person{
String name;
int age;
static String gender="男";
}
在上面的例子中我们创建了两个对象,就会在堆内存中开辟两个空间存储数据.但是最终的gender变量只有一份,会存储在静态域中,两个对象都可以使用.这样有个好处是我们再去创建对象时不用再一个个的定义gender这个属性了,因为每个由Person的对象都可以指向这个共享变量.
2.静态方法的使用方法-->ClassName.MethodName()
因为static方法在类加载时就存在了,不依赖于任何实例,所以它必须实现,即static方法不能是抽象方法.
3.static内容中不能直接使用非static成员变量和非static成员方法
因为在把类送入JVM加载时,static内容就已经存在,它不依赖实例而存在.而非static内容只有在对象实例化之后才会产生.若想再static环境中不实例化就访问非static的内容,在static环境中是找不到的,这样编译器就会报错,因为这些变量还没有创建出来.
一句话就是,static事物不能直接使用非static成员事物.
4.不可以覆写static方法
因为覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的.static方法跟类的任何实例都不相关,所以概念上不适用.
3.private关键字
我们可以使用private关键字来实现封装,通过private关键字我们把成员属性变为私有的,这样可以提升代码的安全性.
示例:
public class Person {
private String name;
private String gender;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
通过上面的例子可以看出,我们通过private关键字把三个成员属性变为了私有的,实现了对三个成员属性的封装.
但是我们定义属性总是要设置值的,是要给人用的.所以要在类中为每个属性提供一对公共的取赋值方法,用于对私有属性的访问.即setter,getter.
4.block块
块,就是{}.我们可以在这对花括号中写代码.下面介绍三种块:
-
局部代码块|普通语句块
这种块定义在方法中,在进行方法调用时执行其中的代码
-
构造块
这种块定义在类中方法外,在进行创建对象时执行.构造块中的代码先于构造器代码执行,若有多个构造块,就从上到下依次执行
-
静态块
这种块同样定义在类中方法外,在进行类加载时执行.如果存在多个静态块,就从上到下依次执行
一个{}就是一个作用域,作用域中的变量只可以在块中使用,但
5.继承
假设我们要定义一个Person类,类中的属性有name,age,gender,还有eat()方法,run()方法.然后还要定义一个Student类,类中也要定义属性name,age,gender,还有eat()方法,run()方法.这样可以看出,代码就出现了重复.这个时候我们可以使用继承来简化代码.
从已有的类派生出新的类,称为继承.
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为.
1.继承的语法格式如下:
class 父类{
}
class 子类 extends 父类{
}
2.继承的特性:
- java不支持多继承但支持多重继承
- 子类拥有父类的非private属性,方法
- 子类可以拥有自己的方法和属性,即子类可以对父类进行扩展
- 子类可以用自己的方法实现父类的方法
- 对于父类中有static变量,如果在子类中没有重新定义同名属性,子类父类共享该属性;当子类重新定以后,不共享
- final修饰的类不能被继承
- 父类中的final方法可以被继承,但不可以被覆写
6.package和import语句
为了便于管理大型软件系统中数目众多的类,解决类的命名冲突问题,java引入了包(package)的机制,提供类的多重类命名空间.
一般的命名为:公司域名倒写+功能名|模块名
package语句作为java源文件的第一条语句,指明该文件中定义的类所在的包.
java编译器把包对应于文件系统的目录管理,package语句中,用'.'来表名包的层次.
不要定义与jdk相同的包,相同的类,否则会引起很多莫名其妙的问题.
如果一个类存在包名,则使用该类时,必须使用全额限定名(简称全名或完整类名),编译器才能找到该类;也可以使用import在文件的开头引入要使用到的类.
不需要使用import的类有:
- 语言包(java.lang)下的类
- 同包下的类
静态导入:import不仅可以导入类,还具有导入静态方法的功能.
7.GC
Garbage Collection--->垃圾回收机制
是java提供的一种垃圾回收机制,可以回收不用的内存空间.
可以使用System.gc() 通知垃圾回收机制回收垃圾.但是是否回收,什么时候回收,程序员无权控制垃圾回收机制
可以利用finalize方法实现垃圾回收