1,面向对象,类与对象。
面向对象:三个特征:封装,继承,多态。
在实际开发中,就是在找对象使用,没有对象就去创建一个对象。是一个找对象,建立对象,使用对象。维护对象的关系。
类和对象的关系:
映射到java中,描述就是class定义的类。
具体对象就是对应java在堆内存中用new建立实体。类就是:对现实生活中事物的描述。
对象:就是这类事物,实实在在存在个体。
2.成员变量和局部变量。
A:在类中的位置不同
成员变量:在类中方法外
局部变量:在方法定义中或者方法声明上
B:在内存中的位置不同
成员变量:在堆内存
局部变量:在栈内存
C:生命周期不同
成员变量:随着对象的创建而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
D:初始化值不同
成员变量:有默认初始化值
局部变量:没有默认初始化值,必须定义,赋值,然后才能使用。注:局部变量名称可以和成员变量名称一样,在方法中使用的时候,采用的是就近原则。
3.匿名对象和匿名类。
匿名对象
匿名对象也是Java中比较常见的实例化对象方式,匿名对象的使用情况:
- 当对对象的方法只调用一次时,可以用匿名对象来完成,这样写比较简化。
可以将匿名对象作为实际参数进行传递。
public class Convey {
private Presenter presenter;
public void setiPresenter() {
IPresenter iPresenter = presenter.getiPresenter(new IPresenter() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
}
}
public class Test {
public static void main(String[] args) {
//用匿名对象直接该类的方法
new Convey().setiPresenter();
}
}
匿名类
匿名类(也叫匿名内部类)他是内部类的一种。匿名类在类中只能使用一次,它通常用来简化代码的编写,但使用匿名类还有一个前提条件:它必须继承一个父类或者一个接口,因此这个匿名类会被默认为这个父类或者接口的子类或实现类。如:
//这是一个简单的接口 public interface IPresenter { void run(); } //这是另外一个类 public class Presenter { //使用了接口的对象作为方法的参数,然后返回接口的对象 public IPresenter getiPresenter(IPresenter iPresenter) { return iPresenter; } } //Convey类来操作上面的类和接口 public class Convey { //定义Presenter对象 private Presenter presenter = new Presenter(); public void setiPresenter() { //一个接口的局部变量 IPresenter iPresenter = presenter.getiPresenter(new IPresenter() { //在这里定义一个接口的实现匿名类 @Override public void run() { // 实现接口的方法 } }); } }
4.private
private :私有,权限修饰符:用于修饰类中的成员(成员变量,成员函数)。
私有只在本类中有效。将age私有化以后,类以外即使建立了对象也不能直接访问。
但是人应该有年龄,就需要在Person类中提供对应访问age的方式。注意:私有仅仅是封装的一种表现形式。
之所以对外提供访问方式,就因为可以在访问方式中加入逻辑判断等语句。
对访问的数据进行操作。提高代码健壮性。class Person { private int age; public void setAge(int a) { if(a>0 && a<130) { age = a; speak(); } else System.out.println("feifa age"); } public int getAge() { return age; } private void speak() { System.out.println("age="+age); } }
5.构造函数和构造代码块。
构造函数:
对象一建立就会调用与之对应的构造函数。
构造函数的作用:可以用于给对象进行初始化。
构造函数的小细节:
当一个类中没有定义构造函数时,那么系统会默认给该类加入一个空参数的构造函数。当在类中自定义了构造函数后,默认的构造函数就没有了。
构造函数和一般函数在写法上有不同。在运行上也有不同。
构造函数是在对象一建立就运行。给对象初始化。
而一般方法是对象调用才执行,给是对象添加对象具备的功能。一个对象建立,构造函数只运行一次。
而一般方法可以被该对象调用多次。什么时候定义构造函数呢?
当分析事物时,该事物存在具备一些特性或者行为,那么将这些内容定义在构造函数中。
构造代码块:
构造代码块:在类中没与任何的前缀或后缀,并使用"{}"括起来的代码片段.
作用:给对象进行初始化。
对象一建立就运行,而且优先于构造函数执行。
和构造函数的区别:
构造代码块是给所有对象进行统一初始化,
而构造函数是给对应的对象初始化。
构造代码快中定义的是不同对象共性的初始化内容。
注:编译器是如何处理构造代码块的呢?很简单,编译器会把构造代码块插入到每个构造函数的最前端如果遇到this关键字(也就是构造函数调用自身其他的构造函数时)不插入构造代码块.
应用场景:
1.初始化实例变量:如果每个构造函数都需要初始化变量,即可通过构造代码块来实现.从而取代在每个构造函数调用初始化实例变量的方法.
2.初始化实例环境:一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象的时候创建此场景.
都用了构造代码块的两个特性:1.在每个构造函数中都运行 2.在构造函数中它会首先运行
6.this
this:看上去,是用于区分局部变量和成员变量同名情况。
this:就代表本类的对象,
this代表它所在函数所属对象的引用。
简单说:哪个对象在调用this所在的函数,this就代表哪个对象】
this的应用:当定义类中功能时,该函数内部要用到调用该函数的对象时,这时用this来表示这个对象。
但凡本类功能内部使用了了本类对象,都用this表示。
this语句
this语句 :用于构造函数之间进行互相调用。
this语句只能定义在构造函数的第一行。因为初始化要先执行。
class Person { private String name; private int age; { System.out.println("code run"); } Person() { //this("hah"); System.out.println("person run"); } Person(String name) { //this(); this.name =name; } Person(String name,int age) { //this(name); //this.name = name; this.age = age; } } class PersonDemo4 { public static void main(String[] args) { new Person(); //Person p = new Person("lisi",30); //Person p1 = new Person("lisi2",36); } }
完结