一、匿名对象

概念:匿名对象是指在创建对象时,只有创建的语句,却没有把对象地址值赋给某个变量。

特点:

(1)匿名对象直接使用,没有变量名。当做形参使用。

new Person().name="张三";

(2)匿名对象只能调用一次方法,再次调用相当于又创建了一个新的匿名对象

new Person().setName("小明");
System.out.println(new Person().getName()); //输出为空,因为又创建了一个新的匿名对象,跟上一个并没有关系

(3)作为返回值使用传递

public Person getPerson(){
//Person p=new Person(); //这一步骤省略直接用匿名对象来做返回值
//return p;
return new Person();
}

实例:

package com.oracel.demo03;
//匿名对象 自定义类
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 boolean compare(Person p){
return this.age==p.age;
}
//匿名对象作为返回值来传递
public Person getPerson(){
//Person p=new Person();
//return p;
return new Person();
}
}
package com.oracel.demo03;
//测试类
public class Test {
public static void main(String[] args){
//有名对象
// Person p=new Person();
// p.setName("张三");
// p.getName();
// //匿名对象(只能调用一次方法) new:创建 Person():对象 合起来就是创建对象
// new Person().setName("阿莱");
// System.out.println(new Person().getName());
// //匿名对象当做形参传递
// p.compare(new Person());
//匿名对象的三个作用:1.调用一次方法2.当做形参传递3.作为返回值来传递
}
}

二、内部类

概念:将类写在其他类的内部,可以写在其他类的成员位置或局部位置,称为内部类,而“其他类”则称为外部类。

什么时候会使用?

在描述一个事物时,若事物内部还包含有其他可能包含的事物,比如在描述汽车时,汽车内部还包含着发动机,则发动机就可以用内部类来描述。

格式:

class Car{                      //car      就是外部类
class FaDongJi{ //fadongji 就是内部类
}
}

内部类的分类:

内部类还可以分为成员内部类和局部内部类。成员内部类就是在成员位置的内部类,而局部内部类则是在局部方法内的内部类。

定义内部类时,就是一个正常定义类的过程,同样包含各种修饰符 、继承与实现关系等。在内部类中可以直接访问外部类的所有成员。

2.1成员内部类

定义格式:

 class 外部类名称{
修饰词 class 内部类名称{
}
}

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}

访问方式:

外部类名称.内部类名称   变量名称=new 外部类名称().new 内部类名称();
Car.FaDongJi cf=new Car().new FaDongJi();

2.2局部内部类

定义格式:

class 外部类名称{
public void method(){ //外部类的局部方法
class 局部内部类名称{ //局部内部类 }
}
}

访问方式:在外部类方法中创建局部内部类的对象,进行访问。

package com.oracel.demo03;

public class Jeep {
public void show(){ //外部类的方法
//局部内部类
class gulu{
public void method(){
System.out.println("这是轱辘的方法");
}
}
//局部类访问方法:在外部类方法中,创建内部类对象,进行访问
gulu g=new gulu(); //内部类的对象
g.method();
}
}
//在main方法中,创建外部类对象,调用局部方法,就可以访问局部内部类了
public class demo01{
public static void main(String[] args){
Jeep j=new Jeep();
j.gulu(); }
}

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

概念:最常用到的内部类就是匿名内部类,它是局部内部类的一种。

定义的匿名内部类有两种含义:

(1)临时定义某一指定类型的子类

(2)定义后即刻创建刚刚定义的这个子类的对象

 作用与格式:

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

格式:

new 父类或接口(){
//进行方法重写
};

练习题:编写一个抽象类Phone,两个抽象方法,call()  sendMessage()
      两个子类OldPhone 和 NewPhone , 其中NewPhone想添加一个玩游戏的功能.
      请根据接口的思想实现,并用匿名内部类的方式调用玩游戏的功能.

//父类
package com.oracel.homework; public abstract class Phone {
public abstract void call();
public abstract void sendMessage();
}
//旧手机子类
package com.oracel.homework; public class OldPhone extends Phone{
public void call() {
System.out.println("旧手机打电话");
}
public void sendMessage() {
System.out.println("旧手机发短信");
} }
//接口:玩游戏
package com.oracel.homework; public interface PlayGame{
public abstract void playgames();
}
//新手机子类
package com.oracel.homework; public class NewPhone extends Phone implements PlayGame{
public void call() {
System.out.println("新手机打电话");
}
public void sendMessage() {
System.out.println("新手机发短信");
}
public void playgames(){ }
}
 //测试类
package com.oracel.homework; public class Test { public static void main(String[] args) {
new OldPhone().call();
new OldPhone().sendMessage();
new NewPhone().call();
new NewPhone().sendMessage();
//用匿名内部类 重写方法 输出方法
new NewPhone(){
public void playgames(){
System.out.println("新手机玩游戏");
}
}.playgames(); } }

