一、匿名对象
1、没有对象名称的对象
2、使用场景:
A.只调用一次方法时
B.作为方法的参数或作为方法的返回值时使用,直接传入传出一个对象
3、注意点:
A.栈方法区中没有引用地址,只在堆内存中开辟内存空间,也是优先被回收的(垃圾回收器gc),节省内存空间
B.匿名对象可以给成员变量赋值,但是没有任何意义,因为没对象名拿不到值
4、语法:
A.new 类名();
package qf22020217;
/**
* 匿名对象
*/
public class Demo01 {
public static void main(String[] args) {
//调用一次方法时
System.out.println(new Person2().getAge());
//传入方法中
new GetPerson().getPerson2(new Person2());
}
}
class Person2{
public int age;
public String name;
public int getAge(){
return age;
}
public String getName(){
return name;
}
}
class GetPerson{
public void getPerson2(Person2 temp){
System.out.println(temp.getName());
}
}
二、成员变量与局部变量的区别
1、定义的位置不同
A.成员变量在方法外(类中),局部变量是在方法中
2、声明周期不同
A.成员变量是随着对象的加载而加载,随着对象的销毁而销毁
B.局部变量是随着方法的加载而加载,随着方法的结束而结束
3、存储的位置不同
A.成员变量是存在堆内存中,局部变量是存在栈内存中
4、是否有默认值
A.成员变量有默认值,可以直接使用
B.局部变量是没有默认值,必须先赋值,才能使用
三、封装:对属性进行封装、对工具类进行封装
1、属性封装代码
package qf22020217;
public class Demo02 {
public static void main(String[] args) {
Animal02 animal02 = new Animal02();
//外部不能直接对对象属性取值赋值
animal02.setAge(-21);
System.out.println(animal02.getAge()); //结果为0,没有赋值成功
}
}
class Animal02 {
private int age;
public void setAge(int age) {
if (age > 0) { //提高了数据的安全性,设置条件进行筛选
this.age = age;
}
}
public int getAge() {
return age;
}
}
2、问题
A.private进行修饰,从外部不能直接访问其属性,通过get、set方法
B.在方法中,因为局部变量优先于成员变量,所以进行赋值时,this.age = age ==> this.成员变量 = 局部变量
四、构造方法
1、名称:构造方法、构造函数、构造器
2、作用:
A.构造方法是来实例化对象的
B.构造方法在实例化对象的时候给成员变量进行赋值
C.所有实例化对象都会执行构造方法
3、分类
无参构造、有参构造
4、特点:
A.构造方法的构造名称就是类名
B.构造方法是没有返回值,可以是使用return,用来结束构造方法
C.构造方法不能自身调用,必须由jvm来进行调用
5、说明:
A.系统会默认提供一个无参构造函数,如果自己重载了一个有参构造函数,系统就会不默认提供
B.在实际开发中,一般会存在一个无参构造函数和一个有参构造函数
6、set方法与构造方法
相同点:都可以给成员变量进行赋值
不同点:构造函数只能在实例化对象的时候给成员变量赋值一次
set方法是可以给成员变量进行多次赋值
五、静态
1、静态的概念
A.关键字:static 静止
B.修饰的成员变量:类 方法 变量…
2、区别
没有静态:在多个对象具有相同属性时,内存资源浪费,且修改相同资源时麻烦
有静态修饰符:在方法区中开辟一块空间,实现所有对象共享,只需要一次修改。
3、静态变量的访问的方式:类名或者对象名.
4、注意:静态变量又称为类变量,随着类的加载而加载,静态资源时最不容被gc(垃圾回收器)回收的,建议少用.
下面分别用代码和图解表述静态变量特点和存储
package qf22020217;
public class Demo03 {
public static void main(String[] args) {
//第一个对象创建
Person p1 = new Person();
p1.name = "小明";
Person.country = "中国"; //只需赋值一次,对象共享
p1.print();
//第二个对象创建
Person p2 = new Person();
p2.name = "小李";
p2.print();
}
}
class Person{
static String country;
String name;
public void print(){
System.out.println("国家:"+Person.country+"\t"+"姓名:"+this.name);
}
}
5、上述代码内存图解(静态变量可以类名(推荐)或对象名取值,我这里只标类名取值)
6、静态方法访问问题:
由于静态变量随着类加载而加载的,比对象先存在。所以静态变量方法不能访问非静态的方法,也不能使用this关键字,在静态方法中也不能使用this关键字访问静态的变量
六、静态变量与成员变量的比较
1、所属不同
静态变量又称为类变量,成员变量又称为对象变量
2、存储的位置不同
静态变量存在 方法区中静态区间,成员变量是存在堆内存中
3、生命周期不同
静态变量:随着类的加载而加载,最难被回收
成员变量:随着对象的创建而加载,随着对象销毁而销毁
4、访问方式不同
静态变量:直接使用类名来进行访问
成员变量:只能使用对象名来进行访问
七、继承
1、继承的概念
A.子类可以获取到父类的资源,父类不能获取到子类的资源
B.子类也有不能获取父类的资源:
不能调用private修饰的属性的,因为private只能在本类中使用
不能继承父类中的构造方法,因为构造方法只能是自己的类名才可以,但可以调用
C. super==>表示当前对象父类对象的引用,调用的语法: super() 调用无参的构造 super(参数列表) 调用父类的有参构造
2、在继承中访问成员变量的特点:
A.如果子类变量名与父类的变量重名的时候 优先访问子类的变量
B.如果子类变量与父类的变量名不重名的时候 优先访问子类的变量 如果没有 则向上进行查找 一直查找到Object
3、Object是任何类的父类或者间接父类
4、 this和super的区别
A.构造方法:
this()只能访问自身的构造方法 super() 只能访问父类的构造方法
B.成员变量:
this.变量名 既可以访问的自身成员变量 也可以访问到父类的成员变量
super.变量名 只能访问到父类的成员变量
C.成员方法:
this.方法名() 既可以访问的自身成员方法 也可以访问到父类的成员方法
super.方法名() 只能访问到父类的成员方法
解释:
因为子类继承了父类的属性、方法,所以代表子类的对象的this即可以访问自己也可以访问父类
但构造方法由jvm调用,也不能被继承,所以只能访问各自的
因为super代表父类的引用,但父类又不能访问子类的资源,所以super只能访问父类的属性、方法
5、在继承访问构造方法的特点
1、this() 调用自身的构造方法 super()调用父类的构造方法
2、说明:
A.子类在初始化之前必须先初始化父类的构造方法
B.如果子类没有调用父类的构造方法,那么子类会默认调用父类的无参构造
C.如果子类调用父类的任何构造方法,那么子类就不会调用父类的无参构造
D.如果父类只有有参构造,那么子类必须调用父类的有参构造(建议在父类时,同时写有参和无参构造方法)
3、注意点:
A.this() 与super() 必须写在构造方法的第一行 this()与super() 不能同时存在
B.构造方法是不能出现递归调用(自身调用自身)
C.其他方法是不能用来调用方法
4、继承中-访问成员的方法的特点:
父子类 方法名相同 优先访问子类的方法
字符类 方法名不相同 优先访问子类的方法 没有则上查找,一直查找到Object没有则报错
5、继承的优缺点
优点:提高了代码的可扩展性,提高了代码的可复用性
缺点:耦合度比较高,代码与代码之间联系比较紧