一、面向对象的琐碎知识点
【1】、匿名对象
直接new
语法:
new 类();
示例:
public class Business
{
public void show()
{
System.out.println(“This is show”);
}
public static void main(String[] args)
{
new Business().show();
}
}
【2】、全局变量和局部变量
全局变量:属性就是全局变量又叫成员变量
局部变量:定义在大括号内的变量就是局部变量
成员变量和局部变量的区别
1、作用域不同
局部变量的作用域仅限于定义它的方法或者代码块
成员变量的作用域在整个类内部都是可见的
2、初始值不同
Java会给成员变量一个初始值
引用数据类型:null
char ‘\u0000’
int 0
float 0.0f;
double 0.0d;
long 0L
boolean false
Java不会给局部变量赋予初始值
3、在同一个方法中,不允许有同名局部变量;在不同的方法中,可以有同名局部变量
4、两类变量同名时,局部变量具有更高的优先级
5、他们在内存中存在的区域不一样
成员变量存在于堆内存的对象中
局部变量存在于栈内存的方法中
6、有关初始值的区别
成员变量都有默认的初始值
局部变量没有默认的初始值,定以后必须给初始值
【3】、属性的初始化值
引用数据类型:null
char ‘\u0000’
int 0
float 0.0f;
double 0.0d;
long 0L
boolean false
【4】方法和方法之前的调用
1、对象本身的普通方法
(1)类内部的方法
直接调用
示例:
public class Machine {
public void show()
{
test();
System.out.println("This is show");
}
public void test()
{
System.out.println("This is test");
}
public static void main(String[] args) {
Machine m = new Machine();
m.show();
}
}
(2)不同类之间的方法
首先生成对方个实例,通过实例调用
public class Machine {
public void show()
{
B b=new B();
b.test();
System.out.println("This is show");
}
}
class B{
public void test()
{
System.out.println(“This is test”);
}
}
2、带static的方法
(1)static方法调用static方法
直接调用
public class Machine
{
public static void show()
{
System.out.println(“This is show”);
}
public static void main(String[] args) {
show();
}
}
(2)非static方法调用static方法
可以直接调用
public class Machine
{
public static void show()
{
System.out.println(“This is show”);
}
public void test()
{
show();
}
}
(3)static方法调用非static方法
不能直接调用,必须经过实例化
public class Machine
{
public static void show()
{
Machine m=new Machine();
m.test();
}
public void test()
{
System.out.println(“This is show”);
}
}
二、面向对象的特征
封装、继承、多态
【1】封装
封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问
封装的好处:
1、安全
2、有利于功能的重用
private修饰符:保护属性和方法的安全
注意:
修饰符public 、private只能修饰属性,不能修饰局部变量;修饰符final允许
【2】 数据的封装
1、通过构造方法来操作私有属性
(1)示例1:有如下案例:
public class Book {
private String name;
private float price;
public Book(String _name,float _price)
{
name=_name;
price=_price;
}
public void output()
{
System.out.println(“name: ” + name + “\t” + “price: ” + price);
}
public void change(Book book,String _name,float _price)
{
book.name=_name;
book.price=_price;
}
public static void main(String[] args) {
Book book = new Book(“java8”,88.0f);
book.output();
book.change(book, “spark”, 1000);
book.output();
}
}
(2)示例2:
public class Goods
{
private String goodsID;
private String goodsName;
public Goods(String _goodsID,String _goodsName)
{
goodsID=_goodsID;
goodsName=_goodsName;
}
public void show()
{
System.out.println(“商品编号:”+goodsID);
System.out.println(“商品名称:”+goodsName);
}
public static void main(String[] args)
{
Goods goods = new Goods(“g001”,”book001”);
goods.show();
}
}
this关键字:当前对象
this的案例:
public class Acount {
int count=100;
public Acount createAccount()
{
System.out.println(count++);
return this;
}
public int getAcount()
{
return count;
}
public static void main(String[] args) {
int acount = new Acount().createAccount().createAccount().getAcount();
System.out.println(acount);
}
}
例如:
public class Goods
{
private String goodsID;
private String goodsName;
public Goods(String goodsID,String goodsName)
{
this.goodsID=goodsID;
this.goodsName=goodsName;
}
public void show()
{
System.out.println(“商品编号:”+goodsID);
System.out.println(“商品名称:”+goodsName);
System.out.println(“当前对象是:”+this);
}
public static void main(String[] args)
{
Goods goods1 = new Goods(“g001”,”book001”);
goods1.show();
Goods goods2 = new Goods(“g001”,”book001”);
goods2.show();
}
}
2、通过普通方法来操作封装数据
示例:
//实体类、实体bean
public class Goods
{
private String goodsID;
private String goodsName;
public void initGoodsId(String goodsID)
{
this.goodsID=goodsID;
}
public void initGoodsName(String goodsName)
{
this.goodsName=goodsName;
}
public void show()
{
System.out.println(“商品编号:”+goodsID);
System.out.println(“商品名称:”+goodsName);
}
public static void main(String[] args)
{
Goods goods = new Goods();
goods.initGoodsId(“g001”);
goods.initGoodsName(“book001”);
goods.show();
}
}
规范后的代码如下:
public class Goods
{
private String goodsID;
private String goodsName;
public void setGoodsID(String goodsID)
{
this.goodsID=goodsID;
}
public void setGoodsName(String goodsName)
{
this.goodsName=goodsName;
}
public String getGoodsID()
{
return this.goodsID;
}
public String getGoodsName()
{
return this.goodsName;
}
public static void main(String[] args)
{
Goods goods = new Goods();
goods.setGoodsID("g001");
goods.setGoodsName("book001");
String goodsID=goods.getGoodsID();
System.out.println(goodsID);
String goodsName=goods.getGoodsName();
System.out.println(goodsName);
}
}
习题:设计个学生类,自己设计字段,使用构造方法和get/set给属性赋值,并且打印输出属性的值
三、数据在内存中的体现
栈、堆、数据共享区、方法、常量区
1、堆 :new 出来的数据 对象
2、栈 : 局部变量的数据
3、数据共享区 :static
注意:凡是new 出来的东西在堆区,是一个个新的对象
new 的过程 1、是个开辟空间的过程 2、是一个耗时的操作
证明:
1、System.out.println(new Goods()==new Goods());输出false
2、 System.out.println(new Goods());
System.out.println(new Goods());
输出hashCode不一样
test002.Goods@18a992f
test002.Goods@4f1d0d
3、下列5个对象不是同一个对象
for(int i=0;i<5;i++)
{
Goods lily=new Goods();
System.out.println(lily);
}
可以根据打印的对象的值来判断
test002.Goods@18a992f
test002.Goods@4f1d0d
test002.Goods@1fc4bec
test002.Goods@dc8569
test002.Goods@1bab50a
栈空间举例:
public class Goods
{
public static void main(String[] args)
{
Recursion r=new Recursion();
long num=r.fac(5);
System.out.println(num);
}
}
class Recursion{
public long fac(int n){
if(n==1){
return 1;
}else{
return n*fac(n-1);
}
}
}
5*fac(4)
4*fac(3)
3*fac(2)
2*fac(1)
fac(1)=1