面向对象

一、面向对象的琐碎知识点

【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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值