目录
1.实例化对象
一切皆对象
类由属性(成员变量)和行为(方法)组成,
public class Dog {
/**
* 性别
*/
int gender;
/**
* 颜色
*/
String color;
/**
* 种类
*/
String breed;
public void run(){
}
public void sleep() {
}
public void play() {
}
}
public void test01() {
//类Dog实例化,dog是Dog类的(实例化)对象,dog的数据类型是Dog
Dog dog = new Dog();
2.方法的调用
方法分为静态方法和非静态方法。静态方法可以通过类型.方法名来调用,但是非静态方法不能这样调用。可以通过类的实例化,用对象名.方法名来调用静态方法和非静态方法
public class Person01 {
public static void eat() {
System.out.println("吃");
}
public void drink() {
System.out.println("喝");
}
public void play() {
System.out.println("玩");
}
}
public class Person01Test {
@Test
public void test01() {
//静态方法可以通过类型.方法名来调用,但是非静态方法不能这样调用
Person01.eat();
//可以通过类的实例化,用对象名.方法名来调用静态方法和非静态方法
Person01 p = new Person01();
p.drink();
p.play();
p.eat();
}
}
3.成员变量与局部变量
在类中独立于方法的变量为成员变量,在方法中存在的变量为局部变量。
两者的不同1.作用域不同。成员变量作用于整个类;局部变量仅作用于定义他的方法。
2.初始值不同。成员变量有默认值,为其数据类型的默认值;局部变量无默认值。
3.同名变量不同。一个方法中不能存在同名的局部变量,不同的方法中可以有同名的局部变量。
4.存储位置不同。成员变量在堆内存中;局部变量在栈内存中。
5.声明周期不同。成员变量在对象创建以后产生,对象回收时清除;局部变量在方法调用时存于栈内存中,调用结束清除。
静态成员变量可以在多个对象之间数据共享
4.引用数据类型变量和匿名对象
引用数据类型变量引用了一个内存地址,由此导向类和方法
匿名对象是没有引用类型变量指向的对象
public class Person01 {
/**
* 姓名
*/
String name;
}
public class Person01Test {
@Test
public void test01() {
Person01 a = new Person01();
a.name = "皮卡丘";//这是引用数据类型变量
new Person01().name ="伊布";//这是匿名对象 没有引用数据类型
}
匿名对象的优缺点
优点:使用后就从内存中消失,不会长期占用内存,适用于偶尔使用的情况。
缺点:他的优点即是缺点,不能长期使用,如果长期使用会在内存中频繁创建和回收,浪费系统资源。
5.访问修饰符
Java中,可以使用访问控制符呆保护对类,变量、方法和构造方法的访问。Java支持4种不同的访问权候。访问修饰符public, protected, default ,private。
public:对所有类可见。快用对象:类、接口、变量,方法
protected :对同包内的类和所有子类可见。使用对象:变量、方法。注宣: 不能修饰类(外部类)
default (即默认,什么也不写) : 在同一包内可见,不使用任何修饰符。使用对家:类。接口。变量。方法。
private :在同一类内可见。使用对象:变量。方法。注意: 不能修仍类(外部类)
6.方法的封装
直接给对象的属性赋值和读取会导致代码暴露,为了保护代码对方法进行封装,用private修饰属性,在通过其他
的方法进行赋值和读取完成。
public class Person02 {
/**
* 姓名
*/
private String name;
public void setName(String xm) {
name = xm;//注意参数变量名与成员变量是否一致,若一致则需要在前面加this.
//例this.name = name this在此代表方法的调用者
}
public String getName() {
return name;
}
}
@Test
public void test01() {
Person02 a = new Person02();
//因为方法的修饰词变为private,用对象名.方法名无法直接获取
a.setName("皮卡丘");//通过set和get方法来赋值和读取
System.out.println(a.getName());
}
eclipes可以通过右键找到source选项找到getter和setter选项自动生成set和get方法。
7.构造方法
方法名与类名相同,方法体没有返回值但是在方法声明的时候却不需要使用vold修饰的方法我们称之为构造方法。
构造方法用于初始化对象,对象的属性赋值。
没有参数的构造方法称之为无参构造方法,相反有参数则为有参构造方法。
在一个类中,既没有无参构造方法,又没有有参构造方法,jvm会自动追加一个无参构造方法。但是在一个类中存在有参构造方法时会jvm不会自动追加无参构造方法。所以在任何情况下都需要我们先手写一个无参构造方法。
public class Person02 {
private String name;
/**
* 性别 0为女 1为男
*/
private int gender;
/**
* 年龄
*/
private int age = 20;
public Person02() { //无参构造方法
}
/**
* 全参构造方法
* @param name 姓名
* @param gender 性别 0为女 1为男
* @param age 年龄
*/
public Person02(String name,int gender,int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
}
@Test
public void test01() {
//有参构造方法可以在实例化时直接赋值
Person02 a = new Person02("皮卡丘", 1, 14);
}
8.构造代码块
{}包起来的代码称之为代码块。在一个类中仅用大括号包住的一段代码我们称之为构造代码块,构造代码块与构造方法一样是在类的实例化时过程中被调用的,并且构造代码块会在构造方法之前先执行,无论其在什么位置,类每次被实例化都会执行一次构造代码块。
静态代码块在构造代码块前先执行,类被加载时就会执行,不用必须实例化,只会执行一次
public class Person02 {
static{
//静态构造代码块
}
{
//"构造代码块"
}
private String name;
private int gender;
private int age = 20;
public Person02() { //无参构造方法
}
public Person02(String name,int gender,int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
}
9.继承
子类通过extends+父类名来继承父类。
子类实例化先实例化父类,先调用的父类的构造方法。
public class Person {
private String name;
/**
* 性别 0为女 1为男
*/
private int gender;
private int age = 20;
public Person(String name, int gender, int age) {
super();
this.name = name;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public Person() {
super();
}
public class Male extends Person{
//Male类继承了Person类 父类Person的子类Male
//继承
// public void Male(){
// }
// public Person(String name, int gender, int age) {
// super();
// super.name = name; //super调用父类的
// super.gender = gender;
// super.age = age;
}
@Test
public void test01() {
Male male = new Male();//无法直接实例化赋值
male.setName("皮卡丘");
male.setAge(15);
System.out.println("姓名>>"+male.getName()+"\t年龄"+male.getAge());
}