java基础-面向对象

一、java基础知识点

1.面向对象的特征:封装,继承,多态

2.成员变量和局部变量的区别

(1)作用域不同,成员的作用于类中,局部的作用于方法或语句(for)

(2)在内存中的位置是不同的,成员的存在于堆内存中,局部的存在于栈内存中。

3.匿名对象

(1)匿名对象是对对象的简化

(2)匿名对象使用场景

        修改匿名对象属性没有任何意义,以后会被垃圾回收器回收。

        匿名对象的方法只会使用一次

        可以将匿名对象作为实际的参数传入

4.构造方法

如果一个类中没有构造方法,系统会默认的给他分配一个无参数的构造方法。但是一旦自己写了构造方法,系统就不会给该对象分配构造方法了。但是为了保险起见,最好在每一个对象中都写一个无参数的构造方法。

5.构造函数与构造代码块的区别

构造函数是给对应的对象初始化,构造代码块是给所有的对象统一初始化。

6.this使用

(1)this代表什么?哪个对象在调用this所在的函数,this就代表哪个对象。

(2)this用于区分成员变量与局部变量同名的情况

(3)一个类中函数之间的调用默认就是使用了this.函数名

(4)this表示构造函数之间的相互调用,this只能出现在构造函数的第一行。普通方法不能通过this调用构造函数

(5)this表示的是内存区

7.static

(1)static是一个修饰符,用来修改成员

(2)static表示的是方法区,共享区

(3)static随着类的加载而加载,静态是优于对象存在的。被所有对象所共有,通过类名调用。

(4)静态方法只能访问静态成员,静态方法不可以使用this,super关键字

(5)static的优点:对象共享,节省空间

(6)static的缺点:生命周期过长,访问有局限性,只能访问静态的

(7)静态的典型使用:工具类,里面的每一个方法是static的,通过类名调用

8.静态代码块是随类加载的

9.静态构造代码块静态构造函数构造代码块构造函数的执行顺序

静态构造代码块>静态构造函数>构造代码块>构造函数

10.Person p = new Person("zhangsan",20)都做了什么?

加载类(.class)--静态属性或成员方法进方法区--加载静态代码块--开辟内存空间--成员属性默认初始化--执行非静态的构造代码块----构造函数的初始化

二、继承

(1)提高代码复用性。使类与类之间有了关系,产生了多态。

(2)java支持单继承,不支持多继承

(3)this表示的是本类,super表示的是父类。super在构造方法中出现在第一行。

(4)子类继承父类,成员变量和函数都会继承(不管是不是static)。同名的可以覆盖,覆盖之后默认调用的是子类的属性和方法,使用super可以调用父类的属性和方法。静态只能覆盖静态。构造函数不存在覆盖。

(5)调用子类的构造函数的时候会先调用父类的构造函数

(6)子类的访问权限不能变小,抛出的异常不能变大

三、抽象

(1)抽象类中可以有构造方法,但是不能用new创建对象

(2)抽象类中可以没有抽象方法

(3)抽象就是希望被子类实现的,所以不能有static,final,private修饰

四、接口

(1)接口中只有常量和抽象方法,没有构造方法

(2)接口可以多继承

五、多态

(1)提高程序的扩展性

(2)Fu fu = new Fu(); Fu fu2 = new Zi();

(3)Fu f = new Zi();

成员变量不管编译期还是运行期看的都是左边。方法编译期看左边,运行期看右边。

六、内部类

(1)内部类可以直接访问外部类的成员,包括私有。因为持有外部类的引用:外部类名.this

(2)外部类要访问内部类,需要建立内部类的对象

(3)在main中非静态内部类使用:Outer.Inner in = new Outer().new Inner()

        在main中静态内部类使用:Outer.Inner in = new Outer. Inner()

使用的例子:

public class Test{
	public static void main(String[] args) {
		//不能直接使用内部类,因为一般非静态的都是依据外部类而存在的
		//下面是使用的格式:左边是内部类的全名,右边表示有了外部类的对象才能有内部类的对象
		Outer.Inner in = new Outer().new Inner();
		in.function();
	}
}
class Outer{
	private int num = 2;
	//private class Inner{内部类可以进行私有化
	class Inner{
		void function(){
			//内部类直接访问外部类的数据,不管是不是私有的
			System.out.println("num = "+num);
			method();
		}
	}
	public void method(){
		//外部类访问内部类需要创建内部类的对象
		Inner in = new Inner();
		in.function();
	}
}

(4)如果内部类中定义了静态成员,那么这个内部类一定是静态的。但是静态的内部类中不一定要有静态成员。但是内部类有static final修饰就是常量的时候内部类就不用是static的了。

(5)private,static,final的使用

只要是处在成员位置上的,包括内部类的成员位置上的都可以使用这三个修饰符。final可以修饰局部的,构造方法只能用private,类只能使用final.

(6)局部内部类访问局部变量的时候,局部变量只能是final的

1. public class AnonymousClass {  

2.     public Object makeInner(String localVal){  

3.         return new Object(){  

4.             private String s = localVal;  

5.             public String toString(){  

6.                 return s;  

7.             }  

8.         };  

9.     }  

10.     public static void main(String[] args) {  

11.         AnonymousClass ac = new AnonymousClass();  

12.         Object ob = ac.makeInner("23");  

13.         System.out.println(o.toString());  

14.     }  

15. }  

      程序new了一个类对象,然后调用了makeInner方法,传递了一个String类型的参数,进入到方法内部,返回了一个内部匿名类。匿名类中成员引用变量s跟参数localVal指向相同的内存地址,并在重写的toString方法中,返回了成员变量s。调用结束,localVal指向的内存空间释放,返回到主程序,调用ob的toString方法,输出s,但是此时的s指向的内存地址已经被释放了,所以程序是不会让你这么干的。所以内部类访问所在方法的参数或局部变量为什么必须是final的,因为方法结束之后他们空间并没有释放,依然是有效的。


















猜你喜欢

转载自blog.csdn.net/zhuixundenvhanzhi/article/details/80087600