1. 面向对象的概念
-
面向对象:封装
-类内部行为自己控制,别人无法干涉
本身方法等 自身决定 -
面向对象:继承
子类复用父类的描述信息和行为
父类/基类:哺乳动物类
子类/派生类:人类 -
面向对象:多态
哺乳动物类:人类、马类
人类和马类 鸣叫行为不一样,称为多态
2.定义类
- 方法、变量小写开头。 类大写开头
- 成员变量是:private; 成员方法是:public ; 不要加static
public class Person {
//成员变量 一般是private
private int age;
private String name;
// 成员方法 一般是public
//设置年龄
public void setAge(int value)
{
this.age=value;
}
//设置名字
public void setName(String value)
{
this.name=value;
}
//读取名字+年龄
public void sayHello()
{
System.out.println("我的名字是"+this.name+",我的年龄是"+this.age);
}
}
3.对象的创建和调用方法
定义类的变量,指向初始化的对象,调用方法
public class Main {
public static void main(String[] args) {
// 定义变量p 指向一个初始化对象
Person p=new Person();
//调用成员变量和成员方法
p.setAge(30);
p.setName("小伟");
p.sayHello();
}
}
4.对象之间是相互独立的
相同类的对象之间 或者不同类的对象之间都是相互独立的
public static void main(String[] args) {
// 定义变量p 指向一个初始化对象
Person p=new Person();
//调用成员变量和成员方法
p.setAge(30);
p.setName("小伟");
p.sayHello();
//定义新对象。p和p1 这两个变量指向的对象互不影响
Person p1=new Person();
p1.setAge(33);
p1.setName("林志颖");
p1.sayHello();
//重新调用p指向的对象的方法
p.sayHello();
5.通俗方法讲变量和对象
1个变量只能指向一个对象
如果变量指向对象变了,那么之前所指向对象的关系删除
public class Main {
public static void main(String[] args) {
// 定义变量p 指向一个初始化对象
Person p=new Person();
//调用成员变量和成员方法
p.setAge(30);
p.setName("小伟");
p.sayHello();
//定义新对象。p和p1 这两个变量指向的对象互不影响
Person p1=new Person();
p1.setAge(33);
p1.setName("林志颖");
p1.sayHello();
// p2 指向 p1变量所指向的对象
Person p2=p1;
p2.setAge(66);
p2.setName("周润发");
p2.sayHello();
p1.sayHello();
}
}
6 给方法传变量
传递给方法的参数变量本身是拷贝。
public class Main {
public static void main(String[] args) {
// 定义变量p 指向一个初始化对象
Person xiaowei=new Person();
//调用成员变量和成员方法
xiaowei.setAge(30);
xiaowei.setName("小伟");
xiaowei.sayHello();
//调用方法,改变变量的值
test(xiaowei);
xiaowei.sayHello();
}
// 定义一个方法,注意是要加static
static void test(Person p)
{
p=new Person();
p.setAge(888);
}
}
7成员变量和局部变量
必须初始化,对象初始化为null
NullPointerException --空指针
8 深入理解this
- Person 类
package com.test;
public class Person {
private int age;
private String name;
private int height;
private String gender;
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return this.age;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void setHeight(int height)
{
this.height=height;
}
public int getHeight()
{
return this.height;
}
public void setGender(String gender)
{
this.gender=gender;
}
public String getGender()
{
return this.gender;
}
public void sayHello()
{
System.out.println("my name is "+this.name+",我的年龄是"+this.age+",我的身高是"+this.height+",我的性别是"+this.gender);
}
public boolean isSamePeople(Person p)
{
return this.age==p.age&&this.name.equals(p.name)
&& this.height==p.height &&this.gender.equals(p.gender);
}
}
- main函数
package com.test;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1=new Person();
p1.setAge(18);
p1.setGender("girl");
p1.setHeight(175);
p1.setName("xiaowei");
p1.sayHello();
Person p2=new Person();
p2.setAge(18);
p2.setGender("girl");
p2.setHeight(175);
p2.setName("xiaowei");
p2.sayHello();
Person p3=new Person();
p3.setAge(38);
p3.setGender("boy");
p3.setHeight(159);
p3.setName("zhangsan");
p3.sayHello();
System.out.println(p1.isSamePeople(p2));
System.out.println(p2.isSamePeople(p3));
}
}
9 private 和public
类中 成员变量一般用private 成员方法是public
成员变量的值设定或者取得一般用 set 和get public方法
10构造函数
- 构造函数 可以不定义,系统默认有一个无参构造函数。
- 方法名和类名一致,没有返回值
- 构造函数可在类中定义,public Person()
- 构造函数可以重载,多个构造函数,参数类型或者个数不一致
- 如果有有参构造函数,则类默认的无参构造函数不能用,除非新建无参构造函数
- 构造函数一般用来赋初始值
构造函数:可以用来进行初始化值; get set 可以用来改变值。 不矛盾,可以配合使用
//定义类
public class Person {
private int age;
private String name;
// 定义构造函数,与类名相同,无参数
public Person()
{
System.out.println("定义构造函数");
}
// 定义构造函数1,与类名相同,有1个参数
public Person(int age)
{
System.out.println("定义构造函数1");
this.age=age;
}
// 定义构造函数2,与类名相同,有1个参数
public Person(int age,String name)
{
System.out.println("定义构造函数2");
this.age=age;
this.name=name;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return this.age;
}
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
public void sayHello()
{
System.out.println("my name is "+this.name+",我的年龄是"+this.age);
}
}
//定义main函数
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1=new Person();
p1.sayHello();
Person p2=new Person(15);
p2.sayHello();
Person p3=new Person(15,"zhangsan");
p3.sayHello();
}
}
11 JavaBean 规范
- 如果成员变量希望外界赋值,提供set方法
- 如果成员变量希望外界读取,提供get方法
- 类必须是公共类,最多只能有1个public类
- 必须有一个无参的构造函数
- 成员变量private
- boolean 类型成员变量 get方法 可以是is
12 对象和对象之间的关系
- 示例
Dog 类有性别和姓名
Person类 有年龄,身高以及Dog类的对象
Dog
public class Dog {
private String name;
private String sex;
// 无参构造函数
public Dog()
{
}
//set 和get 成员变量
public void setName(String name)
{
this.name=name;
}
public String getName()
{
return this.name;
}
// 利用Source自动生成 成员变量set 和get
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public void sayhello()
{
System.out.println("i am one dog; my name is "+this.name+",my sex is "+this.sex);
}
}
Person
package com.test;
public class Person {
// 定义一个无参构造函数
public Person() {
}
// 定义3个普通成员变量 和 1个Dog 类的变量
private int age;
private int height;
private String name;
private Dog pet;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//set和get类的变量
public void setPet(Dog pet)
{
this.pet=pet;
}
public Dog getPet() {
return this.pet;
}
public void sayhello()
{
if(this.pet==null)
System.out.println("i am sorry");
else
System.out.println("my name is "+this.name+",我的身高是"+this.height+",我的年龄是"+this.age+
"我的宠物名字是"+this.pet.getName()+",我的宠物性别是"+this.pet.getSex());
}
}
Main类
package com.test;
public class Main {
public static void main(String[] args) {
// 初始化人,最好是先初始化狗,为了避免空指针
Person p1=new Person();
p1.setAge(33);
p1.setHeight(180);
p1.sayhello();
//初始化狗 并且赋值
Dog d1=new Dog();
d1.setName("旺财");
d1.setSex("girl");
p1.setPet(d1);
d1.sayhello();
p1.sayhello();
}
}
13 包
- 作用:
不同类放在不同包下面,比较好区分
重名类放在不同的包下面
包名小写
包名:公司名反着写:com.rupeng.crm.usr
类之间互相引用:import com.rupeng.com.*(不推荐)
import com.rupeng.com.Person(推荐)
import static 方法,直接调用:
import static java.lang.Math.abs;
public class Main {
public static void main(String[] args) {
//abs 直接调用,不用写Math
int i=abs(-3);
System.out.println(i);
}
}