0125 匿名对象 内部类 包 代码块

1、匿名对象

概念:是指只有创建对象语句,但是没有把对象赋值给某个变量

例:创建一个匿名对象

new Person();

特点:

(1)、创建对象可以直接用,没有变量名

(2)、匿名对象没有指定变量名的时候,只能使用一次

(3)、匿名对象可以作为方法接受参数、方法返回值使用

例:创建一个Person类

public class Person {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Person() {
		super();
	}
	

}

  创建一个测试类

public class Demo01 {

	public static void main(String[] args) {
		new Person().getName();
		get(new Person());
	}
	public static Person get(Person P){
		return new Person();
	}
}

 2、内部类

概念:写在其他类的内部,写在类内部的类叫做内部类,其他的可以叫做外部类。可以写在其他类的成员位置和局部位置,这些局部位置叫局部内部类,成员位置叫成员内部类(其实就是一个正常定义类的过程,包括修饰符继承实现的关系等,在内部类中可以直接访问外部类所有成员)

(1)成员内部类

类似类中的成员变量。

创建格式:

class 外部类 {

    修饰符 class 内部类 {

        //其他代码

}

}

访问格式:

外部类.内部类 变量名=new 外部类().new 内部类();

例:创建一个Outer类,内写一个内部类Inner

//外部类
public class Outer {

	int a=1;
	//内部类
	class Inner{
		int a=2;
		public void in(){
			int a=3;
			System.out.println(a);//3局部变量
			System.out.println(this.a);//2内部类变量
			System.out.println(Outer.this.a);//1外部类成员变量
		}
	}
}

  创建一个测试类

public class Demo02 {

	public static void main(String[] args) {

		Outer.Inner oi=new Outer().new Inner();
		oi.in();
	}

}

(2)局部内部类

局部内部类定义在类中的方法中的类,类似方法中的局部变量

定义格式:

class 外部类 {

    修饰符 返回值类型 方法名(参数) {

class 内部类 {

//其他代码

}

}

}

例:创建一个outer类写一个局部内部类

public class Outer {
	public void out(){
		class Inner{
			public void in(){
				System.out.println("这是内部类方法");
			}
		}
		Inner i=new Inner();
		i.in();
	}

}

  注:上述中的Inner写在了out方法内,所以是个局部内部类,此时只能在这个方法中才能够访问到这个局部内部类,测试时,可以通过创建Outer对象来调用这个out方法 达到访问的目的

3、内部类的实际应用--匿名内部类

概念:定义某一指定类型的子类,定义后即可创建这一子类对象

作用:匿名内部类是创建某个子类对象的快捷方式

格式:

new 父类或接口{

  重写的方法

};

例:创建一个接口

public interface Smoking {

	public abstract void smoke();
}

  创建一个测试类,创建这个接口的子类对象,并且调用方法

public class Demo02 {

	public static void main(String[] args) {
		new Smoking(){
			public void smoke() {
				System.out.println("学生抽烟");
			}		
		}.smoke();
	}

}

  注:既然他是个子类对象,就可以通过.方法名来调用这个方法。

如果这个smoking接口中有两个方法,那我创建子类的时候重写两个方法,怎样实现这两个方法 的调用呢

代码演示

public interface Smoking {

	public abstract void smoke();
	public abstract void drink();
}

  注:此刻这个接口中我创建了两个方法

public class Demo02 {

	public static void main(String[] args) {
                //多态
		Smoking s=new Smoking(){
			public void smoke() {

				System.out.println("学生抽烟");
			}

			public void drink() {

				System.out.println("学生喝酒");
			}
			
		};
		s.smoke();
		s.drink();
	}

}            

  注:我创建的是一个子类对象,我将这个子类对象赋值给父类引用的变量名s,(即,父类引用变量,指向子类对象)这就是运动了多态

4、包

概念,包其实就是文件夹,包里存放的是类文件夹

类中包的声明格式:

package 包名.包名.包名;例:package com.orcale.demo02;

