类与对象

面向对象
       面向对象是基于面向过程的编程思想
类与对象
       Java语言中最基本的单位是类。用类体现事物

       成员变量                事物属性
       成员方法                事物行为
:是一组相关的属性和行为的集合。
对象:是该类事物的具体存在,是一个具体的实例。
例如:
学生:类
班长:对象

类的定义及使用
       类的定义
              成员变量:定义格式相同,只是位置不同
              成员方法:定义格式不同,只是去掉了static
       使用类的内容
              创建对象格式:
                     类名   对象名 = new 类名();
              使用成员变量、成员方法
                      对象名.成员变量
                      对象名.成员方法()

成员变量与局部变量的区别
       在类中位置不同
              成员变量:类中方法外
              局部变量:方法内或方法声明上
       在内存中位置不同
              成员变量:栈内存
              局部变量:堆内存
       生命周期不同
              成员变量:随着对象的存在而存在,随着对象的消失而消失
              局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
       初始化不同
              成员变量:用默认初始化值
              局部变量:没有默认初始化值,必须先定义,赋值,才能使用。 
            
形式参数的问题:
       基本类型:形式参数的改变不影响实际参数
       引用类型:形式参数的改变直接影响实际参数
     (引用类型有:类、接口、数组)

匿名对象:没有名字的对象。
       应用场景:只调用一次的时候适合,调用多次不适合。
       匿名对象调用完毕后可以别垃圾回收器回收
 


class Student1{
	public void show() {
		System.out.println("hello world");
	}
}

class Student1Demo{
	public void method(Student1 s) {
		s.show();
	}
}

public class NoName {

	public static void main(String[] args) {
		
		Student1Demo s = new Student1Demo();
		Student1 s1 = new Student1();
		s.method(s1);
		
		System.out.println("---------");
		
		//匿名方法调用
		new Student1Demo().method(new Student1());
	}
}

--------------------------------------------------------------------------------------

结果:
hello world
---------
hello world

封装

封***r>        封装:是指隐藏对象的属性和实现细节,只对外提供公共访问方式。
       好处
                1、隐藏了实现细节,提供公共的访问方式
                2、提高了代码的复用性
                3、提高了安全性
       封装原则
              将不需要对外提供的内容都隐藏起来
              把属性隐藏,提供公共方法对其访问

private关键字
       是一个权限修饰符
       可以修饰成员(成员变量和成员方法)
       被private修饰的成员只在本类中才能访问。
private常见应用:
       把成员变量用private修饰
       提供对应的getXxx()/setXxx()方法

this关键字
       代表所在类的对象引用
       方法被哪个对象调用,this就代表那个对象(当局部变量隐藏成员变量时使用)

构造方法
       构造方法作用:给对象的数据进行初始化
       构造方法格式:
              方法名与类名相同
              没有返回值类型,连void都没有
              没有具体的返回值
       构造方法注意事项
              构造方法也是可以重载的
              如果给未出构造方法,系统将自动提供一个无参构造方法。
              如果给出构造方法,系统将不再提供默认的无参构造方法。(如果还想使用无参构造方法,必须自己给出)
            (建议自己给出无参构造方法)
        给成员赋值两种方式
               setXxx();
               构造方法


class Student{
	private String name;
	
	private int age;
	
	//无参构造方法
	public Student(){
	}
	
	//带参构造方法
	public Student(String name,int age) {
		this.name=name;
		this.age=age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	public void show() {
		System.out.println(name+"---"+age);
	}
}
	
public class StudentTest {
	public static void main(String[] args) {
		Student s = new Student();
		
		s.setName("林青霞");
		s.setAge(27);
		
		System.out.println(s.getName()+"---"+s.getAge());
		
		Student s1 = new Student("刘意",30);
		
		s1.show();
	}
}


----------------------------------------------------------------------------------------
结果:

林青霞---27
刘意---30

类的初始化过程
       加载Student.class文件进内存
       在栈中为s开辟空间
       在堆内存未学生对象开辟空间
       对学生对象的成员变量进行默认初始化
       对学生对象的成员变量进行显示初始化
       通过构造方法对学生对象的成员变量赋值
       学生对象初始化完毕,把对象地址赋值给s变量

class Phone{
	//品牌
	private String brand;
	//价格
	private int price;
	//颜色
	private String color;
	//无参构造方法
	public Phone() {
		
	}
	
	public void setBrand(String brand) {
		this.brand=brand;
	}
	
	public int getPrice() {
		return price;
	}
	
	public void setPrice(int price) {
		this.price = price;
	}
	
	public String getColor() {
		return color;
	}
	
	public void setColor(String color) {
		this.color = color;
	}
	
	public String getBrand() {
		return brand;
	}
	
}
public class PhoneTest {

	public static void main(String[] args) {
		Phone s = new Phone();
		s.setBrand("三星");
		s.setPrice(4999);
		s.setColor("褐色");
		System.out.println(s.getBrand()+"---"+s.getPrice()+"---"+s.getColor());
	}
}

-----------------------------------------------------------------------------------------
结果:

三星---4999---褐色

如果一个变量是用来描述这个类的信息,该变量就应该定义为成员变量

static关键字
         可以修饰成员变量和成员方法
         特点:
                随着类的加载而加载
                优先与对象存在
                被类的所有对象共享(判断该不该使用静态的依据)
                可以通过类名调用
          注意事项
                 在静态方法中是没有this关键字
                 静态方法只能访问静态成员变量和静态成员方法(非静态方法都可以访问)

静态变量和成员变量的区别
       所属不同
              静态变量:属于类,类变量
              成员变量:属于对象,对象变量,实例变量
       内存位置不同
              静态变量:方法区的静态区
              成员变量:堆内存
       生命周期不同
              静态变量:静态变量是随着类的加载而加载,随着类的消失而消失
              成员变量:成员变量是随着对象的创建而存在,随着对象的消失而消失
       调用不同
              静态变量:可以通过对象名调用,也可以通过类名调用
              成员变量:只能通过对象名调用

main方法格式:
public  static  void  main(String[]  args){....}
public:公共的,访问权限是最大的。由于main方法是被jvm调用,所以权限要够大。
static:静态的,不需要创建对象,通过类名就可以。方便jvm调用。
void:main方法是被jvm调用,不需要返回值
main:是一个常见的方法入口。(主方法)
String[]  args:字符串数组。