【JAVA学习笔记】面向对象基础

栈内存 : 对象

堆内存 :属性

全局变量 :所有的方法

构造方法是在对象实例化时被自动调用

对象实例化需要通过new关键字

对象产生的格式

类 对象名 = new ();

():调用类中的构造方法

Java之中每个类都必须有一个构造方法,如果没有构造方法,则会自动产生一个无参的什么都不做的构造方法,因为所有的对象产生时都必须调用构造方法.

如果程序中已经有构造方法,则不会产生一个什么也不做的无参构造方法.

结论:无论采用哪种方法为类中的属性赋值,最好都通过setter方法,setter方法对输入的内容进行检查,getter方法只是将内容简单的返回.

不定义对象的引用名称,而直接调用这个对象的方法,这个对象就叫做匿名对象,:new Person().shout();

如果对一个对象只需要进行一次方法调用,那么就可以使用匿名对象,我们经常将匿名对象作为实参传递给一个函数调用

记住:往往是作为方法的参数出现

package day_10_10_17; public class OODemo06 { public static void main(String[] args) { //匿名对象new Person("张三",22) System.out.println(new Person("张三",22).shout()); } }


**************************我是分隔线**************************


String是一个类,

String name1 = new String("张三"); // 开辟了两个空间,其中有一个是垃圾空间 String name2 = "张三"; // 开辟了一个空间


两个方法都可以使用,那到底要使用哪种方法呢?

比较两个字符串是否相等,需要equals方法

“==”equals的区别

equals:可以比较内容,是两个字符串内容的比较

==:数值比较,比较的是内存地址的值是否相等

这个字符串到底是什么东西

System.out.println("张三".equals(name1)); //证明了一个字符串就是String类的匿名对象

String的另一个特殊之处:String使用了java中的共享设计模式,

使用Java引用传递的概念

//要回避这种写法 //如果程序中非用使用此种类型的代码,则可以使用StringBuffer代替 //StringBuffer与String的本质区别,在于StringBuffer可以改变 public class OODemo11 { public static void main(String[] args) { String str="A"; for(int i =0;i<100;i++) str +=1; System.out.println(str);//会不停的指向新的堆内存空间,造成性能降低 } }


**************************我是分隔线**************************


this如何去调用属性?

class Person12{ private String name; private int age; public void setName(String name){ this.name=name; } public void setAge(int age){ this.age=age; } public String getName(){ return this.name; } } public class OODemo12 { public static void main(String[] args) { Person12 per=new Person12(); per.setName("张三"); System.out.println(per.getName()); } }


this可以去调用本类中的方法

class Person13{ private String name; private int age; public void setName(String name){ //强调下调用本类中的print方法 this.print(); this.name=name; } public String getName(){ return this.name; } public void print(){ System.out.println("设置内容了"); } } public class OODemo13 { public static void main(String[] args) { Person13 per=new Person13(); per.setName("张三"); System.out.println(per.getName()); } }

this用于构造方法的调用

/* * 程序需要提供一个无参的构造方法,此构造方法用于打印创建person对象的信息 * 程序要再提供一个设置姓名的方法,年龄的默认值为1,但此方法也要打印对象创建信息 * 程序要再再提供一个有两个参数的构造方法,用于设置姓名和年龄,也要打印信息. */ public Person15(){ System.out.println("***创建了一个Person对象***"); } public Person15(String name){ System.out.println("***创建了一个Person对象***"); this.setName(name); this.setAge(1); } public Person15(String name,int age){ System.out.println("***创建了一个Person对象***"); this.setName(name); this.setAge(age); } /* * 发现以上有些代码重复 * 使用this完成构造方法之间的相互调用 */ public Person16(){ System.out.println("***创建了一个Person对象***"); } public Person16(String name){ //调用本类中的无参构造方法 this(); this.setName(name); this.setAge(1); } public Person16(String name,int age){ this(name); this.setAge(age); } /* * 使用this完成构造方法之间的相互调用 */

注意:

构造方法本身必须在首行被调用.为了能够为类中的属性初始化

this调用属性,本类方法,构造方法这三点是this的基本应用,也是最常用的,但是以上三点实际上可以综合成一点à表示当前对象!

class Person17 { private String name; private int age; public Person17(String name, int age) { this.name = name; this.age = age; } public void change(Person17 p){ p.name = "李四"; p.age=50; } public void print() { System.out.println("姓名:" + this.name); System.out.println("年龄:"+this.age); } } public class OODemo17 { public static void main(String[] args) { Person17 p = new Person17("张三", 22); p.change(p); p.print(); } }

this表示当前对象主要应用于一点:用于进行对象的比较

注意点:封装访问

public boolean compare(Person19 p1){ boolean flag=false; Person19 p2=this; if(p1.name.equals(p2.name)&&p1.age==p2.age) flag=true; return flag; }

本章重点:

this关键字的使用:this表示当前对象

<!--[if !supportLists]-->l <!--[endif]-->this 调用本类中的属性

<!--[if !supportLists]-->l <!--[endif]-->this调用本类中的其他方法

<!--[if !supportLists]-->l <!--[endif]-->this调用本类中的其他构造方法,调用时要放在构造方法的首行


**************************我是分隔线**************************

回顾:

栈内存 保存的是对象的名字

堆内存:对象的具体内容(属性)

全局代码区:所有方法

问题?

如果我想表示一个属性,这个属性是所有对象都必须具有的,那该怎么办?

在类中写一个属性,如果使用static声明,则表示此属性为共有属性,:所有对象都可以访问此属性.

全局数据区:存放static类型的属性

对于static类型的变量,最好是通过类名称修改,意味着使用static类型声明的属性或方法可以通过类名称直接调用:

static属性

static方法

静态方法不能调用非静态属性或方法

// static void setName(String n){ // name=n; // } //是错误的

非静态方法可以调用静态属性或方法

String shout(){ return "地区编码:"+code+",姓名:"+name+",年龄:"+age; }

代码块:四种代码块

<!--[if !supportLists]-->l <!--[endif]-->普通代码块: 是写在一个方法之中的语句块

<!--[if !supportLists]-->l <!--[endif]-->构造块: 是直接写在类中的语句块,构造块优先于构造方法先执行,执行多次

<!--[if !supportLists]-->l <!--[endif]-->静态块: 是直接写在类中的,通过static声明的语句块,优先于构造块与构造方法先执行,作用是为静态属性初始化,执行一次

<!--[if !supportLists]-->l <!--[endif]-->同步代码块(多线程):

理解main方法

<!--[if !supportLists]-->l <!--[endif]-->public:
表示此方法为公共的,可以被外部方法.

<!--[if !supportLists]-->l <!--[endif]-->static:
表示此方法为static方法,可以被类名直接调用.

<!--[if !supportLists]-->l <!--[endif]-->void:
表示此方法无返回值

<!--[if !supportLists]-->l <!--[endif]-->main
系统规定的方法名称

<!--[if !supportLists]-->l <!--[endif]-->String args[]
表示运行时参数

类在运行的时候要使用main方法,main方法应该被外部所看见,所以此方法声明为public

程序运行时输入的都是类的名称,证明使用类名称调用方法 à static类型的方法

String args[]:表示运行时输入的参数

参数的输入:java 类名称 参数一,参数二,参数三

编写一个Person,类中的内容有程序运行时输入,Person里面包括一个名称和年龄

方法:能不能使用一个方法将String类型的数据变成int类型,通过包装类

java中有一种思想:一切皆对象,一切的操作都有对象

问题:基本数据类型是对象吗?-->与一切皆对象不相符

提供了一种对于基本数据类型的包装类:8种基本数据类型

类型

包装类

int

Interger

char

Character

float

Float

double

Double

byte

Byte

short

Short

long

Long

boolean

Boolean

将字符串变为整型-->String --> int

Integer.parseInt(String param) -->int类型

System.exit(1); //程序退出,不再向下执行.

问题:不通过main方法,打印出Hello World!!!

提示:使用static


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值