类
public class Person {
//成员变量
String name;//姓名
String sex;//性别
int height;//身高
int weight;//体重
//方法
//吃
public void eat() {
System.out.println(name+" 吃饭....");
}
//喝
public void drink() {
System.out.println(name+" 喝啤酒");
}
//写代码
public void writeCode() {
System.out.println(name+" 写java代码");
}
}
对象创建
对象的创建过程也被称为对象的实例化过程
语法:类名 标识符 = new 类名();
class Person
{
//第一部分
//成员变量:特征【名词】
//非静态成员变量
String name;//null
int age;//0
char gender;//\u0000
//第二部分
//成员方法:行为【动词】
//非静态成员方法
public void eat() {
System.out.println("eating~~~~");
}
}
//演示对象的创建,跨类进行调用成员方法以及访问成员变量
//测试类:含有main函数得类被称为测试类
public class TestPerson
{
public static void main(String[] args)
{
//1.创建对象
//语法:类名 变量名称 = new 类名();
Person xiaoMing = new Person();
//2.调用对象属性
//语法:对象.
xiaoMing.name = "小明";
xiaoMing.age = 10;
xiaoMing.gender = 'B';
//3.调用对象方法
xiaoMing.eat();
}
}
JVM内存分配分析
程序运行时,操作系统会分配三块主要的内存空间
- 栈:直接存放基本类型数据,和引用类型的地址
- 栈空间比较小,存取速度相对较快
- 先进后出
- 堆:存放引用类型的实际数据部分
- 堆空间比较大,存取速度相对较慢
- 方法区:(静态区、串池(常量池)、代码段),方法区中有一块空间叫串池,用来存放字符串常量,
在jdk1.8之后常量池作为堆中一部分,方法区的概念弱化。
说明:程序中定义的Person类型的变量实际上是一个引用,它被存放在栈内存中,他指向实际的Person对象,而真正的Person对象则存放于堆内存中
构造方法普通方法
构造方法
访问权限修饰符 类名(参数列表) {
//方法体
}
普通方法:
访问权限修饰符 其他的修饰符 返回值类型 方法名(参数列表) {
}
注意:
a.构造方法没有返回值类型,构造方法是在实例化对象的过程中自动调用的
b.如果不写构造方法,系统会默认为我们提供一个无参的构造方法,如果添加了构造方法,系统不再提供默认的构造方法。
构造方法和普通方法的区别
a.构造方法是在创建对象的过程中自动调用的,普通方法只能手动进行调用
b.构造方法没有返回值类型【注意区别返回值void】,普通方法的返回值类型要么是确定的类型,要么为void
c.系统会默认为我们提供一个无参的构造方法,普通方法只能手动添加
d.构造方法的方法名称必须和对应的类名保持一致
e.构造方法在创建对象的过程中就会执行,而且每个对象只执行一次,对于普通方法而言,只有在需要使用的时候才被执行,并且一个对象可以调用多次
//演示构造方法的使用
public class Test
{
public static void main(String[] args)
{
//创建动物
Animal dog=new Animal();
//使用属性
dog.color="黄色";
dog.nickname="旺财";
dog.age=3;
//使用方法
dog.eat();
}
}
public class Animal {
//颜色
String color;
//昵称
String nickname;
//年龄
int age;
//默认构造方法
public Animal() {
}
//吃
public void eat() {
System.out.println(nickname+"大口大口吃东西");
}
}
构造方法重载
默认构造方法:只能创建对象,不能做任何初始化操作,如果实现创建对象时初始化属性,需要添加带参的构造方法,初始化对象的属性。如果一个类中有多个构造方法,这就是构造方法重载。
//演示构造方法的重载
//测试类
public class Test
{
public static void main(String[] args)
{
//直接赋值
/*
Dog maomao = new Dog();
maomao.name = "毛毛";
maomao.age = 3;
maomao.lookHome();
*/
//通过构造方法赋值
Dog dahuang = new Dog("大黄",5);
dahuang.lookHome();
}
}
//实体类
public class Dog
{
//成员变量
String name;
int age;
//构造方法
public Dog() {}
//有参的构造方法,参数一般设置为和成员变量有关的参数
public Dog(String n,int a) {
//给成员变量赋值
name = n;
age = a;
}
//成员方法
public void lookHome() {
System.out.println(name + "看家");
}
}
this
this: 表示当前对象的引用。
this.属性 访问本类的成员属性 作用:为了区分成员变量和形参变量名一样的情况
this.方法 访问本类的成员方法
this()(了解)
访问本类中的其他构造方法
注意:
a.必须出现在构造方法中
b.访问的是除了当前构造方法之外的其他构造方法
c.具体访问的是哪个构造方法,取决于所传的参数
d.只能书写在构造方法的第一条语句
e.this()在同一个构造方法中只能出现一次
public class Test
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}
public class Dog
{
String name;
int age;
int num;
String hobby;
//提高代码的可读性,可维护性
//构造方法
public Dog() {
}
public Dog(String name) {
this.name = name;
}
public Dog(int age) {
this.age = age;
}
public Dog(String name,int age) {
this.name = name;
this.age = age;
}
public Dog(String name,int age,int num,String hobby) {
this(name,age);
this.num= num;
this.hobby = hobby;
}
}