 三、包的声明和格式

概念:java的包,其实就是我们电脑系统中的文件夹,包里存放的是类文件。

当类文件很多的时候,通常我们会采用多个包进行存放管理他们,这种方式称为分包管理。

在项目中,我们将相同功能的类放到一个包中,方便管理。并且日常项目的分工也是以包作为边界。

类中声明的包必须与实际class文件所在的文件夹情况相一致,即类声明在a包下,则生成的.class文件必须在a文件夹下,否则,程序运行时会找不到类。

 声明格式:

通常使用公司网址反写,可以有多层包,包名采用全部小写字母,多层包之间用”.”连接

package  包名.包名.包名....;

如:Oracle.com包名反写为com.oracle

注意:包的声明,必须在有效代码的第一行!!!!!!!!

 包的访问:

在访问类时,为了能够找到该类,必须使用含有包名的类全名(包名.类名)。

//包名.包名….类名
java.util.Scanner
java.util.Random
com.oracle.Demo
//带有包的类,创建对象格式:包名.类名 变量名 = new包名.类名();
com.oracle.Demo d = new com.oracle.Demo();

前提:包的访问与访问权限密切相关,这里以一般情况来说,即类用public修饰的情况。

类的简化访问:

当我们要使用一个类时,这个类与当前程序在同一个包中(即同一个文件夹中),或者这个类是java.lang包中的类时通常可以省略掉包名,直接使用该类。

Person p=new Person();

当我们要使用的类,与当前程序不在同一个包中(即不同文件夹中),要访问的类必须用public修饰才可访问。

package com.oracle02;
public class Person {}

 四、import导包

概念: 我们每次使用类时,都需要写很长的包名。很麻烦,我们可以通过import导包的方式来简化。

    可以通过导包的方式使用该类,可以避免使用全类名编写(即,包类.类名)。

 格式:

  import     包名.类名;

注意: import导包代码书写的位置:在声明包package后,定义所有类class前,使用导包import包名.包名.类名;

 五、访问修饰符

Java中提供了四中访问权限修饰符:

public        protected      default    private

下图为访问能力:

总结:

(1) 要想仅能在本类中访问使用private修饰;

(2)要想本包中的类都可以访问不加修饰符即可

(3)要想本包中的类与其他包中的子类可以访问使用protected修饰

(4)要想所有包中的所有类都可以访问使用public修饰

 注意:如果类用public修饰,则类名必须与文件名相同。一个文件中只能有一个public修饰的类。

六、代码块

1.局部代码块

定义:局部代码块是定义在方法或语句中

特点:

1).以”{}”划定的代码区域,此时只需要关注作用域的不同即可

2.方法和类都是以代码块的方式划定边界的

2.构造方法块

构造代码块是定义在类中成员位置的代码块

特点:

1).优先于构造方法执行,构造代码块用于执行所有对象均需要的初始化动作

2.每创建一个对象均会执行一次构造代码块

3.静态代码块

定义:静态代码块是定义在成员位置,使用static修饰的代码块。

特点:

1).  它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。

2.  该类第一次创建对象时执行,该类不管创建多少对象,静态代码块只执行一次。

(3).可用于给静态变量赋值,用来给类进行初始化

练习题:

package com.oracel.demo03;
//匿名对象 自定义类
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 boolean compare(Person p){
return this.age==p.age;
}
//匿名对象作为返回值来传递
public Person getPerson(){
//Person p=new Person();
//return p;
return new Person();
}
}