包的反问格式

包名.包名...类名 例:java.util.Scanner;

导包格式:

import 包名.包名..类名 例:import java.util.Scanner;

5、访问修饰符

java中右四大访问修饰符:public protected default(这个是默认的不写)private;

public :在同一类中,同一包中(包含子类,无关类),不同包的子类,不同包的无关类 都可以访问到

protected:在同一类中,同一包中(包含子类,无关类),不同包的子类。可以访问

default:这个是不写的修饰符。只能在同一类中,在同一包中(包含子类,无关类)可以访问

private :只能在本类中才能访问

例:创建一个A类

public class A {

	private int a=1;
	protected int b=2;
	int c=3;
	public int d=4;
	public void a(){
		System.out.println(a);
		System.out.println(b);
		System.out.println(c);
		System.out.println(d);
	}
}

  注:这四种类型,在本类中都可以被访问到

创建一个B类与A在同一个包下,继承A类,再分别访问一下这四个类型

public class B extends A {

	public void get(){
		//System.out.println(a);a是私有权限 只能在本类中访问
		System.out.println(b);
		System.out.println(c);
		System.out.println(d);
	}
}

  注:只有a被private修饰,所以在同一包中(包含子类,无关类)除了私有权限不能被访问外,其他都能访问到

创建一个C类,与A,B 不同包,再来访问一下这四个类型

import com.orcale.demo03.A;

public class C extends A {

	public void get(){
		//System.out.println(a);a是私有权限 只能在本类中访问
		System.out.println(b);
		//System.out.println(c);默认权限只能在本包中访问
		System.out.println(d);
	}
}

  注:首先a有私有权限不能被访问,c是默认的default权限,其不能被不同包访问

创建一个D类与C同包,但与C,A B都没有关系

import com.orcale.demo03.A;

public class D {

	public void get(){
		//System.out.println(a);a是私有权限 只能在本类中访问
		//System.out.println(new A().b);//受保护权限
		//System.out.println(c);默认权限只能在本包中访问
		System.out.println(new A().d);
	}
}

  注:首先a有私有权限不能被访问,b,是受保护权限,不能被不同包的无关类访问c是默认的default权限,其不能被不同包访问

6、代码块

(1)局部代码块

局部代码块时定义在方法或者语句中的,以{}划定的代码区域,只需要关注作用域不同即可,方法和类都是利用代码块来划分界限的

例:

public class Demo01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int a=1;
		{
			int b=2;
			System.out.println(a);
			System.out.println(b);
		}
		System.out.println(a);
		//访问不到里边的System.out.println(b);
	}

}

  注:在大括号外边访问不到大括号内部的b变量

(2)构造代码块

构造代码块定义在类的成员变量位置的代码块

优先于构造方法执行,用于执行所有对象均需要初始化的操作,每创建一个对象就会执行一次构造代码块

例:

public class Person {
//构造代码块
	{
		System.out.println("这是构造代码块");
	}
	public Person(){
		System.out.println("这是构造方法");
	}
}

  

public class Demo02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Person p=new Person();
		Person p2=new Person();
	}

}

  运行结果为:

这是构造代码块
这是构造方法
这是构造代码块
这是构造方法

(3)静态代码块

写在类中成员变量的位置,用static关键字修饰

优先于构造方法试行,当以任意形式使用到该类时使用,无论创建多少个类对象,静态代码块只执行一次

public class Person {
//构造代码块
	{
		System.out.println("这是构造代码块");
	}
	public Person(){
		System.out.println("这是构造方法");
	}
	//静态代码块 优先于构造代码块,以任意形式第一次使用到该类的时候执行
	static{
		System.out.println("这是静态代码块");
	}
}

  还是上方的测试类运行

这是静态代码块
这是构造代码块
这是构造方法
这是构造代码块
这是构造方法

posted @ 2021-01-25 16:23  公雪  阅读(137)  评论(0编辑  收藏  举报