package test;
public class OOP_01 {
int age ;
public static void main(String[] args) {
OOP_01 o = new OOP_01();
//每new一次就会创建一个全新的对象
OOP_01 o1 = new OOP_01();
//更改o1中的age的值
o1.age = 10;
//打印调用的是o中的age,没有被改变,所以是0
System.out.println(o.age);
//打印的是o1中的age,此时已经被赋值为10
System.out.println(o1.age);
}
}
1.2 javaBean
JavaBean : JavaBean是公共Java类,但是为了编辑工具识别,需要满足至少三个条件:有一个public默认构造器(例如无参构造器,)属性使用public 的get,set方法访问,也就是说设置成private,同时get,set方法与属性名的大小也需要对应。例如属性name,get方法就要写成,public String getName(){},N大写。需要序列化。这个是框架,工具跨平台反映状态必须的最近看
EJB : 在企业开发中,需要可伸缩的性能和事务、安全机制,这样能保证企业系统平滑发展,而不是发展到一种规模重新更换一套软件系统。 然后有提高了协议要求,就出现了Enterprise Bean。EJB在javabean基础上又提了一些要求,当然更复杂了。
POJO : 有个叫Josh MacKenzie人觉得,EJB太复杂了,完全没必要每次都用,所以发明了个POJO,POJO是普通的javabean,什么是普通,就是和EJB对应的。 总之,区别就是,你先判断是否满足javabean的条件,然后如果再实现一些要求,满足EJB条件就是EJB,否则就是POJO。
package test;
public class OOP_03 {
public static void main(String[] args) {
Customer c = new Customer();
c.setAge(18);
c.setName("张三");
System.out.println(c.getName());
System.out.println(c.getAge());
//重新对c赋值为null
c = null;
//Exception in thread "main" java.lang.NullPointerException
//当我们用null值去调用成员属性的时候会报出空指针异常
// System.out.println(c.getAge);
//不会报错是因为i是静态属性,和堆内存没有关系
//当我们使用引用变量调用静态属性的时候,在编译时就会把该变量转换为对应的类名去调用
System.out.println(c.i);
Customer c1 = new Customer();
//不管是不是null,都会转换为类名调用
//所以说静态变量是所有对象共有的属性和值
System.out.println(c1.i);
System.out.println(Customer.i);
}
}
class Customer {
static int i = 1;
private int age;
private String name;
public void setAge(int age_){
age = age_;
}
public void setName(String Name_){
name = Name_;
}
public int getAge(){
return age;
}
public String getName(){
return name;
}
}
1.3 常见异常
//Exception in thread "main" java.lang.NullPointerException
//当我们用null值去调用成员属性的时候会报出空指针异常
1.4 对象调用静态属性public class OOP_03 {
public static void main(String[] args) {
Customer c = new Customer();
c.setAge(18);
c.setName("张三");
System.out.println(c.getName());
System.out.println(c.getAge());
//重新对c赋值为null
c = null;
//Exception in thread "main" java.lang.NullPointerException
//当我们用null值去调用成员属性的时候会报出空指针异常
// System.out.println(c.getAge);
//不会报错是因为i是静态属性,和堆内存没有关系
//当我们使用引用变量调用静态属性的时候,在编译时就会把该变量转换为对应的类名去调用
System.out.println(c.i);
Customer c1 = new Customer();
//不管是不是null,都会转换为类名调用
//所以说静态变量是所有对象共有的属性和值
System.out.println(c1.i);
System.out.println(Customer.i);
}
}
class Customer {
static int i = 1;
private int age;
private String name;
public void setAge(int age_){
age = age_;
}
public void setName(String Name_){
name = Name_;
}
public int getAge(){
return age;
}
public String getName(){
return name;
}
}
1.5 传值和传引用
package test;
public class OOP_04 {
public static void main(String[] args) {
int i = 10;
m1(i);
//此处调用m1方法,但是m1方法中执行完i++之后没有返回值,所以此处还是输出10
System.out.println(i);
System.out.println("===========");
A a = new A(10);
m2(a);
System.out.println(a.age);
}
public static void m1(int i){
i++;
//执行了i++,输出11
System.out.println(i);
}
public static void m2(A a){
//此时执行++的不是i,而是地址为a.age的数值
a.age++;
//打印的也是该地址上的值,所以输出还是11
System.out.println(a.age);
}
}
class A{
int age;
public A(int age_){
age=age_;
}
}
1.6 变量的优先级
当局部变量于静态变量同名时,在方法中局部变量的优先级大于静态变量
public class OOP_05 {
//静态变量和成员变量不可以同名
int a = 1;
//若定义static int a=1;就会报错
static int b = 1;
public static void main(String[] args) {
//一个作用域中不可以有同名的变量
//但是局部变量和静态变量、成员变量同名
int a = 1;
int b = 1;
//当局部变量于静态变量同名时,在方法中局部变量的优先级大于静态变量
System.out.println(b);
//要想使用静态变量,则余姚使用类名区分(相当于地址)
System.out.println(OOP_05.b);
}
}
1.7 如何区分同名的构造方法和成员方法
package test;
public class OOP_06 {
public static void main(String[] args) {
OOP_06 o = new OOP_06();
//因为是构造方法,不能有参数
// OOP_06 o = new OOP_06(11);
}
//没有返回值类型,所以是构造方法
public OOP_06() {
System.out.println("我是构造方法");
}
//有void,说明是没有返回值的成员方法
public void OOP_06(int i) {
System.out.println("我是构造方法");
}
}
2. this
2.1 this是什么
this是每个对象中保存自身内存地址的一个引用类型的成员变量,就相当于我们说“我”一样
2.2 this能干什么this的作用:
1.用在成员方法和构造方法中,可以区分同名的局部变量和成员变量 语法 : this.xxx = xxx;
2.用在某个构造方法中用于重载调用当前类中的其他构造方法,提高代码重用 语法 : this(参数) ; 必须写在构造方法第一行
3. return this; 可以做到链式调用
核心原理 : 前者的返回值,一定是可以调用后者的引用
在一个成员方法中,哪个对象调用的这个方法,this就是哪个对象
public class This_01 {
public static void main(String[] args) {
This_01 t = new This_01(1);
//设置age的值为10
t.setAge(10);
System.out.println(t.age);
}
int age;
//构造方法
public This_01(int age) {
this.age = age;
}
//静态方法
public void setAge(int age) {
this.age = age;
}
}
2.3.2 构造方法重载调用
在构造方法中,使用this(参数)可以重载调用当前类的其他构造方法
但是在重载调用时this必须写在第一行
public class This_02 {
public static void main(String[] args) {
MyDate date1 = new MyDate();
// 新创建的对象默认值都是0,所以是0年0月0日
date1.print();
date1.setYear(2000);
date1.setMonth(1);
date1.setDay(1);
// 2000年1月2日
date1.print();
// 需求 : 创建时间对象的时候,必须有年月日(全参构造)
MyDate date2 = new MyDate(2000,1,1);
// 2000年1月1日
date2.print();
// 需求 : 创建时间对象的时候,可以传入年月日,也可以不传入年月日
// 如果不传递,则默认是 1970年1月1日(一个全参,一个无参)
MyDate date3 = new MyDate();
// 1970年1月1日
date3.print();
}
}
class MyDate {
// 成员变量
private int year;
private int month;
private int day;
//定义全参构造
public MyDate(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
// 定义无参构造
public MyDate() {
// this.year = 1970;
// this.month = 1;
// this.day = 1;
// 重载调用 上面的有参构造,做到代码复用
// 但是 该语句 必须在构造方法第一行
this(1970, 1, 1);
}
// getter/setter
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
// 需求 : 按照指定格式 打印 年月日
public void print() {
System.out.println(year + "年" + month + "月" + day + "日");
}
}
2.3.3 链式调用
package This;
public class This_03 {
public static void main(String[] args) {
//链式调用
This_03 t = new This_03();
t.m1();
t.m2();
// 链式调用
// 前者的返回值,一定是可以调用后者的引用
t.m1().m2();
}
public This_03 m1() {
System.out.println("m1");
return this;
}
public This_03 m2() {
System.out.println("m2");
return this;
}
}
2.3.4 注意
this不能出现在静态方法中
3. static 3.1 static是什么static是个修饰符,用来区分静态和成员
3.2 static能做什么
static : 是个修饰符,用来区分静态和成员
可以修饰三个东西 : 静态变量 , 静态方法 , 静态语句块
public class Static_01 {
public static void main(String[] args) {
System.out.println("main方法");
}
// 如果有多个语句块,则从上往下执行
static {
System.out.println("1");
}
static {
System.out.println("2");
}
}



