对应疯狂Java5.1节
成员变量、方法和构造器
package com.crazyJava.chacpter03.faceObject;
import org.junit.Test;
/**
* @ClassName: ClassAndObjectTest
* @Description: 5.1.2 定义类
* @Author: 01412126
* @Date: 2022/1/24 14:28
*/
/*
*Java类的作用有哪些?
* (1)定义变量
* (2)创建对象
* (3)调用类方法或访问类成员变量
* */
class Demo{
/*
* 成员变量
* 格式: [修饰符] + 类型 + 变量名 + [= 默认值] []里面的可以省略
* 修饰符有private public proected static final
* 其中private public proected只能出现一个,可以与static和final组合起来修饰成员变量
* */
public String name;
private Integer id;
/*
* 方法的格式:[修饰符] 返回值类型 方法名 (形参列表) 其中修饰符可以省略
* 修饰符有private public proected static final abstract
* 其中private public proected只能出现一个,final和abstract最多只能出现一个,他们可以与static组合起来修饰方法
*
* 为什么修饰符final和abstract最多只能出现一个?
*
* static修饰的变量和方法,叫类变量和类方法。没有static修饰的变量和方法,叫实例变量和实例方法。
*
* 为什么静态成员不能直接访问非静态成员?这个成员包括方法、变量、内部类和初始化块
* */
void eat(){
System.out.println("we are eatting");
}
/*
* 构造器的格式:[修饰符] 构造器名(形参列表)
* 修饰符是private public proected中的一个,也可以省略
* 构造器名必须和类名相同
* 构造器不能定义返回值类型也不能用void声明构造器没有返回值,如果为构造器定义了返回值类型
* ,编译不会报错,但是此时该方法不再是一个构造器而是一个普通方法
*
* 为什么构造器不需要返回值类型?
* 因为它的返回一定是当前对象的一个实例,所以不需要显示地指定它的返回值类型
* */
public Demo() {
}
}
public class ClassAndObjectTest {
@Test
public void test(){
Demo demo = new Demo();
demo.name = "hh";
System.out.println(demo.name);
demo.eat();
}
}
对象的产生和使用
package com.crazyJava.chacpter03.faceObject;
/**
* @ClassName: ObjectConstructTest
* @Description:
* 5.1.2 对象的产生和使用
* 5.1.3 对象、引用和指标
* @Author: 01412126
* @Date: 2022/1/24 15:17
*/
/*
* Java对象的作用
* (1)访问对象的实例变量
* (2)调用对象的实例方法
*
* 如果访问权限允许的话,类调用类方法或类变量,实例调用实例方法或实例变量
*
* */
class Person{
public String name;
private Integer age;
}
public class ObjectConstructTest {
public static void main(String[] args) {
/*这个语句实际上产生了两个对象,一个存储在堆里面的Person对象
* 和一个存储在栈里面的person变量,该变量存储的内容实际上就是Person对象在堆里面的地址
*
* 程序里面访问person变量的成员变量和方法的时候,其实就是访问堆里面Person对象的成员变量和方法
*
*
*
* */
Person person = new Person();
//name的修饰符是public,所以可以使用实例直接访问
person.name = "hh";
System.out.println(person.name);
}
}
对象的This引用
package com.crazyJava.chacpter03.faceObject;
/**
* @ClassName: ThisTest
* @Description:对象的this引用
* @Author: 01412126
* @Date: 2022/1/24 16:13
*/
/*
* this关键字总是指向调用该方法的对象
* (1)在方法中引用调用该方法的对象
* (2)在构造器中引用该构造器正在初始化的对象
*
* this关键字的作用就是让类里面的一个方法调用类里面的另一个方法或实例变量的时候不需要重新new一个对象出来
*
* 当this出现在某个方法里面的时候,它所代表的类型是确定的,它所代表的实例是不确定的,只有当这个方法被调用时
* 才能确定谁在调用这个方法
*
* 由于在Java的一个类里面一个方法依赖另一个方法很常见,因此Java允许对象的一个成员调用另一个成员,可以省略this前缀
*
* 那么在哪些情况下面必须使用this?
* 在构造器中访问其他变量或成员方法时都可以省略this前缀,但是如果构造器里面有一个与成员变量相同的局部变量,
* 又必须在构造器中访问这个被覆盖的成员变量,则必须使用this前缀。感觉setter方法,也是这样的。
* */
class Animal{
public String name;
public Integer age;
public void eat(){
System.out.println("******eat****** "+name);
}
public void jump(){
//一般来说我们调用eat()方法是应该new一个Animal对象的,this解决了这个问题
//下面执行animal.jump()的时候,这个this其实指向的就是animal这个对象即调用animal的eat()方法
//现在基本上这个this可以省略了,直接写eat()方法
this.eat();
System.out.println("******junmp*****");
}
public static void say(){
/*静态成员不能直接访问非静态成员?
因为类方法可以直接由类来调用,如果类方法里面又直接访问了实例变量或实例方法
*那么实例方法的this又指向哪个变量呢?这个就不好区分了
如果确实需要在静态方法里面访问一个实例方法
我们可以重新创建一个对象,再用这个对象来调用实例方法
* */
//eat();
}
}
public class ThisTest {
public static void main(String[] args) {
Animal animal = new Animal();
animal.name = "jjj";
animal.jump();
}
}