Java学习(匿名对象、内部类、包、import、代码块)的更多相关文章

  1. 匿名对象 构造方法 重载 构造代码块 this 关键字

    一.匿名对象 1.匿名对象 :没有名字对象 2.匿名对象的使用注意点: 1.我们一般不会用匿名对象给属性赋值,无法获取属性值. 2.匿名对象永远都不可能事一个对象. 3.匿名对象的好处 : 书写简单. ...

  2. java全栈day12----final static 匿名对象 内部类 包的声明与访问

    final关键字概念 继承的出现提高了代码的复用性,并方便开发.但随之也有问题,有些类在描述完之后,不想被继承, 或者有些类中的部分方法功能是固定的,不想让子类重写.可是当子类继承了这些特殊类之后, ...

  3. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  4. C#的匿名委托 和 Java的匿名局部内部类

    .NET:C#的匿名委托 和 Java的匿名局部内部类 目录 背景实验备注 背景返回目录 这几天重温Java,发现Java在嵌套类型这里提供的特性比较多,结合自身对C#中匿名委托的理解,我大胆的做了一 ...

  5. Java学习笔记之---内部类

    Java学习笔记之---内部类 (一)成员内部类 内部类在外部使用时,无法直接实例化,需要借助外部类信息才能实例化 内部类的访问修饰符可以任意,但是访问范围会受到影响 内部类可以直接访问外部类的成员, ...

  6. java 创建匿名对象及声明map list时初始化

    java 创建匿名对象 类似于c# 中的 new { a:"aaa",b:"bbb"}; 1 创建匿名对象Object myobj = new Object() ...

  7. java内置锁实现锁住代码块方案(同一个对象或锁住整个类.class)

    我们看一个例子: class Demo { public synchronized void test() { System.out.println("test方法开始执行,当前线程为:&q ...

  8. Java基础之线程——管理线程同步代码块(BankOperation4)

    控制台程序. 除了同步类对象的方法之外,还可以把程序中的语句或代码块制定为synchronized,这种方式更强大,因为可以指定哪个对象从语句或代码块的同步中获益,而不像同步方法那样仅仅是包含代码的对 ...

  9. “全栈2019”Java多线程第二十一章:同步代码块产生死锁的例子

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  10. “全栈2019”Java多线程第十八章:同步代码块双重判断详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. Linux之时间相关操作20170607

    一.Linux常用时间相关函数 -asctime,ctime,getttimeofday,gmtime,localtime,mktime,settimeofday,time asctime       ...

  2. 关于EMGU CV的那些事——1.环境搭建(win8 vs2012 emgucv3.0)

    http://blog.csdn.net/aptx704610875/article/details/46045689 楼主读研阶段研究图像处理,想用C#实现PTAM/PTAMM算法并用UNITY创建 ...

  3. stout代码分析之一:Duration类

    Duration类用于表示时间长度,可精确到纳秒. 代码实现在duration.hpp中,测试代码:duration_tests.cpp 相关api如下: parse, 将字符串转化成Duration ...

  4. Ngingx--location匹配顺序

      location = /  精确匹配 /,后面不能带任何字符 location /     所有地址都是以 / 开头,所以这条规则将会匹配到所有请求.但优先级最低. location /docum ...

  5. (转)C++常见问题: 字符串分割函数 split

    http://www.cnblogs.com/dfcao/p/cpp-FAQ-split.html C++标准库里面没有字符分割函数split ,这可太不方便了,我已经遇到>3次如何对字符串快速 ...

  6. sso单点登录的PHP实现(Laravel框架)

    简单说一下我的逻辑,我也不知道我理解sso对不对. 假如三个站点 a.baidu.com b.baidu.com c.baidu.com a.baidu.com 作为验证用户登录账户. b和c作为客户 ...

  7. 应用于网站导航中的 12 个 jQuery 插件

    当考虑到网页设计时,导航被认为是使网页以用户友好方式展现的一个重要部分.在现代的交互网站中,导航起着至关重要的作用,如果没有正确地处理会影响你网站的访问.适当的导航工具能够帮助用户在网站的不同页面内容 ...

  8. 使用 jQuery 避免鼠标双击

    介绍 当用户双击DOM对象(例如按钮和链接等)时,对于用户交互一直是个麻烦的问题. 幸运的是, jQuery 提供了一个相当棒的解决方法. 那就是.one(). .one()这个方法是做什么的? 它附 ...

  9. 【CodeForces】790 C. Bear and Company 动态规划

    [题目]C. Bear and Company [题意]给定大写字母字符串,交换相邻字符代价为1,求最小代价使得字符串不含"VK"子串.n<=75. [算法]动态规划 [题解 ...

  10. 【BZOJ】3143: [Hnoi2013]游走 期望+高斯消元

    [题意]给定n个点m条边的无向连通图,每条路径的代价是其编号大小,每个点等概率往周围走,要求给所有边编号,使得从1到n的期望总分最小(求该总分).n<=500. [算法]期望+高斯消元 [题解] ...